In jQuery se si rimuove un elemento saranno rimossi tutti gli eventi su di esso?

StackOverflow https://stackoverflow.com/questions/1538243

  •  20-09-2019
  •  | 
  •  

Domanda

Per esempio, se ho un legame con il seguente evento legato ad esso:

$("a.d").bind("click", this, onDelete);

E più tardi fare:

$("a.d").remove();

E 'questo bene? Oppure è causare una perdita di memoria e ho bisogno di chiamare prima unbind?

Grazie per qualsiasi aiuto.

È stato utile?

Soluzione

Non ho ancora testato, ma credo che la rimozione di un elemento sarà sciogliere i suoi gestori di eventi. Vengo a questa conclusione dal jQuery documentazione API (ricerca per Remove) in cui si afferma che, se si desidera spostare un elemento da una parte di DOM da un altro che:

$("#foo").remove().appendTo("#bar");

dovrebbe essere scritto come

$("#foo").appendTo("#bar");

per evitare di perdere i gestori di eventi.

Altri suggerimenti

Da docs jQuery per remove ()

  

Rimuove tutti gli elementi abbinati dalla   DOM. Ciò non toglie loro di   l'oggetto jQuery, che consente di utilizzare   gli elementi corrispondenti ulteriori. Nota   che questa funzione iniziano 1.2.2   sarà anche rimuovere tutti i gestori di eventi   ed internamente nella cache dei dati.

La risposta è sì, a patto che l'evento è stato attaccato con jQuery. Se attaccato con qualcosa come "onclick" non credo che lo farà.

Questo articolo discute alcuni di che. Si definisce anche una funzione ricorsiva per rimuovere tutti gli eventi click per un elemento e tutti i suoi figli. Esso riguarderà i gestori click jQuery così come i gestori definiti con onclick quindi siete coperti.

http: / /www.computerhowtoguy.com/how-to-use-the-jquery-unbind-method-on-all-child-elements/

function RecursiveUnbind($jElement) {
    // remove this element's and all of its children's click events
    $jElement.unbind();
    $jElement.removeAttr('onclick');
    $jElement.children().each(function () {
        RecursiveUnbind($(this));
    });
}

Per utilizzare la funzione nell'esempio precedente che noi chiameremmo la funzione passandogli il div “contenitore” come un oggetto jQuery.

RecursiveUnbind($('#container'));

Per la cronaca, non è necessario preoccuparsi di perdite di memoria in JavaScript. (Freddo l'uomo, non c ++!)

Il motore JavaScript del browser gestisce tutti gli oggetti, e la spazzatura li raccoglie. Quando dico oggetti, questo significa che di gestione degli eventi-funzioni troppo, perché le funzioni sono anche oggetti in JavaScript.

non collegato: Mi piace come tutto è un oggetto in JavaScript: D

Cheers!
JRH

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top