2009-09-06 20 views
9

Tengo algunos elementos con eventos enlazados. Antes de eliminar esos elementos, ¿debo desvincularlos primero? Si no, ¿causarán problemas?jquery desvinculación ¿es necesario? (reemplazando elementos)

Gracias.

Editar: Me di cuenta de que formulé la pregunta incorrectamente, así que ahora estoy haciendo una edición, discúlpeme por eso, pero creo que tiene más sentido hacer esto que hacer una nueva pregunta.

Tendría que usar desvincular o eliminar en un elemento si lo reemplazo, ¿verdad? Con el método js replacewith o html en jquery.

Respuesta

17

No, no necesita hacer eso (la anulación de eventos se realiza automáticamente al eliminar).

+7

¿Qué pasa si un div se borra con jQuery ('div'). Html (''); y algo dentro de ese div tenía un evento de clic o binded. ¿Está desvinculado automáticamente? – kr1zmo

+0

@ kr1zmo esto es lo que estaba buscando también ... – rtpHarry

+3

'.html (htmlString)' [también desvinculará sus eventos] (http://api.jquery.com/html/#html2) "Además, jQuery elimina otras construcciones como datos y controladores de eventos de elementos secundarios antes de reemplazar esos elementos con el nuevo contenido ". – rtpHarry

1

No, no causará ningún tipo de problema (a menos que alguien tenga una experiencia desagradable que quisiera compartir :) Mi dinero está en '¡no importa!'.

La única excepción que puedo pensar es si está realizando un enlace de eventos en vivo, en una situación en la que no desea que los elementos recién insertados obtengan los mismos controladores de eventos de los elementos que eliminó previamente del DOM. Entonces sería una buena idea desvincular cualquier controlador de eventos (en vivo) antes de eliminarlo del DOM, dicho esto, puedes hacerlo en cualquier etapa, y no necesariamente antes de la eliminación.

7

El único momento en que necesitaría desvincularse explícitamente sería si ya no desea un controlador de eventos para un evento en la página.

Al eliminar un elemento del DOM, también se eliminan los eventos y los datos de ese elemento. Aquí está el código fuente relevante

remove: function(selector) { 
    if (!selector || jQuery.filter(selector, [ this ]).length) { 
     // Prevent memory leaks 
     jQuery("*", this).add([this]).each(function(){ 
      jQuery.event.remove(this); 
      jQuery.removeData(this); 
     }); 
     if (this.parentNode) 
      this.parentNode.removeChild(this); 
    } 
}