Warum das onclick-element wird ausgelöst, zweimal für das label-element
JS:
window.onload = function(){
var wow = document.getElementById("wow");
wow.onclick = function(){
alert("hi");
}
}
HTML:
<label id="wow"><input type="checkbox" name="checkbox" value="value">Text</label>
Dies ist mein code, wenn ich klickte auf "Text" es wird gewarnt, Hallo zweimal, aber wenn ich klickte auf das Feld, die onclick
element wird nur einmal ausgelöst, warum?
- brauchen Sie den alert auf windows onload?
- NÖ, wenn der text angeklickt wird
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beim klicken auf das label, es löst den click-handler, und Sie erhalten eine Warnung.
Aber einen Klick auf ein label auch automatisch sendet ein click-Ereignis an die zugehörige input-element, so wird dies behandelt wie ein Klick auf die checkbox. Dann Ereignis-bubbling bewirkt, dass das click-Ereignis ausgelöst, auf das enthaltende element, das das label, also der Prozedur erneut ausgeführt wird.
Wenn Sie Ihre HTML diese, werden Sie nicht die Doppel-Alarm:
Dem label ist jetzt im Zusammenhang mit der checkbox mit der
for
Attribut anstatt wickeln um ihn herum.DEMO
<input>
, nicht die Bezeichnung. Es ist merkwürdig Verhalten und ich bin mir nicht sicher, ich kann mir einen Grund denken, es wäre nützlich.stopPropagation
in dass.for
. Dies ist wohl einer der wenigen. Siehe die verlinkte Frage.window
, die wraps beide von Ihnen, so ist es im wesentlichen das gleiche. Beim klicken auf die Beschriftung der Blasen an die Fenster, und löst auch eine klicken Sie auf die checkbox, die Blasen an die Fenster.Wenn Ihre Absicht ist, zu reagieren, nur um Klicks auf das Etikett, und nicht auf die checkbox, können Sie die Veranstaltung.Ziel Eigenschaft. Es verweist auf das element, dass heißt der Hörer, so dass, wenn der Klick nicht auf das element, nicht auf die Aktion:
Wenn auf der anderen Seite wollen Sie nur reagieren auf Klicks auf die checkbox (wo ein Klick auf das label produziert auch ein Klick auf das Kästchen), dann tun das Gegenteil. Nichts für Klicks auf dem Etikett und lassen Sie diejenigen, die von der checkbox durch:
Diese version scheint haben die meisten natürlichen Verhaltensweisen. Aber die Veränderung der markup, so dass die Beschriftung nicht mehr umschließt das Kontrollkästchen bedeutet, dass die listener nicht aufgerufen.
Veranstaltung Blase.
Die Kontrollkästchen der untergeordneten Knoten mit der Bezeichnung. Sie klicken Sie auf die checkbox. Event-bubble auf das Etikett. Dann Alarm pop-up zweimal.
Um zu verhindern, dass Alarm pop-up zweimal, wenn Sie klicken Sie auf die checkbox. Sie können ändern Sie die onclick-Funktion in diesem:
Hoffe, dass dies für Sie arbeiten kann.
<label>
tag erhalten sollten, sprudelte Ereignis nur einmal. Browser beiden "klicken Sie auf" Ereignisse, eins mit der<input>
- element als target und eine mit der<label>
als Ziel.Das Label-tag wird im Zusammenhang mit den input-tag drin. Also, wenn Sie auf das Etikett, es wird auch trigger eine click-Ereignis für den Eingang, dann Blase auf das label selbst.
Sehen:
http://jsfiddle.net/96vPP/