Dê uma olhada neste HTML simples:
<div id="wrap1">
<iframe id="iframe1"></iframe>
</div>
<div id="warp2">
<iframe id="iframe2"></iframe>
</div>
Digamos que eu queira mover os envoltórios para que o #wrap2
seja antes do #wrap1
. Os iframes são poluídos por JavaScript. Estou ciente de jQuery's .insertAfter()
e .insertBefore()
. No entanto, quando eu os uso, o iFrame perde todas as variáveis e eventos HTML e JavaScript.
Digamos que o seguinte fosse o HTML do iframe:
<html>
<head>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
// The variable below would change on click
// This represents changes on variables after the code is loaded
// These changes should remain after the iFrame is moved
variableThatChanges = false;
$(function(){
$("body").click(function(){
variableThatChanges = true;
});
});
</script>
</head>
<body>
<div id='anything'>Illustrative Example</div>
</body>
</html>
No código acima, a variável variableThatChanges
... mudaria se o usuário clicasse no corpo. Esta variável, e o evento de clique, devem permanecer após o iFrame ser movido (junto com quaisquer outras variáveis / eventos que foram iniciados)
Minha pergunta é a seguinte: com JavaScript (com ou sem jQuery), como posso mover os nós de wrap no DOM (e seus filhos iframe) para que a janela do iframe permaneça a mesma e os eventos / variáveis / etc do iframe permaneçam os mesmo?
fonte
inline-block
exibição ... neste ponto, estou supondo uma solução genérica (ou efetivamente a afirmação de que tal é impossível) seria mais apropriado, dado o interesse de outros.Respostas:
Não é possível mover um iframe de um lugar no dom para outro sem recarregar.
Aqui está um exemplo para mostrar que mesmo usando JavaScript nativo, os iFrames ainda recarregam: http://jsfiddle.net/pZ23B/
fonte
about:blank
, mas o que me importa é perder o conteúdo dentro do quadro.$("#iframeid").contents()
mas isso não obterá dados javascript armazenados, ele teria que ser enviado para a página pai pelo iframe. (Ou a página pai teria que pegá-lo de o iframe)Muitas pesquisas nas especificações w3 / dom e não encontrei nada final que diga especificamente que o iframe deve ser recarregado enquanto se move na árvore DOM, no entanto, encontrei muitas referências e comentários no trac / bugzilla / microsoft do webkit sobre comportamento diferente muda ao longo dos anos.
Espero que alguém encontre algo específico sobre esse problema, mas por enquanto, aqui estão minhas conclusões:
appendChild(node)
do nó existente - quenode
primeiro é removido do dom.Coisa interessante aqui -
IE<=8
não recarregue o iframe - este comportamento é (um pouco) novo (desdeIE>=9
).De acordo com o comentário de Hallvord RM Steen , esta é uma citação das especificações do iframe
Esta é a coisa mais próxima que encontrei nas especificações, no entanto, ainda requer alguma interpretação (já que quando movemos o
iframe
elemento no DOM, não fazemos um fullremove
, mesmo se o navegador usar onode.removeChild
método).fonte
Sempre que um iframe é anexado e tem um atributo src aplicado, ele dispara uma ação de carregamento de forma semelhante ao criar uma tag de imagem via JS. Portanto, quando você os remove e os anexa, eles são entidades completamente novas e são atualizados. É uma espécie de como
window.location = window.location
recarregar uma página.A única maneira que conheço de reposicionar
iframes
é via CSS. Aqui está um exemplo que criei mostrando uma maneira de lidar com issoflex-box
: https://jsfiddle.net/3g73sz3k/15/A ideia básica é criar um
flex-box
wrapper e, em seguida, definir uma ordem específica para os iframes usando o atributo order em cada wrapper de iframe.Como você pode ver no violino JS, esses
order
estilos são embutidos para simplificar oflip
botão, então gire oiframes
.Eu obtive a solução desta questão StackOverflow: Trocar posição DIV com CSS apenas
Espero que ajude.
fonte
Se você criou o iframe na página e simplesmente precisa mover sua posição mais tarde, tente esta abordagem:
Anexe o iframe ao corpo e use um índice z alto e alto, esquerdo, largura e altura para colocar o iframe onde quiser.
Até o zoom CSS funciona no corpo sem recarregar, o que é incrível!
Eu mantenho dois estados para meu "widget" e ele é injetado no local no DOM ou no corpo usando este método.
Isso é útil quando outro conteúdo ou bibliotecas irão esmagar ou esmagar seu iFrame.
ESTRONDO!
fonte
Infelizmente, a
parentNode
propriedade de um elemento HTML DOM é somente leitura. Você pode ajustar as posições dos iframes, é claro, mas não pode alterar sua localização no DOM e preservar seus estados.Veja este jsfiddle que criei que fornece uma boa base de teste. http://jsfiddle.net/RpHTj/1/
Clique na caixa para alternar o valor. Clique em "mover" para executar o javascript.
fonte
Esta pergunta é muito antiga ... mas encontrei uma maneira de mover um iframe sem recarregar. CSS apenas. Tenho vários iframes com streams de câmera, não gosto quando eles recarregam quando eu os troco. Então eu usei uma combinação de float, position: absolute e alguns blocos fictícios para movê-los sem recarregá-los e ter o layout desejado sob demanda (redimensionamento e tudo).
fonte
Em resposta à recompensa que @djechlin colocou sobre esta questão, eu fiz um bifurcação no jsfiddle postado por @ matt-h e cheguei à conclusão de que isso ainda não é possível.
http://jsfiddle.net/gr3wo9u6/
fonte
Se você estiver usando o iframe para acessar as páginas que você controla, pode criar algum javascript para permitir que seus pais se comuniquem com o iframe via postMessage
A partir daí, você pode construir o login dentro do iframe para registrar as mudanças de estado e, antes de mover o dom, solicitá-lo como um objeto json.
Depois de movido, o iframe será recarregado, você pode passar os dados de estado para o iframe e a escuta do iframe pode analisar os dados de volta ao estado anterior.
fonte