2009-12-08 5 views
2

Dans le code suivant, l'alerte fonctionne correctement et imprime "DIV: IFRAME" comme il se doit, mais il indique ensuite que cNs [1] .childNodes [1] .document n'a aucune propriété.accès iframe avec DOM

Html:

<div id="WinContainer"> 
<div style="display: none;"><iframe id="frame1" name="frame1"></iframe></div> 
<div style="display: none;"><iframe id="frame2" name="frame2"></iframe></div> 
</div> 

JavaScript:

var cNs = document.getElementById('WinContainer').childNodes; 
alert(cNs[1].tagName + ' : ' + cNs[1].childNodes[1].tagName); 
cNs[1].childNodes[1].document.location = 'someurl.pl'; 

mais si je fais ceci:

frame1.document.location = 'someurl.pl'; 

il fonctionne très bien.

+1

Votre code ne fait pas d'alerte "DIV: IFRAME". Voir http://jsbin.com/owofo/edit cNs [1] .childNodes [1] est null. –

+0

IE et Firefox les indexent différemment – user105033

+0

@unknown: pas avec le balisage dans la question. 'cNs [1] .childNodes [1]' est stocké dans tous les navigateurs, car vous ne disposez d'aucun espace entre les balises. –

Répondre

5

Le noeud DOM iframe possède une propriété appelée contentDocument qui correspond à document, mais pour iframe.

Si la page affichée est sur un autre serveur (ou même sur un port différent sur le même serveur), vous obtiendrez une exception de sécurité essayant d'y accéder.

Vous ne savez pas si cela fonctionne pour IE.

+0

Pourquoi frame1.document.location fonctionne-t-il bien alors? – user105033

+0

frame1.document.location fonctionne parce que vous modifiez l'emplacement du cadre sans pouvoir en lire quoi que ce soit. Par exemple, vous pouvez avoir un grand iframe qui a chargé Facebook ou Myspace lorsque vous avez cliqué sur un bouton, mais le javascript peut ne pas avoir accès au contenu de l'un ou l'autre, car il pourrait voler vos données personnelles. –

+0

contentDocument est également null – user105033

0

Je ne connais pas très bien javascript mais il semble que vous n'utilisiez pas correctement les cNs. Il semble que ce soit un tableau contenant les nœuds enfants et le code

cNs[1].childNodes[1].document.location = 'someurl.pl'; 

tente d'obtenir les nœuds enfants qui n'existent pas. Essayez ceci cela pourrait fonctionner.

cNs[1].document.location = 'someurl.pl'; 
0

EDIT: frame1 doit être:

cNs[0].childNodes[0].document.location

Rappelez-vous que les choses sont 0 indexées.

+0

dans IE cela fonctionne, dans firefox mes éléments sont indexés à 1,1 pas 0,0 – user105033

+0

Découvrez http://www.quirksmode.org/js/detect.html pour un tutoriel rapide sur la détection de navigateur si les choses sont indexées différemment. –

0

Vous pouvez également faire référence à la fiable contentWindow propriété pour obtenir à l'objet de document qui iFrame en tant que tel:

cNs[0].childNodes[0].contentWindow.document