Como faço para construir um iframe com o mesmo domínio que a página no Safari / WebKit
-
21-08-2019 - |
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.
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.