2009-12-08 8 views
2

В следующем коде предупреждение работает нормально и печатает «DIV: IFRAME», как и следовало, однако, он сообщает, что cNs [1] .childNodes [1] .document не имеет свойств.Доступ к iframe с 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'; 

НО, если я это сделать:

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

он работает отлично.

+1

Ваш код на самом деле не предупредит «DIV: IFRAME». См. Http://jsbin.com/owofo/edit cNs [1] .childNodes [1] - null. –

+0

IE и firefox индексируют их по-разному – user105033

+0

@unknown: не с разметкой в ​​вопросе. 'cNs [1] .childNodes [1]' borked во всех браузерах, так как у вас нет пробелов между метками. –

ответ

5

iframe DOM-узел имеет свойство, называемое contentDocument, которое будет эквивалентно document, но для этого iframe.

Если отображаемая страница находится на другом сервере tho (или даже на другом порту на том же сервере), вы получите исключение безопасности, пытающееся получить к нему доступ.

Не уверен, что это работает для IE.

+0

Почему функция frame1.document.location работает нормально? – user105033

+0

frame1.document.location работает, потому что вы меняете местоположение фрейма, не имея возможности читать что-либо из него. Например, у вас может быть большой iframe, который загружал либо Facebook, либо Myspace, когда вы нажимали кнопку, но у javascript, возможно, также нет доступа к содержимому, поскольку он может украсть ваши личные данные. –

+0

contentDocument также null – user105033

0

Я не так хорошо знаком с javascript, но похоже, что вы неправильно используете cNs. Похоже, что это массив, содержащий дочерние узлы, и код

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

пытается получить дочерние узлы, которых не существует. Попробуйте это, возможно, это сработает.

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

EDIT: frame1 должно быть:

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

Помните, что вещи 0 индексируются.

+0

в IE это работает, в firefox мои элементы индексируются в 1,1 не 0,0 – user105033

+0

Ознакомьтесь с http://www.quirksmode.org/js/detect.html для быстрого изучения браузера если вещи индексируются по-разному. –

0

Вы можете также ссылаться на надежную contentWindow свойство, чтобы добраться до объекта документа, который IFrame как таковой:

cNs[0].childNodes[0].contentWindow.document 
Смежные вопросы