addEventListener für ein benutzerdefiniertes Objekt
Ich habe ein Objekt erstellt, der verschiedene Methoden. Einige dieser Methoden sind asynchron und somit will ich mithilfe von Ereignissen können perfom Aktionen, wenn die Methoden fertig sind. Um dies zu tun ich habe versucht, fügen Sie die addEventListener () auf das Objekt.
var iSubmit = {
addEventListener: document.addEventListener || document.attachEvent,
dispatchEvent: document.dispatchEvent,
fireEvent: document.fireEvent,
//the method below is added for completeness, but is not causing the problem.
test: function(memo) {
var name = "test";
var event;
if (document.createEvent) {
event = document.createEvent("HTMLEvents");
event.initEvent(name, true, true);
} else {
event = document.createEventObject();
event.eventType = name;
}
event.eventName = name;
event.memo = memo || { };
if (document.createEvent) {
try {
document.dispatchEvent(event);
} catch (ex) {
iAlert.debug(ex, 'iPushError');
}
} else {
document.fireEvent("on" + event.eventType, event);
}
}
}
iSubmit.addEventListener("test", function(e) { console.log(e); }, false);
//This call is added to have a complete test. The errors is already triggered with the line before this one.
iSubmit.test();
Dieser gibt einen Fehler zurück: Failed to add eventlisterens: TypeError: 'addEventListener' called on an object that does not implement interface EventTarget."
Nun dieser code wird verwendet in einer phonegap-app und wenn ich das mache, funktioniert es auf android/ios. Während der Tests allerdings wäre es schön, wenn ich könnte es funktionieren, die in mindestens einem einzigen browser.
PS> ich weiß, ich könnte aktivieren sprudelt, und dann hören Sie den document root, aber ich hätte gerne nur ein bisschen OOP, wo jedes Objekt kann sich auf seine eigenen.
InformationsquelleAutor der Frage Hugo Delsing | 2013-12-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
addEventListener
ist bestimmt für DOM-Elemente, die bestimmte event-bezogene Schnittstellen. Wenn Sie möchten, eine event-system auf Reine JavaScript-Objekte, die Sie sich für eine eigene event-system. Ein Beispiel wäreBackbone.Events
im Backbone.js. Die Grundidee ist mit einem object als hash zu verfolgen registrierten Rückrufe.Ich persönlich verwende diese: https://github.com/component/emitter
Es ist eine ziemlich einfache und elegante Lösung - mit süßen, kurzen Methode Namen wie
on()
off()
undemit()
. Sie können entweder erstellen Sie neue Instanzen mitnew Emitter()
oder verwendenEmitter(obj)
zu mischen-Ereignis-Funktionen in bestehende Objekte. Hinweis: diese Bibliothek ist geschrieben für die Verwendung eines CommonJS-Modul-system, aber Sie können es verwenden, überall sonst durch das entfernen dermodule.exports = ...
Linie.InformationsquelleAutor der Antwort Evan You
Wenn Sie möchten, hören Sie ein javascript-Objekt, haben Sie drei Möglichkeiten:
Object get/set-Operatoren
- Objekt.defineProperty
- Objekt.der Prototyp.Uhr
oderProxy-API
- Objekt.beobachten
. Funktioniert Chrome 25+(Jan 2014). Wurde aber veraltet 2016Über sup/pub Muster:
Müssen Sie veröffentlichen Ereignisse.
Über native Implementierungen:
Object get/set operators
ist genug, um zu hören, hinzufügen, entfernen, ändern,get-Ereignisse. Die Betreiber haben gute Unterstützung. Probleme nur im IE8-.
Aber wenn Sie wollen, verwenden Sie die get/set-in IE8 verwenden
Object.defineProperty
aberauf DOM-Objekte oder Objekt verwenden.defineProperty Farce.
Object.prototype.watch
hat der gute ES5 polyfill.Proxy API
braucht ES Harmonie unterstützen.Objekt.beobachten Beispiel
InformationsquelleAutor der Antwort Pinal
Wenn Sie nicht brauchen, true event-Funktionen(wie Blasen, stopPropagation), dann können Sie implementieren Ihre eigenen Veranstaltungen. addEventListener ist nur eine API in der DOM -, so dass Sie nicht wirklich brauchen es für Ihre eigenen Objekte außerhalb der DOM. Wenn Sie möchten, erstellen Sie eine evented Muster um ein Objekt herum, hier ist ein guter Weg, es zu tun, erfordert keine zusätzlichen browser-APIs und soll sehr kompatibel.
Lassen Sie uns sagen, Sie haben ein Objekt, wo Sie wollen eine Reihe von Ereignissen ausgelöst werden, wenn die dispatch-Methode aufgerufen wird:
Es ist wirklich nicht komplizierter als die, für die meisten Teil. Auf diese Weise haben Sie einige anständige Kontrolle über Ihre Veranstaltungen und Sie müssen nicht sorgen zu machen über die rückwärts-Kompatibilität oder externe Bibliotheken, weil dort alles stark unterstützt wird. Technisch könnten Sie sogar tun, ohne setTimeout und Griff Ihre Rückrufe ohne APIs. Alles andere wie stopPropagation() behandelt werden müssten sich.
https://jsfiddle.net/ozsywxer/
Gibt es, natürlich, polyfills für das CustomEvent, aber es sei denn, ich brauche advanced Veranstaltung bietet, bevorzuge ich wickle meine eigenen eventing-system in eine "Klasse" und Erweiterung anderer Klassen/Funktionen mit.
Hier ist der CoffeeScript-version, die ist, was der JavaScript-Code ist abgeleitet von:
https://jsfiddle.net/vmkkbbxq/1/
^^ Ein bisschen leichter zu verstehen.
InformationsquelleAutor der Antwort Ravenstine
Gibt es zwei Probleme.
Erste, der
iSubmit.addEventListener()
Methode ist eigentlich eine Methode, die auf derEventTarget
DOM-Schnittstelle:Diese sind inteded nur für die Verwendung auf DOM-Elemente. Indem es der
iSubmit
- Objekt als eine Methode, die Sie aufrufen, es auf ein Objekt, das nicht einEventTarget
. Dies ist der Grund, warum Chrome wirft einUncaught TypeError: Illegal invocation
JavaScript-Fehler.Das erste problem ist entscheidend, sondern ob man mit
EventTarget#addEventListener()
dein code nicht funktionieren würde, da das Ereignis Hinzugefügt wirdiSubmit
aber wird vondocument
. Im Allgemeinen, der gleichen Objekt-Methoden verwendet werden müssen, wenn das anbringen von Ereignis-Listenern und das auslösen von Ereignissen (es sei denn, du bist mit bubbling-Ereignisse, die eine andere Geschichte - Hinweis: bubbling ist nicht beschränkt auf JavaScript oder DOM-Veranstaltungen, beispielsweise).Mithilfe von benutzerdefinierten Ereignisse mit Ihren eigenen Objekten ist sehr normal. Als Evan Yu erwähntes gibt Bibliotheken. Hier sind ein paar:
Habe ich verwendet
js-signals
- und wie es ganz ein bisschen. Ich habe noch nie verwendetWolfy87/EventEmitter
aber es hat einen schönen Blick zu ihm.Deinem Beispiel könnte wie folgt Aussehen, wenn Sie verwendet werden
js-signals
jsFiddle
InformationsquelleAutor der Antwort tiffon
Wenn Sie in einer Node.js Umgebung, dann können Sie Knoten die EventEmitter-Klasse:
CustomObject.js
Verwendung:
Wenn Sie möchten, verwenden Sie Knoten EventEmitter außerhalb der Node.js Umgebung ist, dann können Sie webpack (vorzugsweise v2.2 oder später), um ein Bündel von Ihrer
CustomClass
zusammen mit einem EventEmitter polyfill (gebaut von webpack).Hier ist, wie es funktioniert (vorausgesetzt, das Sie installiert webpack weltweit mit
npm install -g webpack
):webpack CustomObject.js bundle.js --output-library=CustomObject
bundle.js
in Ihre HTML-Seite (es wird setzenwindow.CustomObject
)index.html
InformationsquelleAutor der Antwort Benny Neugebauer
Nur Spekulation; ich habe Sie nicht selber ausprobiert. Aber du kannst ein dummy-element und Feuer/hören auf Ereignisse, die auf das dummy-element.
Auch ziehe ich Los, ohne Bibliotheken.
InformationsquelleAutor der Antwort Rey
Dieser Artikel erläutert das erstellen von benutzerdefinierten Ereignissen: http://www.sitepoint.com/javascript-custom-events/
hier ist ein Beispiel:
erstellen Sie die Ereignis -
ordnen Sie die Veranstaltung zu etwas -
abonnieren Sie den event -
InformationsquelleAutor der Antwort Dawson Loudon
Ich denke, man kann mit dem Objekt $Latente und verspricht.
Es lasse Sie etwas wie das hier tun:
Gestapelt: binden Sie mehrere Handler, die überall in der Anwendung auf die gleichen Versprechen Ereignis.
//Irgendwo anders in der Anwendung
Parallele tasks: Fragen Sie mehrere Versprechen zurückzukehren ein Versprechen, die Warnungen Ihrer gegenseitigen Abschluss.
Sequenzielle Aufgaben: ausführen von Aufgaben in der angegebenen Reihenfolge aus.
Quelle hier:
http://blog.mediumequalsmessage.com/promise-deferred-objects-in-javascript-pt2-practical-use
InformationsquelleAutor der Antwort JSG33kC0d3
Verwendung: jsfiddle
Dies ist eine naive Herangehensweise, aber funktioniert vielleicht für einige Anwendungen:
InformationsquelleAutor der Antwort flcoder