2010-01-07 12 views
27
mit

hier ist mein htmljquery Click-Ereignis wird mehrmals feuern, wenn Klassenauswahl

<li><div class="myLink" id=1>A<div> 
<li><div class="myLink" id=2>b<div> 
<li><div class="myLink" id=3>c<div> 
<li><div class="myLink" id=4>d<div> 
<li><div class="myLink" id=5>d<div> 
<li><div class="myLink" id=6>e<div> 
<li><div class="myLink" id=7>d<div> 
<li><div class="myLink" id=8>g<div> 

i ein jquery Ereignis binden wiht diesem Code erstellt:

jQuery(".myLink").click(function(event) { 

     var myId = this.id; 

     location.href = '/x/y?myId=' + myID; 
    }); 

wenn ich auf einen der Links klicken (die li-Gegenstände). Ich dachte, das würde ein Klick-Ereignis auslösen und wenn ich this.id anrufe, würde ich nur die ID des Elements bekommen, auf das ich geklickt habe.

Aber stattdessen sieht es aus wie das:

jQuery(".myLink").click(function(event) { 

feuert immer und immer wieder einmal dachte ich, auf der einen Link nur angeklickt. Ich legte eine Debugger-Anweisung in ihren und benutzte Firebug und sah, dass diese immer wieder aufgerufen wurde.

Irgendwelche Ideen was ist los?

Antwort

17

Wenn Sie Ihre <li> Tags schließen, beheben Sie das Problem. Ich habe es gerade getestet, und das korrigiert es. Sollte seine

<li> ... </li> 
<li> ... </li> 

nicht

<li> 
<li> 
+0

Ich hatte ein ähnliches Problem mit IMG-Tag, so @Erik hat Recht. Ich denke, jedes Tag sollte schließendes Tag haben, um dieses Problem loszuwerden. –

6

Versuchen Sie, den Wert des id-Attributs in Anführungszeichen zu setzen. Seltsame Dinge passieren, wenn Sie einfach id=1 setzen.

Und woher wissen Sie, dass es mehrmals zündet? Setzen Sie diese Zeile die Spitze der Funktion und beobachten Sie die Firebug einloggen, um zu sehen, was passiert:

console.log("clicked on", jQuery(this), "which has id", jQuery(this).attr('id')); 

edit:

Heh, wie andere haben darauf hingewiesen ... Achten Sie darauf, Ihr Markup gültig ist auch : P

+0

Einverstanden. Verwenden Sie id = "1", id = "2", id = "3", etc. – PHLAK

+7

Ich würde auch empfehlen, Ihre div und li Elemente richtig zu schließen. – alex

+1

mit dem ID-Attribut in Tags wird keine Auswirkungen haben, nur FYI – Erik

1

Aus dem HTML-Beitrag sieht es so aus, als wären die myLink-DIVs verschachtelt, was dazu führt, dass das Ereignis mehrmals ausgelöst wird, da jedes DIV den Klick erhält. Wie bereits erwähnt, stellen Sie sicher, dass die Tags gut formatiert sind. Sollen die DIV-Tags am Ende jeder Zeile zu schließenden Tags gehören?

+0

schlag mich auf den Schlag :) – Erik

+0

Du bist nicht allein ... – zehrer

69

Ich hatte ein ähnliches Problem und die Lösung für mich war das Click-Ereignis zu lösen, bevor das Click-Ereignis erklärt. Es macht wenig Sinn, aber ich hatte keine Ahnung, wie die verschiedenen Ereignisse an ein einzelnes HTML-Element hängen. (Und meine HTML sah gültig;))

$ ('remove_lkc '.) Entbinden (' Klick') klicken (function() {..........

+0

Ich hatte das Problem in OP beschrieben, aber mein HTML war wohlgeformt. Das Update von @ user512568 funktioniert für mich. Danke für das Teilen. – groundh0g

+8

Wenn dies behoben wurde, haben Sie wahrscheinlich das Klickereignis irgendwo auf dem Weg neu gebunden. Neubindungsgrundlagen werden hier besprochen: http://www.learningjquery.com/2008/05/working-with-events-part-2 – Riko

+0

Hatte ein ähnliches Problem. $ ('. class'). on ('click', function() {}); hat nur Event-Listener auf jedes andere Element angewendet. Nicht sicher, warum, aber zuerst lösen scheint es behoben zu haben. Vielen Dank! –

6

Mein Problem war, dass ich meine Veranstaltung in einer Schleife gebunden habe, als ich die <div> s erstellt habe, wodurch das Ereignis für jedes Element des Ereignisses immer wieder hinzugefügt wurde.

+2

Genau dieses Problem. Ich benutzte einen Klassenselektor $ (". Class"). Click (function()) innerhalb der Schleife, so dass ich bei jeder Schleifeniteration mehrere Click-Handler hinzufügte. Stellen Sie sicher, dass Ihr .click-Handler außerhalb der Schleife eingerichtet ist. – user1507720

14

In meinem Fall hatte ich mehrere Tabs die gleiche Teil Rendering und jeder Teil hatte die $ (document). ready() - Aufruf, der das Click-Ereignis dreifach gebunden hat.

+4

D'oh! Ich steckte meine js in den oberen Teil der partiellen Vorlage, nur um es zu testen, während ich daran arbeitete und es war vier Mal feuern. Hatte mich am Kopf kratzt, da die anderen Kommentare nicht zu meiner Situation passten, also danke, dass du darauf hingewiesen hast! Ich habe total vergessen, dass ich die Vorlage woanders in anderen Tabs benutzt habe ... –

+0

Ich fühle mich jetzt so dumm –

1

Stellen Sie sicher, dass Sie das js-Skript nicht mehrmals einschließen. Wenn Sie ein Framework in der Server-Site verwenden, stellen Sie sicher, dass Layout und Vorlagen nicht dasselbe Skript enthalten.

4

In meinem Fall muss das Javascript zusammen mit der Ajax-Anfrage gerendert werden.

$(document).ready(function(){ 
    $(document).on('click','.className',function(){alert('hello..')}) 
}); 

das Ereignis ausgelöst mehrere Zeit .. verwendet .off() alle vorherigen Ereignishandler zu entfernen. (Verwendung derselben Signatur in .on verwendet())

$(document).ready(function(){ 
    $(document).off('click','.className'); 
    $(document).on('click','.className',function(){alert('hello..')}); 
}); 

Hoffe, dass es jemand hilft ...

+0

Danke! Es funktioniert wie Charme, Sie sparen meinen Tag –

+0

meine zwei, danke @chris .. –

+0

Vielen Dank! Habe auch meinen Tag gerettet – FastTrack

Verwandte Themen