不久前我也有同样的问题
这是我想出的解决方案
需要ecmascript>= 5
function Emitter() {
var eventTarget = document.createDocumentFragment();
function delegate (method) {
this[method] = eventTarget[method].bind(eventTarget);
}
[
"addEventListener",
"dispatchEvent",
"removeEventListener"
].forEach(delegate, this);
}
现在是一个使用它的“类”
function Example() {
Emitter.call(this);
}
让我们现在试试吧!
var e = new Example();
e.addEventListener("something", function(event) {
alert("something happened! check the console too!");
console.log(event);
});
e.dispatchEvent(new Event("something"));
凉爽的!
现在让我们看看它与您的代码一起工作。这是一个演示。
// include function Emitter from above
function MyClass(text){
Emitter.call(this);
function show() {
console.log("MyText:", text);
this.dispatchEvent(new Event("end"));
}
this.show = show;
}
function onEnd(event){
console.log("Event dispatched:", event);
}
function run(){
var myInstance = new MyClass("I have something to say...");
myInstance.addEventListener("end", onEnd, false);
myInstance.show();
}
run();
输出
MyText: I have something to say...
Event dispatched: Event {
bubbles: false
cancelBubble: false
cancelable: false
clipboardData: undefined
currentTarget: null
defaultPrevented: false
eventPhase: 0
path: NodeList[0]
returnValue: true
srcElement: null
target: null
timeStamp: 1406332794168
type: "end"
__proto__: Event
}
最后,这是一个Emitter
与 ecmascript 兼容的版本< 5
// IE < 9 compatible
function Emitter() {
var eventTarget = document.createDocumentFragment();
function addEventListener(type, listener, useCapture, wantsUntrusted) {
return eventTarget.addEventListener(type, listener, useCapture, wantsUntrusted);
}
function dispatchEvent(event) {
return eventTarget.dispatchEvent(event);
}
function removeEventListener(type, listener, useCapture) {
return eventTarget.removeEventListener(type, listener, useCapture);
}
this.addEventListener = addEventListener;
this.dispatchEvent = dispatchEvent;
this.removeEventListener = removeEventListener;
}
请参阅document.createEvent以了解旧版浏览器中的触发事件
你可以像这样制作一个polyfill(未经测试)
if (typeof Event !== "function") {
function Event(type) {
var e = document.createEvent("Event");
e.initEvent(type, true, true);
return e;
}
}