Quirksmode tinha um post sobre isso .
Como a página agora está quebrada e acessível apenas via archive.org, eu a reproduzi aqui:
IFrames
Nesta página, dou uma breve visão geral do acesso a iframes na página em que estão. Não é de surpreender que haja algumas considerações sobre o navegador.
Um iframe é um quadro embutido, um quadro que, embora contenha uma página completamente separada com sua própria URL, é colocado dentro de outra página HTML. Isso oferece possibilidades muito agradáveis em web design. O problema é acessar o iframe, por exemplo, para carregar uma nova página nele. Esta página explica como fazê-lo.
Moldura ou objeto?
A questão fundamental é se o iframe é visto como um quadro ou como um objeto.
- Conforme explicado nas páginas Introdução aos quadros , se você usar quadros, o navegador criará uma hierarquia de quadros para você (
top.frames[1].frames[2]
e tal). O iframe se encaixa nessa hierarquia de quadros?
- Ou o navegador vê um iframe apenas como outro objeto, um objeto que possui uma propriedade src? Nesse caso, temos que usar uma chamada DOM padrão (como
document.getElementById('theiframe'))
acessá-la. Em geral, os navegadores permitem ambas as visualizações em iframes 'reais' (codificados)), mas os iframes gerados não podem ser acessados como quadros.
Atributo NAME
A regra mais importante é fornecer qualquer iframe que você criar um name
atributo, mesmo se você também usar um id
.
<iframe src="iframe_page1.html"
id="testiframe"
name="testiframe"></iframe>
A maioria dos navegadores precisa do name
atributo para tornar o iframe parte da hierarquia de quadros. Alguns navegadores (principalmente o Mozilla) precisam id
tornar o iframe acessível como um objeto. Ao atribuir os dois atributos ao iframe, você mantém suas opções em aberto. Mas name
é muito mais importante que id
.
Acesso
Você acessa o iframe como um objeto e altera o seu src
ou acessa o iframe como um quadro e altera o seu location.href
.
document.getElementById ('iframe_id'). src = 'newpage.html'; frames ['iframe_name']. location.href = 'newpage.html'; A sintaxe do quadro é um pouco preferível porque o Opera 6 suporta, mas não a sintaxe do objeto.
Acessando o iframe
Portanto, para uma experiência completa em vários navegadores, você deve dar um nome ao iframe e usar o
frames['testiframe'].location.href
sintaxe. Tanto quanto sei, isso sempre funciona.
Acessando o documento
O acesso ao documento dentro do iframe é bastante simples, desde que você use o name
atributo Para contar o número de links no documento no iframe, faça
frames['testiframe'].document.links.length
.
Iframes gerados
Porém, quando você gera um iframe por meio do DOM do W3C, o iframe não é inserido imediatamente na frames
matriz e a frames['testiframe'].location.href
sintaxe não funciona imediatamente. O navegador precisa de um tempo para que o iframe apareça na matriz, tempo durante o qual nenhum script pode ser executado.
A document.getElementById('testiframe').src
sintaxe funciona bem em todas as circunstâncias.
O target
atributo de um link também não funciona com iframes gerados, exceto no Opera, mesmo que eu tenha dado ao iframe gerado a name
e an id
.
A falta de target
suporte significa que você deve usar o JavaScript para alterar o conteúdo de um iframe gerado, mas como você precisa do JavaScript para gerá-lo em primeiro lugar, não vejo isso como um problema.
Tamanho do texto em iframes
Um curioso bug do Explorer 6:
Quando você altera o tamanho do texto no menu Exibir, os tamanhos de texto em iframes são alterados corretamente. No entanto, este navegador não altera as quebras de linha no texto original, para que parte do texto fique invisível ou quebras de linha possam ocorrer enquanto a linha ainda pode conter outra palavra.