2012-07-23 26 views
6

Nella documentazione jquery della funzione "vuoto" (http://api.jquery.com/empty/) c'è la seguente dichiarazione:jQuery vuoto funzione e gestori di eventi

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

Il testo dice: "... jQuery rimuove i gestori di eventi dagli elementi! CHILD! ...". Ma voglio che anche i gestori di eventi vengano rimossi dal tag div ($ ("# mydiv"). Empty). So che esiste la funzione "rimuovi", ma la mia intenzione è di non rimuovere il tag div. Qual è il modo migliore per farlo?

L'altra cosa è:
Quando dicono "rimuovere i gestori di eventi". Rimuovono solo i costrutti creati con "bind" o rimuovono anche i costrutti creati con "delegate"?

Grazie mille in anticipo

risposta

8

Per rimuovere tutti i gestori di eventi legati da un elemento, è possibile passare il valore speciale "*" al metodo off():

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

Quando la documentazione dice remove events handlers, si parla solo di associati a gestori di eventi, non delegati,, poiché sono associati a un elemento di antenato (o al documento stesso) che non è influenzato dalla rimozione.

Ciò consente ai gestori delegati di continuare a funzionare come previsto se l'elemento rimosso viene ripristinato in un secondo momento.

+1

Per chiarire questo: * Quando si dice "rimuovere i gestori di eventi". Rimuovono solo i costrutti creati con "bind" o rimuovono anche i costrutti creati con "delegate"? * Rimuove tutti i gestori di eventi dall'elemento, delegato o meno. OSSIA Se hai '$ (" # mydiv "). Delegate (" div "," click ", fn) .off (" * ")" il gestore collegato con '.delegate' viene rimosso perché si trovava sull'elemento. – Esailija

0

Se ho letto bene tu non vuoi il tag div rimosso, si desidera solo per rimuovere tutti i dati e gestori in questo caso combinare la .empty() con:

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

Si noti tuttavia che: " I gestori di eventi collegati con .bind() possono essere rimossi con .unbind(). (A partire da jQuery 1.7, i metodi .on() e .off() sono preferiti per collegare e rimuovere i gestori di eventi sugli elementi.) Nel caso più semplice , senza argomenti, .unbind() rimuove tutti i gestori allegati agli elementi: "

Utilizzare lo strumento di rimozione che corrisponde al modo in cui si stanno vincolando gli eventi.

Se si desidera rimuovere anche l'elemento che si sta chiamando, non utilizzare .empty(), utilizzare .remove().

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

"Simile a .empty(), il metodo .Rimuovere() batte elementi fuori dal DOM. Usa .Rimuovere() quando si desidera rimuovere l'elemento stesso, così come tutto al suo interno. Oltre agli elementi stessi, vengono rimossi tutti gli eventi associati e i dati jQuery associati agli elementi Per rimuovere gli elementi senza rimuovere dati ed eventi, utilizzare invece .detach(). "

1

prova questo codice 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(); 
Problemi correlati