Warum verhindert Jquerys TriggerHandler () Inline -Ereignisse nicht?
-
26-10-2019 - |
Frage
Ich habe diesen Testcode für die Frage erstellt: http://jsfiddle.net/5phqm/1/
Soweit ich weiß, wenn JQuery's ist triggerHandler()
verhindert das Standard -Browserverhalten, dann werden native JavaScript -Ereignisse nicht ausgelöst und behandelt (und es gilt für addEventListener()
in meinem Code), aber Inline -Ereignis, über das Attribut des Tags hinzugefügt onclick=""
wird sowieso ausgelöst! Warum passiert es? Verstehe ich etwas über Ereignisse, die im Browser ausgelöst werden?
Lösung
Es kann bestätigt werden, dass Inline -Handler ausgeführt werden, weil es ist explizit codiert:
handle = ontype && cur[ ontype ];
if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {
event.preventDefault();
}
wo ontype
ist in diesem Fall "onclick"
. Also holt es die ab onclick
Eigenschaft des Elements und dann ausführen. Dieser Code wird immer genannt, unabhängig davon .trigger
/.triggerHandler
.
Einheimische Aktionen jedoch wie elem.click()
, werden nur ausgeführt Inneren ein if
Block:
if ( !onlyHandlers && !event.isDefaultPrevented() ) {
// ...
elem[ type ]();
wo onlyHandlers
ist true
zum triggerHandle
und false
zum .trigger
, und deshalb triggerHandler
führt nicht EG aus elem.click()
(wohingegen .trigger
tut). Daher wird die native Wirkung verhindert.
Inline -Handler und native Handlungen sind also getrennte Dinge und werden auch getrennt behandelt. Nur einheimische Aktionen werden durch verhindert .triggerHandler
.
Andere Tipps
Ich denke (aber es ist eine Vermutung, ich habe einen kurzen Blick auf den Quellcode von JQuery gegeben und dies könnte völlig falsch sein), dass JQuery die Ereignisse, die an Elemente in jQuery.trigger.event angeschlossen sind
$(elem).data("events");
und dann entscheidet, ob sie feuern/stoppt. Inline -Ereignisse können auf diese Weise nicht gesammelt werden und können daher nicht gestoppt werden.