addEventListener vs onclick
Was ist der Unterschied zwischen addEventListener
und onclick
?
var h = document.getElementById("a");
h.onclick = dothing1;
h.addEventListener("click", dothing2);
Den code oben wohnt zusammen in einem separaten .js-Datei, und Sie funktionieren perfekt.
InformationsquelleAutor der Frage William Sham | 2011-06-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beide sind richtig, aber keine von Ihnen ist "am besten" per se, und es kann ein Grund sein, die Entwickler wählten zu verwenden beide Ansätze.
Ereignis-Listener (addEventListener und IE attachEvent)
Früheren Versionen von Internet Explorer implementieren, javascript anders als so ziemlich jeder andere browser. Mit Versionen kleiner als 9 ist, verwenden Sie die
attachEvent
[ doc ] - Methode, wie folgt aus:In den meisten anderen Browsern (einschließlich IE 9 und höher), verwenden Sie
addEventListener
[doc], wie diese:Verwendung dieses Ansatzes (DOM Level 2 events), können Sie eine theoretisch unbegrenzte Anzahl von Veranstaltungen zu einem einzigen element. Die einzige praktische Begrenzung ist eine client-side-Speicher und andere Leistung betrifft, die sind unterschiedlich für jeden browser.
Die obigen Beispiele stellen die Verwendung einer anonymen Funktion[doc]. Sie können auch fügen Sie einen Ereignis-listener mithilfe der Funktion Referenz[doc] oder ein Verschluss[doc]:
Ein weiteres wichtiges Merkmal von
addEventListener
ist der Letzte parameter, der steuert, wie der Hörer reagiert auf bubbling-Ereignisse[doc]. Ich habe die übergabe von false in den Beispielen, die den standard für wahrscheinlich 95% der Anwendungsfälle. Es gibt kein gleichwertiges argument fürattachEvent
oder bei der Verwendung von inline-Veranstaltungen.Inline-Veranstaltungen (HTML onclick="" - Eigenschaft und element.onclick)
In allen Browsern, die javascript unterstützen, können Sie einen Ereignis-listener inline, d.h. direkt in den HTML-code. Sie haben wahrscheinlich gesehen, diese:
Die meisten erfahrenen Entwickler meiden diese Methode, aber es hat den job zu erledigen; es ist einfach und direkt. Sie können nicht verwenden, closures oder anonyme Funktionen hier (obwohl der handler selbst ist eine anonyme Funktion, Arten) und Ihre Kontrolle beschränkt ist.
Die andere Methode, die Sie erwähnen:
... ist das äquivalent von inline-javascript-außer, dass Sie mehr Kontrolle über den Bereich (da bist du ein Drehbuch zu schreiben, anstatt HTML) und können anonyme Funktionen, Funktion, Referenzen, und/oder-Verschlüsse.
Den erheblichen Nachteil mit inline-events ist, dass im Gegensatz zu Ereignis-Listenern oben beschrieben, Sie kann nur ein inline-event zugeordnet. Inline-Ereignisse gespeichert als Attribut/Eigenschaft von element[doc], was bedeutet, dass es überschrieben werden kann.
Am Beispiel
<a>
aus der das obige HTML:... , wenn Sie auf ein element geklickt, hättest du nur sehen "Hast Zeug #2" - Sie überschrieb die erste zugeordnet der
onclick
Eigenschaft mit dem zweiten Wert, und Sie überschrieb die original-inline-HTML -onclick
Eigenschaft zu. Check it out hier: http://jsfiddle.net/jpgah/.Welcher ist der Beste?
Die Frage ist eine Frage der browser-Kompatibilität und Notwendigkeit. Tun Sie gerade brauchen Anhängen mehr als ein Ereignis an ein element? Wird Sie in der Zukunft? Quoten sind, werden Sie. attachEvent und addEventListener notwendig sind. Wenn nicht, ein inline-event wird den trick tun.
jQuery und anderen javascript frameworks Kapseln die verschiedenen browser-Implementierungen von DOM level 2 events in generischen Modellen, so dass Sie schreiben können, cross-browser-kompatiblen code, ohne sich sorgen über IE Geschichte als Rebell. Den gleichen code mit jQuery, cross-browser-und ready to rock:
Laufen nicht aus und bekommen einen Rahmen, die nur für diese eine Sache. Sie können leicht Rollen Sie Ihre eigenen kleinen Tools kümmern sich um die älteren Browser:
Probieren Sie es aus: http://jsfiddle.net/bmArj/
Nimmt man all das in Betracht, es sei denn, das Skript, das Sie suchen, nahm der browser Unterschiede berücksichtigt werden auf andere Art (im code nicht gezeigt in deiner Frage), das Teil mit
addEventListener
würde nicht funktionieren in IE-Versionen kleiner als 9.Dokumentations-und Verwandte Lesen
InformationsquelleAutor der Antwort Chris Baker
Den Unterschied, den Sie sehen konnte, wenn Sie hatte noch ein paar Funktionen:
Funktionen 2, 3 und 4 funktionieren, aber die 1 nicht. Dies ist, weil
addEventListener
überschreibt nicht vorhandene event-Handler, in der Erwägung, dassonclick
überschreibt alle vorhandenenonclick = fn
event-Handler.Der andere wesentliche Unterschied ist natürlich, dass
onclick
wird immer funktionieren, in der Erwägung, dassaddEventListener
funktioniert nicht im Internet Explorer vor version 9. Sie können die AnalogattachEvent
(die leicht andere syntax) im IE <9.InformationsquelleAutor der Antwort lonesomeday
Während
onclick
funktioniert in allen Browsern,addEventListener
funktioniert nicht in älteren Versionen von Internet Explorer, die verwendetattachEvent
statt.Den Nachteil
onclick
ist, dass es nur einen event-handler, während die beiden anderen feuern, alle registrierten callbacks.InformationsquelleAutor der Antwort Magnar
Soweit ich weiß, der DOM "load" - Ereignis noch funktioniert nur sehr begrenzt. Das heißt, es werden nur Feuer für die
window object
images
und<script>
Elemente zum Beispiel. Das gleiche gilt für die direkteonload
Zuordnung. Es gibt keinen technischen Unterschied zwischen den beiden. Wahrscheinlich.onload =
hat eine bessere cross-browser-Anzeige.Können Sie jedoch nicht zuordnen
load event
zu einem<div>
oder<span>
element oder ähnliches.InformationsquelleAutor der Antwort jAndy
Wenn Sie nicht allzu besorgt über den browser unterstützen, gibt es eine Möglichkeit zum binden der "this" - Referenz in der Funktion, die aufgerufen wird von der Veranstaltung. Es wird in der Regel zeigen Sie auf das element, das das Ereignis generiert, wenn die Funktion ausgeführt wird, das ist nicht immer, was Sie wollen. Der schwierige Teil ist zur gleichen Zeit in der Lage sein, entfernen Sie das sehr gleiche Ereignis-listener, wie in diesem Beispiel gezeigt: http://jsfiddle.net/roenbaeck/vBYu3/
Den code oben funktioniert gut in Chrome, und es gibt wahrscheinlich einige shim um so "binden" kompatibel mit anderen Browsern.
InformationsquelleAutor der Antwort Lars Rönnbäck
Verwendung von inline-handlers ist nicht kompatibel mit Content Security Policy so die
addEventListener
Ansatz ist sicherer aus dieser Sicht. Natürlich können Sie die inline-Prozeduren mitunsafe-inline
aber, wie der name schon sagt, es ist nicht sicher, denn es bringt wieder die ganze Horden von JavaScript-exploits, die CSP verhindert.InformationsquelleAutor der Antwort kravietz
Ein detail wurde noch nicht erwähnt wurde: moderne desktop-Browser betrachten verschiedene Tasten drücken, um "Klicks" für
AddEventListener('click'
undonclick
standardmäßig.onclick
undAddEventListener
klicken Sie auf Feuer auf der linken und mittleren Maustaste.onclick
feuert nur auf die Links klicken, aberAddEventListener
klicken Sie feuert auf den linken, mittleren und rechts klickt.Auch mit der mittleren Maustaste Verhalten ist sehr nicht konsistent in allen Browsern, wenn scroll-Cursor sind beteiligt:
Es ist auch erwähnenswert, dass "click" events für alle-Tastatur wählbare HTML-element wie
input
auch das Feuer auf die Leertaste oder EINGABETASTE, wenn das element ausgewählt ist.InformationsquelleAutor der Antwort a guest
Sollte es auch möglich sein zu verlängern die Zuhörer durch prototyping es (wenn wir eine Referenz haben, um es und nicht eine anonyme Funktion) -oder machen Sie das 'onclick' - Aufruf ein Aufruf einer Funktion library (eine Funktion, die den Aufruf von anderen Funktionen)
wie
dies bedeutet, dass wir nie chenge den onclick-Aufruf verändern die Funktion myFunctionList() zu tun, was immer wir wollen, aber diese lassen uns ohne Kontrolle der bubbling - /Fang-Phasen so sollte vermieden werden, für neuere Browser.
nur, falls jemand diesen thread in Zukunft...
InformationsquelleAutor der Antwort patrik
Laut MDNder Unterschied ist wie folgt:
addEventListener:
onclick:
Gibt es auch Unterschiede in der syntax verwenden, wie Sie sehen in der unten aufgeführten codes:
addEventListener:
onclick:
InformationsquelleAutor der Antwort Alireza
addEventListener
können Sie mehrere Handler, aber nicht unterstützt wird im IE8 oder niedriger.IE hat
attachEvent
aber es ist nicht genau das gleiche.InformationsquelleAutor der Antwort user113716
Javascript neigt dazu, mischen alles in die Objekte und können, die machen es verwirrend. Alles in einem ist der JavaScript Weg.
Im wesentlichen onclick ein HTML-Attribut. Umgekehrt addEventListener ist eine Methode, die auf das DOM-Objekt repräsentiert ein HTML-element.
In JavaScript-Objekte, die eine Methode ist bloß eine Eigenschaft, eine Funktion als Wert und wirkt gegen das Objekt, mit dem es verbunden ist (mit diesem Beispiel).
In JavaScript als HTML-element repräsentiert durch DOM wird Attributen zugeordnet, auf dessen Eigenschaften.
Dies ist, wo Menschen bekommen verwirrt, weil die JavaScript-Meldungen, die alles in ein einziges container-oder namespace-ohne Dereferenzierung.
In einer normalen OO-layout (das ist zumindest das Zusammenführen der namespace der Eigenschaften/Methoden) würden Sie vielleicht so etwas wie:
Gibt es Variationen wie könnte es eine getter - /setter für onload oder HashMap für Attribute, die aber letztlich das ist, wie es Aussehen würde. JavaScript beseitigt, dass die Dereferenzierung an der erwarten, zu wissen, was was ist unter anderem. Es zusammengeführt domElement und Attributen zusammen.
Abgesehen von der Kompatibilität sollten Sie als best practice verwenden Sie die Methode addEventListener. Wie die anderen Antworten sprechen Sie über die Unterschiede in dieser Hinsicht eher als die grundlegenden programmatischen Unterschiede werde ich verzichten. Im wesentlichen, in einer idealen Welt, die Sie sich wirklich nur dafür gedacht, um zu verwenden* HTML-aber in einer idealen Welt, die Sie nicht tun sollten etwas von HTML.
Warum ist es dominant heute? Es ist schneller zu schreiben, leichter zu lernen, und neigt dazu, nur Arbeit.
Den ganzen Punkt von onload in HTML zu geben, Zugang zu der addEventListener-Methode oder die Funktionalität an Erster Stelle. Mit JS wirst du über HTML, wenn Sie könnten, die Anwendung direkt.
Hypothetisch können Sie Ihre eigenen Attribute:
Was JS tut, ist ein bisschen anders.
Können Sie gleichsetzen und es so etwas wie (für jedes element erzeugt):
Den tatsächlichen Implementierungsdetails wird wahrscheinlich unterscheiden sich mit einer Reihe von subtilen Variationen machen die zwei etwas unterschiedliche, in einigen Fällen aber ist der Kern von ihm.
Es ist wohl eine Kompatibilität Kerbe, die Sie können die pin-Funktion zu einem Attribut, da durch die Standard-Attribute sind alle strings.
InformationsquelleAutor der Antwort jgmjgm
Kontext verweist
'this'
Schlüsselwort in JavasSript ist anders.betrachten Sie den folgenden code:
Was Sie tut, ist wirklich einfach. wenn Sie auf die Schaltfläche klicken, wird der button automatisch deaktiviert.
Ersten, wenn Sie versuchen, hook up die Ereignisse in dieser Weise
button.onclick = function(),
onclick-Ereignis wird ausgelöst, indem Sie auf den button, jedoch wird der button nicht deaktiviert werden, weil es keine explizite Bindung zwischen Taste.onclick und onclick-event-handler. Wenn Sie Debuggen finden Sie in der
'this'
Objekt, können Sie sehen, es bezieht sich auf'window'
Objekt.Zweitens, wenn Sie Kommentar
btnSubmit.onclick = disable();
und kommentieren//btnSubmit.addEventListener('click', disable, false);
Sie können sehen, dass die Schaltfläche deaktiviert ist, da mit auf diese Weise gibt es explizite Bindung zwischen Taste.onclick-Ereignis und onclick-event-handler. Wenn Sie Debuggen deaktivieren Sie die Funktion, die Sie sehen können'this'
bezieht sich auf diebutton control
eher als diewindow
.Dies ist etwas, was ich nicht gerne über JavaScript, das ist Inkonsequenz.
Btw, wenn Sie mit jQuery(
$('#btnSubmit').on('click', disable);
), verwendet es die explizite Bindung.InformationsquelleAutor der Antwort Larry