2012-07-23 5 views
6

In der jquery Dokumentation der "leeren" Funktion (http://api.jquery.com/empty/) gibt es die folgende Erklärung ab:jquery leer Funktion und Event-Handler

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

Der Text sagt: "... jQuery entfernt Event-Handler aus den! CHILD! -Elementen ...". Aber ich möchte, dass die Event-Handler auch vom div-Tag entfernt werden ($ ("# mydiv"). Leer). Ich weiß, dass es die Funktion "Entfernen" gibt, aber ich möchte das Div-Tag nicht entfernen. Was ist der beste Weg, um dies zu tun? Die andere Sache ist:
Wenn sie "Event-Handler entfernen" sagen. Entfernen sie nur Konstrukte, die mit "bind" erstellt wurden, oder entfernen sie auch Konstrukte, die mit "delegate" erstellt wurden?

vielen Dank im Voraus

Antwort

8

alle gebunden Event-Handler von einem Elemente zu entfernen, können Sie den speziellen Wert "*" zur off() Methode übergeben:

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

Wenn die Dokumentation remove events handlers sagt, es spricht nur von gebunden Ereignishandler, nicht delegierte diejenigen, da diese an ein Vorgängerelement (oder das Dokument selbst) gebunden sind, die nicht durch das Entfernen betroffen ist.

Dadurch können delegierte Handler weiterhin ordnungsgemäß arbeiten, wenn das entfernte Element später wieder aktiviert wird.

+1

Um dies zu verdeutlichen: * Wenn sie sagen "Event-Handler entfernen". Entfernen sie nur Konstrukte, die mit "bind" erstellt wurden, oder entfernen sie auch Konstrukte, die mit "delegate" erstellt wurden? * Es werden alle Event-Handler aus dem Element entfernt, delegiert oder nicht. I.E. Wenn Sie '$ (" # mydiv ") haben. Delegate (" div "," click ", fn) .off (" * ")' Der mit '.delegate' verbundene Handler wird entfernt, weil er auf dem Element war. – Esailija

0

Wenn ich richtig gelesen Sie nicht wollen, die div-Tag entfernt, möchten Sie einfach alle Daten und Handler in diesem Fall verbinden die .empty entfernen() mit:

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

jedoch beachten: " Mit .bind() verknüpfte Ereignisbehandlungsroutinen können mit .unbind() entfernt werden. (Ab jQuery 1.7 werden die Methoden .on() und .off() zum Anhängen und Entfernen von Ereignisbehandlungsroutinen für Elemente bevorzugt.) Im einfachsten Fall Ohne Argumente entfernt .unbind() alle Handler, die an die Elemente angehängt sind: "

Verwenden Sie das Entfernungstool, das der Bindung von Ereignissen entspricht.

Wenn Sie möchten, dass das aufgerufene Element ebenfalls entfernt wird, verwenden Sie nicht .empty(), verwenden Sie stattdessen .remove().

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

„ähnliches() .empty, die .remove() -Methode Elemente aus dem DOM nimmt. Verwendung .remove(), wenn Sie das Element selbst, sowie alles, was im Innern entfernen mögen. Zusätzlich zu den Elementen selbst werden alle mit den Elementen verknüpften gebundenen Ereignisse und jQuery-Daten entfernt. Um die Elemente zu entfernen, ohne Daten und Ereignisse zu entfernen, verwenden Sie stattdessen .detach(). "

1

versuchen Sie diesen jQuery-Code;

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

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