2012-02-20 2 views
6

Так я делаю это:getElementsByTagName ('a'); не работает?

var stuff = document.getElementsByTagName('iframe'); 

работает отлично. Тогда я хочу это сделать:

var other = stuff.getElementsByTagName('a'); 

но это не работает. Это заканчивается неопределенным. Я могу сделать:

var other = document.getElementsByTagName('a'); 

и все в порядке. Должен ли я не получить все «а» в «iframe»?

Редактировать: Таким образом, я не являюсь владельцем iframe, и теперь у меня создается впечатление, что я не могу получить доступ к чему-либо, генерирующему iframe, что означает, что я думаю, что я ввернута.

+0

У вас есть iframe? – Anurag

+0

@ Анураг Нет. Я видел, как кто-то опубликовал ответ, говорящий, что вы не можете получить доступ к этой информации из-за безопасности браузера, но они удалили ее. Я думаю, вы можете получить доступ только к фактической части iframe, и любой контент, который он создает, не работает? – townie

ответ

2

getElementsByTagName возвращает массив соответствующих элементов. Для доступа к индивидуальному IFRAME вы, например, используете stuff[0].

10

использование ..

var iframe = document.getElementsByTagName('iframe')[0], 
    iframeDoc = iframe.contentWindow.document; 

Specification.

Затем вы можете позвонить по телефону getElementsByTagName('a') по телефону iframeDoc. Кроме того, вы можете получить доступ к iframeDoc.links, что не совсем то же самое, но может быть тем, что вы хотите.

Конечно, все это зависит от доступа к iframe's document, не нарушающего Same Origin Policy.

+1

Это правильно. getElementsByTagName - это метод в документе, а не по ссылке. То, как вы пытаетесь это сделать, вы (городка) пытаетесь сделать, это сортировать детей тега. – Chris

+3

Учитывая, что 'iframe.contentDocument' не работает в IE <8, я бы предпочел использовать только' iframe.contentWindow.document', который работает над перекрестным браузером. Нет никакой пользы при первой попытке использовать contentDocument - только код будет длиннее. –

+1

@ReneSaarsoo Да, я подумал, что, может быть, вторым был пристойный способ IE, но спецификация упоминает обоим. Я исправлю это :) – alex

4

getElementsByTagName() возвращает NodeList, который вам нужно будет перебрать. Чтобы перебрать его, вы можете сделать:

for (var i = 0; i < stuff.length; i++) { 
    var other = stuff[i].getElementsByTagName('a'); 
} 

Однако getElementsByTagName('a') просит детей внутри текущего документа, который почти наверняка не то, что вы хотите. Если вы хотите ребенок внутри документа в кадре, вам необходимо сделать следующее:

for (var i = 0; i < stuff.length; i++) { 
    var other = stuff[i].contentWindow.document.getElementsByTagName('a'); 
} 

Это будет работать, если у вас есть несколько плавающих фреймов, а в более старых версиях IE.

+4

Это не массив. Это список узлов. –

+0

@MikeSamuel Совершенно верно :) –

3
stuff[0].contentWindow.document.getElementsByTagName('a') 

должен создать объект, подобный массиву, содержащий все ссылки в нулевом iframe.

Вам необходимо использовать contentWindow.document, потому что не содержит узлов в текущем документе - это кадр, свойство которого contentWindow указывает на другое окно со своим собственным документом.

0

Почему все предлагают contentWindow.document, если вы можете просто использовать contentDocument?

Конечно, оба работают, но я предпочитаю использовать то, что я имею в виду. Если я хочу окно, я использую contentWindow. Если мне нужен документ, я использую contentDocument.

+0

Видимо, он не работает alex

Смежные вопросы