2017-07-22 2 views
0

Ich habe die Post - jQuery click events firing multiple times und why is jQuery click event firing multiple times angeschaut, aber ich kann immer noch nicht herausfinden, warum das passiert.jQuery-Ereignis ausgelöst mehrere Male wegen Schienen Vermögenswerte?

Ich entwickle eine rails-4.2.9 App und haben eine eigene .js wie folgt:

$(function() { 
    var $addNotificationButton = $('#add-notification-button') 
    $addNotificationButton.on('click', function() 
    { 
     console.log("hi from js") 
     //Code for launching a dialog  
    }) 
}); 

Nun, wenn die Seite zum ersten Mal geladen wird, und die Taste wird das erste Mal, ich sehe nur 1 print-Anweisung geklickt und sehen der Dialog startet in einem neuen route. Wenn ich den Dialog schließe und erneut auf die Schaltfläche klicke, sehe ich 2 Druckanweisungen auf der Konsole, das nächste Mal 3 usw. usw.

Mein .js in Application.js und auf der Konsole gelegt Ich sehe eine print-Anweisung von Application.js aber die anderen, die auf sind von VM-2058.js in Chrome und von foundation.js in Firefox geheftet bekommen. Ich bin mir nicht sicher, wo oder wie diese auftauchen.

Meine Fragen sind:

1) Warum ist das passiert? Ich dachte, dass die print-Anweisung nur auf Knopfdruck ausgeführt wird. Ist das nicht, wie der jquery Event-Handler funktioniert?

2) Obwohl ich verhindern kann es mit one statt on, einer meiner Kollegen erwähnt, dass wir nicht one verwenden, da es das Ereignis aus der Taste nach dem ersten Klick und stattdessen schauen Sie in nur das Laden der .js entbindet benötigt von der controller. Nun, das funktioniert auch, aber sollten wir es so machen? Ich verstehe, dass dies eine mehr verwandte Frage ist.

Mein application.js sieht wie folgt aus:.

//= require_tree . 
//= require ./notification (refers to the .js file above) 

Antwort

0

Das Problem ist Sie mehrere Einstellung ".on('click'..) "Handler Ich bin über die verbleibende Ihres Codes nicht sicher, aber etwas muss Aufruf werden/Nachladen der JS-Datei und damit mehrmalige Ausführung dieser anonymen Funktion, jedes Mal ein "Bind" an die event. Deshalb steigt mit der Anzahl der Klicks? Vielleicht Ihr Dialog lädt die JS wieder? Nein sicher.

Wenn Sie tun:

Es sollte funktionieren, wie Sie erwarten, es wird jedoch alle vorhandenen "Klick" -Ereignisse lösen (wenn Sie also andere Sachen gebunden haben, muss es neu gebündelt werden).

+0

Erfolgt die "Bindung" jedes Mal, wenn die Datei in Dokument bereit geladen wird oder nur wenn auf die Schaltfläche geklickt wird? Gibt es eine Möglichkeit zu überprüfen, wann die JS-Datei geladen wird? – linuxNoob

+0

@linuxNoob das hängt von Ihrer application.html Struktur ab, den Ansichten, die Sie laden, wie Sie den Dialog laden, dem verbleibenden JS, das Sie gerendert haben. Wenn Sie die Ansichten anzeigen, was ist der "Dialog" und die verbleibende JS, die Sie möglicherweise geladen haben, einschließlich "bereit" -Ereignisse und so, dann können wir sie vielleicht lokalisieren –

+0

Hier ist ein Link zu application.html.haml - https: // gist.github.com/anonymous/27dde6a9f5cb7dd13239ddb305eaf09b. Bis auf das Dokument ready und das Klicken auf die Schaltfläche sind keine weiteren Ereignisse in der verbleibenden JS vorhanden. – linuxNoob

Verwandte Themen