Eche un vistazo a este sencillo HTML:
<div id="wrap1">
<iframe id="iframe1"></iframe>
</div>
<div id="warp2">
<iframe id="iframe2"></iframe>
</div>
Digamos que quería mover las envolturas para que #wrap2
estuvieran antes de #wrap1
. Los iframes están contaminados por JavaScript. Soy consciente de jQuery .insertAfter()
y .insertBefore()
. Sin embargo, cuando los uso, el iFrame pierde todos sus eventos y variables HTML y JavaScript.
Digamos que lo siguiente fue el HTML de 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>
En el código anterior, la variable variableThatChanges
... cambiaría si el usuario hiciera clic en el cuerpo. Esta variable y el evento de clic deben permanecer después de mover el iFrame (junto con cualquier otra variable / evento que se haya iniciado)
Mi pregunta es la siguiente: con JavaScript (con o sin jQuery), ¿cómo puedo mover los nodos de envoltura en el DOM (y sus hijos iframe) para que la ventana de iFrame permanezca igual, y los eventos / variables / etc. de iFrame permanezcan como ¿mismo?
fuente
inline-block
pantalla ... en este punto, supongo que una solución genérica (o efectivamente la afirmación de que eso es imposible) sería lo más apropiado, dado el interés de los demás.Respuestas:
No es posible mover un iframe de un lugar a otro en el dom sin que se vuelva a cargar.
Aquí hay un ejemplo para mostrar que incluso usando JavaScript nativo, los iFrames aún se recargan: http://jsfiddle.net/pZ23B/
fuente
about:blank
, pero lo que sí me importa es perder el contenido dentro del marco.$("#iframeid").contents()
sin embargo, eso no obtendrá datos de JavaScript almacenados, el iframe tendría que enviarlo a la página principal. (O la página principal tendría que tomarlo de el iframe)Realicé muchas búsquedas en las especificaciones de w3 / dom y no encontré nada final que diga específicamente que el iframe debe recargarse mientras se mueve en el árbol DOM, sin embargo, encontré muchas referencias y comentarios en el webkit's trac / bugzilla / microsoft con respecto a diferentes cambios de comportamiento a lo largo de los años.
Espero que alguien encuentre algo específico con respecto a este tema, pero por ahora aquí están mis hallazgos:
appendChild(node)
de un nodo existente,node
primero se elimina del dom.Algo interesante aquí -
IE<=8
no recargué el iframe - este comportamiento es (algo) nuevo (desdeIE>=9
).Según el comentario de Hallvord RM Steen , esta es una cita de las especificaciones de iframe
Esto es lo más cercano que encontré en las especificaciones, sin embargo, todavía requiere cierta interpretación (ya que cuando movemos el
iframe
elemento en el DOM realmente no lo hacemos por completoremove
, incluso si los navegadores usan elnode.removeChild
método).fuente
Siempre que se agrega un iframe y se le aplica un atributo src, se activa una acción de carga de manera similar a cuando se crea una etiqueta de imagen a través de JS. Entonces, cuando los elimina y luego los agrega, son entidades completamente nuevas y se actualizan. Es como
window.location = window.location
volver a cargar una página.La única forma que conozco de reposicionar
iframes
es a través de CSS. Aquí hay un ejemplo que reuní que muestra una forma de manejar esto conflex-box
: https://jsfiddle.net/3g73sz3k/15/La idea básica es crear un
flex-box
contenedor y luego definir un orden específico para los iframes utilizando el atributo de orden en cada contenedor de iframe.Como puede ver en el violín JS, estos
order
estilos están en línea para simplificar elflip
botón, así que gire eliframes
.Obtuve la solución de esta pregunta de StackOverflow: intercambie la posición DIV solo con CSS
Espero que ayude.
fuente
Si ha creado el iFrame en la página y simplemente necesita mover su posición más tarde, pruebe este enfoque:
Agregue el iFrame al cuerpo y use un índice Z alto y arriba, izquierda, ancho, alto para colocar el iFrame donde desee.
Incluso el zoom CSS funciona en el cuerpo sin recargar, ¡lo cual es increíble!
Mantengo dos estados para mi "widget" y se inyecta en su lugar en el DOM o en el cuerpo usando este método.
Esto es útil cuando otros contenidos o bibliotecas aplastan o aplastan su iFrame.
¡AUGE!
fuente
Desafortunadamente, la
parentNode
propiedad de un elemento DOM de HTML es de solo lectura. Puede ajustar las posiciones de los iframes, por supuesto, pero no puede cambiar su ubicación en el DOM y conservar sus estados.Vea este jsfiddle que creé que proporciona un buen banco de pruebas. http://jsfiddle.net/RpHTj/1/
Haga clic en el cuadro para alternar el valor. Haga clic en "mover" para ejecutar el javascript.
fuente
Esta pregunta es bastante antigua ... pero encontré una manera de mover un iframe sin que se recargue. Solo CSS. Tengo varios iframes con transmisiones de cámara, no me gusta cuando se recargan cuando los cambio. Así que utilicé una combinación de flotante, posición: absoluta y algunos bloques ficticios para moverlos sin recargarlos y tener el diseño deseado a pedido (cambio de tamaño y todo).
fuente
En respuesta a la recompensa que @djechlin puso en esta pregunta, he bifurcado el jsfiddle publicado por @ matt-h y he llegado a la conclusión de que esto todavía no es posible.
http://jsfiddle.net/gr3wo9u6/
fuente
Si está utilizando el iframe para acceder a las páginas que controla, puede crear un javascript para permitir que sus padres se comuniquen con el iframe a través de postMessage
A partir de ahí, puede crear un inicio de sesión dentro del iframe para registrar los cambios de estado y, antes de mover dom, solicítelo como un objeto json.
Una vez movido, el iframe se recargará, puede pasar los datos de estado al iframe y el iframe que escucha puede analizar los datos de nuevo al estado anterior.
fuente