Page 1 of 1

javascript IFRAME

Posted: Wed May 25, 2005 5:30 pm
by Dimitris
Έχω μια σελίδα η οποία έχει ένα iframe το οποίο φορτώνει κάποια άλλη σελίδα. Μπορώ με κάποιον τρόπο να πάρω τα περιεχόμενα της σελίδας που ανοίγει το iframe? Για παράδειγμα θέλω όταν φορτώνει η σελίδα στο iframe να πάρω το τίτλο της και να το βάλω σε μια μεταβλητή.

Posted: Wed May 25, 2005 10:27 pm
by HdkiLLeR
Δώσε λίγες περισσότερες πληροφορίες, το χρησιμοποιείς μόνο html/xhtml; js; κάποια server side γλώσσα php/jsp;

Posted: Wed May 25, 2005 11:02 pm
by Dimitris
Χρησιμοποιώ μόνο xhtml και javascript. Για τη δουλειά που το χρειάζομαι δεν μπορώ να χρησιμοποιήσω κάτι άλλο. Βασικά το πρόβλημα που έχω είναι το εξής: όταν έχεις το iframe και του ορίζεις το src του δίνεις το path στο οποίο βρίσκεται η σελίδα την οποία θέλεις να ανοίξεις. Στην περίπτωση όμως που αυτή η σελίδα δεν υπάρχει τότε σου βγάζει το γνωστό μήνυμα The page cannot be displayed....Θέλω να βρώ έναν τρόπο έτσι ώστε όποτε δεν υπάρχει η σελίδα τότε να μην εμφανίζεται τίποτα μέσα στο iframe. Βασικά δεν γνωρίζω κάποιον τρόπο μέσω javascript να ελέγχεις εαν υπάρχει το αρχείο ή όχι (πχ File.exist("path")) και έτσι σκέφτηκα να διαβάζω τον τίτλο της σελίδας και να κρίνω από εκεί εαν υπάρχει η σελίδα ή όχι ( γιατί πχ όταν δεν βρίσκει την σελίδα τότε σου εμφανίζει μια default η οποία έχει τίτλο <title>Cannot find server</title>). Να σημειώσω ότι το src στο iframe δεν το δίνω με το χέρι αλλά μπαίνει αυτόματα μέσω javascript κάθε φορά που φορτώνεται η σελίδα, οπότε κάθε φορά δεν ξέρω αν υπάρχει το path που μπαίνει στο src ή όχι.
Ελπίζω να έγινα πιο κατανοητός.....

Posted: Thu May 26, 2005 2:46 am
by Skeftomilos
Το ερώτημά σου Dimitris έχει πολύ ενδιαφέρον κι έχει απασχολήσει κι εμένα. Κατά περίεργο τρόπο η JavaScript δεν έχει πρόσβαση στους headers του response του server, και επομένως δεν είναι δυνατή η ανάγνωση του header Status που θα μας απαντούσε εύκολα και αξιόπιστα αν η σελίδα βρέθηκε (200) ή όχι (404). Προσωπικά δε μπορώ να φανταστώ τι προβλήματα ασφάλειας θα μπορούσαν να δημιουργηθούν σε μια τέτοια περίπτωση, αλλά αφήνω κι ένα ενδεχόμενο να υπάρχει τρόπος πρόσβασης και να μην τον γνωρίζω.

Το να διαβάσεις τον τίτλο του iframe είναι μάλλον απλή υπόθεση. Παγίδευσε το συμβάν onload του iframe:

Code: Select all

<iframe onload="iframe_load()"></iframe>
... και στο χειριστή συμβάντος μπορείς να διαβάσεις τον τίτλο ή ότι άλλο θέλεις:

Code: Select all

<script>
  function iframe_load() {
    var s
    s = frames[0].document.documentElement.innerHTML // Ολόκληρος ο HTML κώδικας της σελίδας του iframe.

    s = frames[0].document.title                     // Μόνο ο τίτλος.

    var element = frames[0].document.getElementById("something")
    if (element) s = element.innerHTML               // Κάποιο element της σελίδας με id="something".

    alert(s)
  }
</script>
Για να μην εμφανίζεται τίποτα στη σελίδα, ο απλούστερος τρόπος είναι να κάνεις ξανά redirect στην κενή σελίδα:

frames[0].location.href = "about:blank"

Προϋπόθεση για να έχει πρόσβαση η μία σελίδα στις ιδιότητες της άλλης είναι να ανήκουν και οι δύο στο ίδιο domain. Η JavaScript δεν επιτρέπει cross-domain scripting. Με άλλα λόγια αν η σελίδα του iframe ήρθε από κάποια τυχαία θέση του ιστού ... κλάφτα Χαράλαμπε.

Πάντως όλα αυτά είναι μάλλον μάταια. Έχεις δοκιμάσει να δεις τη σελίδα και με τον Firefox? Αντί για γράμματα σου πετάει ένα popup μήνυμα λάθους που δε μπορείς να εμποδίσεις. Άμα το δεις θα σε πιάσει μελαγχολία.

Μια άλλη ιδέα είναι να μεταφέρεις τον έλεγχο ύπαρξης της σελίδας στον server. Π.χ. μπορείς να έχεις μία δυναμική σελίδα που θα δέχεται ως παράμετρο μία άλλη σελίδα την οποία θα επιστρέφει αν υπάρχει. Αν δηλαδή το URL είναι http://www.foo.com/hub.asp?p=http://www ... mepage.htm η σελίδα hub.asp να επιστρέφει τη σελίδα somepage.htm ή μια κενή αν δεν υπάρχει (empty.htm).

Μια άλλη παλαβή ιδέα είναι να χρησιμοποιήσεις images. Το tag img επιτρέπει εκτός από το onload και το onerror, το οποίο τρέχει αν η εικόνα δε βρεθεί. Αν λοιπόν υπάρχει η δυνατότητα μπορείς να συνοδεύεις κάθε υπαρκτή σελίδα με ένα ομώνυμο image, π.χ. something.htm - something.gif. Ο browser θα ζητά πρώτα την εικόνα και αν βρεθεί (φορτωθεί) θα ζητά την αντίστοιχη σελίδα ξέροντας ότι υπάρχει. Οι εικόνες μπορούν να είναι διάφανα gif 1x1, και το tag img που θα τις δέχεται μπορεί να είναι κρυμμένο (display:none) για να είσαι σίγουρος ότι αυτό το hack δε θα έχει οπτικές παρενέργειες.