2008-11-25 9 views
5

Uso Fish Gadget (http://abowman.com/google-modules/fish/) dentro de un CMS basado en wiki, y necesito volver a colocar el gadget de un elemento HTML a otro. (Nota: el gadget fish es un ejemplo; el problema también ocurre con otros gadgets.)Mover un elemento DOM que contiene una etiqueta de script creada dinámicamente

Si recoloco directamente el gadget utilizando la clase base de gadgets "ig_reset", todo funciona. Si trato de cambiar la posición usando un contenedor circundante, entonces el iframe utilizado por el gadget parece tomar el control. Lamentablemente, necesito la flexibilidad de reposicionarme usando el envoltorio circundante.

Esto parece tener algo que ver con mover una etiqueta SCRIPT en el DOM. El gadget crea dinámicamente una secuencia de comandos y una etiqueta de estilo. Si yo elimino la etiqueta de script creada dinámicamente desde el DOM, y luego vuelvo a colocar el contenedor en otra ubicación en el DOM, todo funciona bien. Si intento mover la etiqueta del script a otro elemento DOM, se produce el problema original. Así que moviendo una etiqueta de script alrededor del DOM parece ser la causa, independientemente de cuándo se produce el movimiento (incluso después de la carga).

Me gustaría entender qué está sucediendo aquí para hacer que el marco tome el control de la página, y también encuentre una mejor solución que eliminar la etiqueta de script creada dinámicamente.

puse una prueba aquí: http://solidgone.com/jquery/google-gadget.html - la demo utiliza jQuery, pero no creo que esto está relacionado con jQuery ...

Respuesta

16

Siempre que anexar un elemento de secuencia de comandos en una página, usando jQuery, intentará ejecutarlo. Por lo tanto, cuando mueves ig_reset (que es solo una tabla, no hay script) funciona sin problemas. Cuando intenta mover el contenedor, que contiene el script, el script se mueve y se vuelve a ejecutar.

Estamos trabajando para solucionar este problema de re-ejecución en el núcleo de jQuery, pero por el momento eso es lo que está sucediendo aquí.

+1

Maestro! tal vez pueda responder [a esta pregunta teórica] (http://stackoverflow.com/q/10753306/601179) acerca de su impresionante biblioteca jQuery? – gdoron

5

Como señala John Resig, este es un problema de jQuery. Esto se puede comprobar mediante la sustitución de su controlador

$("#with-wrapper").click(function() 
{ 
    $('.sidebar-content-wrapper').contents().appendTo($("#sidebar")); 
}); 

con uno que evita el uso de los métodos de jQuery para mover realidad cada elemento:

$("#with-wrapper").click(function() 
{ 
    var sidebar = $("#sidebar")[0]; 
    $('.sidebar-content-wrapper').contents().each(function() 
    { 
     // raw DOM method rather than jQuery's 
     // appendTo() -> domManip() -> execute script blocks behavior 
     sidebar.appendChild(this); 
    }); 
}); 
+0

Gracias por la información adicional. – DaveG

+0

Veo que copia el DOM, sin moverlo – vsync

+0

@vsync: ¿por qué dices eso? – Shog9

Cuestiones relacionadas