Pergunta

A cena : Eu estou escrevendo um widget embutido. Ele toma a forma de um tag <script>, que constrói um iframe que contém tudo o que precisa para exibir. O iframe não tem src, eo script escreve a ele com theIframe.contentWindow.document.write(). Isso mantém o widget contido, e mantém ids de elemento e roteiro de entrar em conflito com a página em que o widget é incorporado.

O truque : O widget tem que ser capaz de mudar o seu tamanho. Para fazer isso, ele define style.height sua contendo do iframe. Isto requer acesso ao DOM da página externa. Em Firefox e IE , isso é permitido, porque o documento do iframe eo documento exterior são considerados para compartilhar uma origem.

A torção : Em Safari , no entanto, os dois documentos são considerados não para compartilhar uma origem. O documento interior é considerada como sendo a about:blank, enquanto o documento exterior é claramente utilizando um protocolo diferente e "domínio" (se blank pode ser considerado o domínio).

A questão :? Como posso construir um iframe programaticamente cujo documento Safari / WebKit irá considerar ter a mesma origem que o documento da janela de criá-lo


Editar :. Depois de mais experimentação, não consigo encontrar uma maneira de programaticamente criar um iframe cuja localização não é about:blank independentemente de eu mudar o seu conteúdo

Se eu criar o quadro com document.createElement(), dar-lhe um src que aponta para um recurso HTML real sobre a mesma origem chamado "foo.html", e document.body.appendChild()-lo, console mostra do Safari o elemento como esperado no DOM, mas a conteúdo da página não aparecem, e o documento é listado na barra lateral como "about: blank".

Se eu incluir o HTML para o iframe diretamente na página, o conteúdo do foo.html aparecer, e "foo.html" aparece na barra lateral.

Se eu inserir o código HTML usando document.write(), eu obter o mesmo resultado como com document.body.appendChild().

Ambas as versões programáticas funciona no Firefox.

Foi útil?

Solução 2

Aha. Este parece ser um bug no WebKit. Quando um iframe é criado por meio de programação, seu atributo src é ignorado. Em vez disso, os padrões de quadro para about:blank e deve ser direcionado para um URL para apontar para outro lugar. Por exemplo:

theIframe.contentWindow.location = theIframe.src

Outras dicas

A melhor sugestão que eu poderia dar é ter o conjunto iframe a uma página em branco no mesmo servidor (ou seja blank.html) e, em seguida, editar o conteúdo. A dor na parte traseira, eu sei, mas é uma solução alternativa.

Você também pode tentar

iframe.contentDocument.open("replace");
iframe.contentDocument.write("<b>This is some content</b>");
iframe.contentDocument.close();

No entanto, eu não tenho certeza se isso só funciona no IE. Desculpe eu não poderia ser mais útil do que isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top