2016-06-16 4 views
0

Ich habe gerade durch herauszufinden, dass ich nach doppelten Event-Handler in jquery aufpassen, wenn ich sie dynamisch bin mehrere Male, wie hier beschrieben zuweisen: http://www.parallaxinfotech.com/blog/preventing-duplicate-jquery-click-eventsMuss ich doppelte dynamische Funktionen in Javascript löschen?

Muss ich für diese achten oder es irgendwie umgehen wenn ich eine Funktion innerhalb einer anderen Funktion mehrmals dynamisch deklariere? Wie geht JavaScript wirklich damit um? Wird nur die zuletzt aufgerufene Funktion verwendet oder wird eine Funktion nur einmal zur Ladezeit instanziiert? Soweit ich das beurteilen kann, wird die Funktion nicht mehrmals ausgeführt.

$(document).on("click",".button",function() { 

    function alertThem() 
    { 
     alert('Clicked!'); 
    } 
    alertThem(); 
}); 

Antwort

0

JavaScript wird sich an jede Funktion erinnern, die Sie zuweisen.

$('button').click(function(){ 
    alert('hi') 
}) 
$('button').click(function(){ 
    alert('hi') 
}) 

Der obige Code wird zweimal "hi" anzeigen. Wenn Sie eine neue Funktion zuweisen und die alte löschen möchten, können Sie unbind(). Click() ausführen. was es tun wird, ist, dass es alle Ereignisse lösen wird, oder Sie können losbinden ("klick"), was nur den Klick aufhebt. siehe https://jsfiddle.net/rznbtc1p/

$('button').click(function(){ 
    alert('hi') 
}) 
$('button').unbind().click(function(){ 
    alert('hi') 
}) 
0

Der Link, den Sie zur Verfügung gestellt funktioniert nicht (gibt mir Timeout), damit ich hoffe, dass ich verstanden, was Sie gefragt.

über das, was dort passiert:

In Ihrem Skript erstellt man einen Verschluss und band es zu einem Click-Ereignisse. Jedes Mal, wenn Sie auf das Element mit der Klassenschaltfläche klicken, wird die anonyme Funktion ausgelöst. Jedes Mal, wenn es ausgelöst wird, definiert es die Funktion alertThem() und ruft sie auf. Nur einmal definiert es, nur einmal ruft es auf. Der Umfang dieser Funktion ist ihr Elternteil, die Schließung. Diese Funktion ist außerhalb dieses Bereichs nicht definiert, sodass Sie sich keine Gedanken über die Doppeldefinition machen müssen.

Seitennotiz hier: Persönlich als Faustregel denke nicht, ist eine gute Idee, Funktionen wie diese zu definieren, aber wenn es zu Ihrem Projekt passt ... gehen Sie dafür.

Jetzt über die Duplizierung. Da ich den Link nicht sehen kann, denke ich, dass Sie sich auf doppelte Ereignisbindung beziehen.

In js kann eine beliebige Anzahl von Ereignissen an dasselbe Element gebunden werden. Sie können zum Beispiel beim Klicken auf etwas klicken, das sagt "Hallo, Sie klickte mich", dann binden Sie auch auf etwas klicken, das sagt "Hallo, Sie haben eine Nachricht erhalten, bevor Sie sagten, dass Sie mich angeklickt haben". Wenn Sie auf dieses Element klicken, sehen Sie beide Nachrichten.

Dies kann tatsächlich ein Problem werden. Sie haben 3 Optionen:

  1. wirklich vorsichtig sein, wie Sie Ereignisse binden

  2. Verfolgung von Halten Sie, was Sie verpflichtet

  3. Überprüfen Sie, ob Ereignisse bereits gebunden sind (obwohl das ein bisschen unzuverlässig ist). Sie können prüfen, wie hier: jQuery find events handlers registered with an object

0

In Ihrem Code-Schnipsel, werden Sie keine doppelten Event-Handler zu erstellen.

In Ihrem Snippet geschieht, dass Sie eine neue Funktion alertThem im Rahmen Ihrer Click-Handler-Funktion erstellen und diese dann in der unteren Zeile ausführen.