У меня был этот же вопрос немного назад
Вот решение, которое я придумал
требуется 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 для запуска событий в устаревших браузерах.
Вы можете сделать такой полифилл (непроверенный)
if (typeof Event !== "function") {
function Event(type) {
var e = document.createEvent("Event");
e.initEvent(type, true, true);
return e;
}
}
person
Mulan
schedule
25.07.2014
new Event
выдает ошибку в Safari, убедитесь, что у вас установлена новейшая версия браузера, и если это так, вы можете отправить отчет об ошибке в Apple.new Event
будет работать во всех основных браузерах; Chrome, FireFox и IE9+ - person Paul S.   schedule 26.07.2014