У Quirksmode был пост об этом .
Поскольку страница теперь повреждена и доступна только через archive.org, я воспроизвел ее здесь:
IFrames
На этой странице я даю краткий обзор доступа к фреймам со страницы, на которой они находятся. Не удивительно, что есть некоторые соображения браузера.
Iframe - это встроенный фрейм, фрейм, который, хотя и содержит совершенно отдельную страницу со своим собственным URL, тем не менее размещается внутри другой HTML-страницы. Это дает очень хорошие возможности в веб-дизайне. Проблема в том, чтобы получить доступ к iframe, например, чтобы загрузить в него новую страницу. Эта страница объясняет, как это сделать.
Рамка или объект?
Основной вопрос заключается в том, рассматривается ли iframe как рамка или как объект.
- Как объяснялось на страницах Введение в фреймы , если вы используете фреймы, браузер создает для вас иерархию фреймов (
top.frames[1].frames[2]
и тому подобное). Вписывается ли iframe в эту иерархию фреймов?
- Или браузер видит в iframe просто еще один объект, объект, который имеет свойство src? В этом случае мы должны использовать стандартный вызов DOM (например,
document.getElementById('theiframe'))
для доступа к нему. В общем, браузеры допускают оба представления «реальных» (жестко запрограммированных) фреймов, но сгенерированные фреймы не могут быть доступны как фреймы.
Атрибут NAME
Самое важное правило - указывать любой iframe, который вы создаете name
, даже если вы также используете id
.
<iframe src="iframe_page1.html"
id="testiframe"
name="testiframe"></iframe>
Большинству браузеров нужен name
атрибут, чтобы сделать iframe частью иерархии фреймов. Некоторые браузеры (особенно Mozilla) нуждаются в том, id
чтобы сделать iframe доступным как объект. Присваивая оба атрибута iframe, вы сохраняете свои опции открытыми. Но name
гораздо важнее, чем id
.
Доступ
Либо вы получаете доступ к iframe как объекту и меняете его, src
либо вы получаете доступ к iframe как кадру и изменяете его location.href
.
document.getElementById ('iframe_id'). src = 'newpage.html'; frames ['iframe_name']. location.href = 'newpage.html'; Синтаксис фрейма немного предпочтительнее, потому что Opera 6 поддерживает его, но не объектный синтаксис.
Доступ к фрейму
Так что для полного кросс-браузерного опыта вы должны дать iframe имя и использовать
frames['testiframe'].location.href
синтаксис. Насколько я знаю, это всегда работает.
Доступ к документу
Доступ к документу внутри iframe довольно прост при условии, что вы используете name
атрибут. Чтобы подсчитать количество ссылок в документе в iframe, сделайте
frames['testiframe'].document.links.length
.
Сгенерированные фреймы
Когда вы генерируете iframe через W3C DOM, iframe не сразу вводится в frames
массив, и frames['testiframe'].location.href
синтаксис не будет работать сразу. Браузеру нужно немного времени, прежде чем iframe появится в массиве, время, в течение которого ни один скрипт не может быть запущен.
document.getElementById('testiframe').src
Синтаксис отлично работает в любых обстоятельствах.
target
Атрибут ссылка не работает , либо с сгенерированных фреймов, за исключением Opera, даже если я дал сгенерированный IFrame как на name
и id
.
Отсутствие target
поддержки означает, что вы должны использовать JavaScript для изменения содержимого сгенерированного iframe, но так как вам все равно нужен JavaScript для его генерации, я не вижу в этом особой проблемы.
Размер текста в фреймах
Любопытная ошибка только в Explorer 6:
При изменении размера текста в меню «Вид» размеры текста в фреймах корректно изменяются. Однако этот браузер не изменяет разрывы строк в исходном тексте, поэтому часть текста может стать невидимой, или же могут произойти разрывы строк, в то время как строка может содержать еще одно слово.