У 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:
При изменении размера текста в меню «Вид» размеры текста в фреймах корректно изменяются. Однако этот браузер не изменяет разрывы строк в исходном тексте, поэтому часть текста может стать невидимой, или же могут произойти разрывы строк, в то время как строка может содержать еще одно слово.