2012-07-23 19 views
6

En la documentación de jQuery de la función de "vacío" (http://api.jquery.com/empty/) existe la siguiente declaración:jquery vacío de funciones y controladores de eventos

"To avoid memory leaks, jQuery removes other constructs such as data and event handlers 
from the child elements before removing the elements themselves." 

El texto dice: "... jQuery elimina los controladores de eventos de los elementos de! NIÑO! ...". Pero también quiero que los manejadores de eventos se eliminen de la etiqueta div ($ ("# mydiv"). Empty). Sé que existe la función "eliminar", pero mi intención es no eliminar la etiqueta div. ¿Cuál es la mejor manera de hacer esto?

La otra cosa es:
Cuando dicen "eliminar controladores de eventos". ¿Quitan solo construcciones hechas con "bind" o también quitan construcciones hechas con "delegate"?

Muchas gracias de antemano

Respuesta

8

para eliminar todos los controladores de eventos con destino a partir de un elemento, se puede pasar el valor especial "*" al método off():

$("#mydiv").empty().off("*"); 

Cuando la documentación dice remove events handlers, sólo se habla de obligado controladores de eventos, no delegados, ya que estos están vinculados a un elemento ancestro (o el documento en sí) que no se ve afectado por la eliminación.

Esto permite que los manejadores delegados sigan trabajando según lo previsto si el elemento eliminado se restablece más tarde.

+1

Para aclarar esto: * Cuando dicen "eliminar controladores de eventos". ¿Solo eliminan construcciones hechas con "bind" o también eliminan construcciones hechas con "delegate"? * Elimina todos los manejadores de eventos del elemento, delegados o no. ES DECIR. Si tiene '$ (" # mydiv "). Delegate (" div "," click ", fn) .off (" * ")' el manejador asociado con '.delegate' se elimina porque estaba en el elemento. – Esailija

0

si he leído correctamente, no quiero que la etiqueta div eliminado, lo que desea es eliminar todos los datos y manejadores en ese caso, combinar el .empty() con:

http://api.jquery.com/unbind/ 

Sin embargo tenga en cuenta que: " Los controladores de eventos adjuntos con .bind() se pueden eliminar con .unbind(). (A partir de jQuery 1.7, se prefieren los métodos .on() y .off() para adjuntar y eliminar controladores de eventos en elementos). En el caso más simple , sin argumentos, .unbind() elimina todos los controladores asociados a los elementos: "

Utilice la herramienta de eliminación que corresponde con la forma en que está vinculando eventos.

Si desea eliminar también el elemento que llama, no use .empty(), utilice .remove() en su lugar.

http://api.jquery.com/remove/ 

"similares a .empty(), el método .Remove() toma elementos del DOM. Uso .Remove() cuando se desea eliminar el elemento en sí, así como todo dentro de él. Además de los elementos en sí, todos los eventos enlazados y los datos de jQuery asociados con los elementos se eliminan. Para eliminar los elementos sin eliminar datos y eventos, use .detach() en su lugar. "

1

prueba este código jQuery;

jQuery('#element').bind('click',function(){ 
    console.log('clicked'); 
    }).on('remove',function(){ 
     console.log('element removed'); 
     jQuery(this).unbind('click').off('remove'); 
    }); 

    jQuery('#element').remove(); 
Cuestiones relacionadas