2009-02-17 11 views
20

¿Qué sucede en jQuery cuando elimina() un elemento y lo agrega() a otro lugar?¿Se pierden eventos en jQuery cuando elimina() un elemento y lo agrega() en otro lugar?

Parece que los eventos están desenganchados, como si acabara de insertar un html nuevo (que supongo que es lo que está sucediendo). Pero también es posible que mi código tenga un error, así que solo quería verificar este comportamiento antes de continuar.

Si este es el caso, ¿hay alguna manera fácil de volver a conectar los eventos a esa porción de HTML o una forma diferente de mover el elemento sin perder el evento en primer lugar?

Respuesta

28

Sí, el enfoque de jQuery con remove() es desvincular todo lo relacionado con el propio bind de jQuery (para evitar fugas de memoria).

Sin embargo, si solo desea mover algo en el DOM, no tiene que hacerlo primero en remove(). Sólo append al contenido de su corazón, los enlaces de eventos se palo de alrededor :)

Por ejemplo, pegue esto en su incendiario en esta página:

$('li.wmd-button:eq(2)').click(function(){ alert('still here!') }).appendTo(document.body) 

Y ahora desplazarse hacia abajo a la parte inferior de esta página y haga clic en el pequeño icono globy ahora enterrado debajo del pie de SO. Obtendrá el alert. Todo porque me ocupé de no remove primero.

+0

genial. Esperaba que algo así fuera el caso. ¡yay para stackoverflow interactivo! –

0

jQuery1.3.1 uso en vivo() para enlazar eventos y usted no tendrá que preocuparse por esto ..

Actualización: eventos en vivo ahora están en desuso, pero se puede obtener el mismo efecto a partir del $ (document) .en().

+0

así que sí a mi pregunta original? que pasa exactamente Voy a registrarme en "vivo" ahora –

+0

definitivamente es bueno saberlo en vivo, pero tengo que tener cuidado con las advertencias aquí http://docs.jquery.com/Events/live#typefn –

+1

no aplicable si está trabajando con objetos dom específicos y no selectores. esta fue mi primera idea, también. –

51

El jQuery detach() función es la misma que remove() pero preserva los controladores de eventos en el objeto que devuelve. Si tiene que quitar el artículo y colocarlo en otro lugar con todo, puede usarlo.

var objectWithEvents = $('#old').detach(); 
$('#new').append(objectWithEvents); 

Verificar los documentos de la API aquí: http://api.jquery.com/detach/

+0

Necesitaba ordenar un grupo de elementos para eliminarlos de sus padres usando $ parent.empty(), luego anexar la lista ordenada de elementos a su matriz. ESTA fue la respuesta correcta para mí. ¡Gracias! – Bart

+0

gracias! trabaja para mi. – jruzafa

Cuestiones relacionadas