2013-08-20 11 views
10

jsfiddleWarum kann ein mouseup Ereignis 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); 

ich verhindern erwarten, dass dies das ‚Klick‘ Ereignis von Feuern zu verhindern, aber es funktioniert nicht. Die Änderung von mouseup zu mousedown verhindert jedoch das Klickereignis.

Ich habe auch versucht, das useCapture Argument auf wahr zu setzen, und das erzeugt auch nicht das gewünschte Verhalten mit mouseup. Ich habe das auf Chrome und Firefox getestet. Bevor ich Bugs einreiche, dachte ich mir, ich würde hier fragen.

Ist dies ein Fehler in aktuellen Browsern, oder ist es dokumentiertes Verhalten?

Ich habe die W3C standard (DOM level 2) überprüft, und ich konnte nichts finden, das dieses Verhalten erklären könnte, aber ich könnte etwas verpasst haben.

In meinem speziellen Fall versuche ich, zwei Codeabschnitte zu entkoppeln, die Ereignisse auf demselben Element anhören, und ich dachte, Capture-Ereignisse auf dem Teil zu verwenden, der Priorität hat, wäre der eleganteste Weg, dies zu lösen, aber dann stieß ich auf dieses Problem. FWIW, ich muss nur offiziell unterstützte Versionen von FF und Chrome unterstützen (einschließlich ESR für FF).

+0

'preventDefault' und' stopImmediatePropagation' sind hier (übrigens) unnötig, weil es keine '

' gibt also keine Einreichung mit der Schaltfläche, und keine mehrere Ereignisse des gleichen Typs. Und ich * glaube * das ist ein erwartetes Verhalten, weil 'mouseup' nicht vor' click' feuert? Das '' child's 'mouseup' Ereignis wird also ausgelöst (und bläst) vor seinem' click' Ereignis (welches du gestoppt hast, aber es ist egal) – Ian

+0

@Ian - Ich habe diese hinzugefügt, um sicher zu gehen, dass ich nicht ' t erhalten Kommentare wie "haben Sie versucht x() oder y()?". Für deinen anderen Kommentar, setze 'useCapture' auf 'true', um '.wrapper's Mouseup vor der Bubble von child zu passieren. Ich habe diesen Code nicht eingefügt, weil ich in beiden Fällen nur einen Alert() (mit einem anderen Ursprungselement) erhalten sollte, oder? – tjameson

+0

Wenn Sie einen Mausklick verhindern möchten, verwenden Sie dies: http://jsfiddle.net/zhAHt/9/ – uSeRnAmEhAhAhAhAhA

Antwort

0

Check out this quirksmode article

Die click Veranstaltung:

ausgelöst, wenn ein mousedown- und mouseup auf demselben Element auftreten Ereignis.

Also, wenn die Maustaste losgelassen wird, sowohl die mouseup und click Ereignisse ausgelöst werden, click wartet nicht auf den mouseup Rückruf zu beenden. Fast immer können mouseup und click synonym verwendet werden.

Um die click abzubrechen, wie Sie demonstriert, können Sie false im mousedown Ereignisrückruf zurück, die jemals Abschluss der click Ereignis verhindert.

+5

Das ist falsch, Rückgabe false, o event.preventPropagation wird gestoppt das mouseup, aber nicht das click-Ereignis. – eveevans

Verwandte Themen