Warum kann nicht ein mouseup-Ereignis verhindern, dass ein click-Ereignis
<div class='wrapper'>
<button class='child'>Click me</button>
</div>
function h(e) {
e.preventDefault();
e.stopPropagation();
e.stopImmediatePropagation();
alert(e.type);
return false;
}
document.querySelector('.wrapper').addEventListener('mouseup', h, false);
document.querySelector('.child').addEventListener('click', h, false);
Erwarte ich auch zu verhindern, dass die "click" - Ereignis von brennen, aber es funktioniert nicht. Aber die Veränderung mouseup
zu mousedown
hat in der Tat verhindern, dass das click-Ereignis.
Ich habe auch versucht die Einstellung der useCapture
- argument auf true, und das ebenfalls nicht zu dem erwünschten Verhalten mit mouseup
. Ich habe getestet auf Chrome und Firefox. Bevor ich die Datei Fehler, ich dachte, ich würde hier Fragen.
Ist das ein bug in aktuellen Browsern, oder ist es dokumentiert das Verhalten?
Habe ich überprüft, die W3C-standard DOM (level 2), und ich war nicht in der Lage, etwas zu finden, die erklären könnten, dieses Verhalten, aber ich könnte etwas verpasst haben.
In meinem speziellen Fall, ich bin versucht zu entkoppeln, zwei Stücke von code, hören Sie auf Ereignisse, die auf dem gleichen element, und ich dachte, der Verwendung von capture-Ereignisse auf den Teil, der Priorität hat, wäre der eleganteste Weg, um dieses Problem zu lösen, aber dann rannte ich in dieses problem. FWIW, ich habe nur zur Unterstützung der offiziell unterstützten Versionen von FF und Chrome (inklusive ESR für FF).
preventDefault
und stopImmediatePropagation
sind hier überflüssig (by the way), denn es gibt keine <form>
also keine Bestätigung mit der Taste, und nicht mehrere Veranstaltungen des gleichen Typs. Und ich glaubst dies ist das erwartete Verhalten, da nicht mouseup
Feuer, bevor click
? Also die .child
's mouseup
Ereignis feuert (und Blasen), bevor Ihre click
Ereignis (das Sie aufgehört haben, aber egal)Ich fügte hinzu, diejenigen, um sicherzustellen, dass ich didn ' T get Kommentare wie "haben Sie versucht, x() und y()?". Für deinen anderen Kommentar, Einstellung
useCapture
zu wahren Kräfte .wrapper
's mouseup geschehen, bevor die Blase vom Kind. Ich habe nicht include diesen code, denn in beiden Fällen, ich sollte nur einmal die alert () - (mit einem anderen Ursprung-element), richtig?Wenn Sie verhindern möchten, dass ein Mausklick, verwenden Sie diese: jsfiddle.net/zhAHt/9
Das ist nicht alles verhindern. Das ist nur eine Rückkehr, bevor der alert(), die nicht was ich will... wirklich zu nutzen, müsste ich, um eine Globale...
InformationsquelleAutor beatgammit | 2013-08-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Überprüfen Sie heraus dieses quirksmode Artikel
Den
click
Veranstaltung:So, wenn die Maustaste losgelassen wird, sowohl die
mouseup
undclick
- Ereignisse ausgelöst werden,click
nicht warten, bis diemouseup
Rückruf zu beenden. Fast immermouseup
undclick
werden Synonym verwendet.Zur Aufhebung des
click
, wie Sie gezeigt haben, kehren Siefalse
immousedown
Ereignis-callback die verhindert, dass dieclick
Ereignis jemals abschließen.Ich glaube, Sie sind falsch. zu tun, dass auf der mousedown-scheint zu stoppen moseup und klicken Sie auf Ereignisse ausgelöst. Siehe meine Antwort... (ich habe das getestet auf chrome)
InformationsquelleAutor Joseph Spens