2011-07-09 21 views

回答

12

FileReader有一個像addEventHandler方法,因爲它是defined實現EventTarget接口。 EventTargetDOM Events規範定義,但您不需要是一個DOM對象來實現它。 window,XMLHttpRequestFileReader是實現EventTarget的其他瀏覽器對象模型對象。

不幸的是,沒有簡單的方法來搭載瀏覽器的本機實現的事件目標...您可以嘗試從瀏覽器對象繼承使用一個作爲prototype屬性,但這通常是非常不可靠的。但是它不是太難寫代碼自己實現所有方法中普通的JavaScript:

function CustomEventTarget() { this._init(); } 

CustomEventTarget.prototype._init= function() { 
    this._registrations= {}; 
}; 
CustomEventTarget.prototype._getListeners= function(type, useCapture) { 
    var captype= (useCapture? '1' : '0')+type; 
    if (!(captype in this._registrations)) 
     this._registrations[captype]= []; 
    return this._registrations[captype]; 
}; 

CustomEventTarget.prototype.addEventListener= function(type, listener, useCapture) { 
    var listeners= this._getListeners(type, useCapture); 
    var ix= listeners.indexOf(listener); 
    if (ix===-1) 
     listeners.push(listener); 
}; 

CustomEventTarget.prototype.removeEventListener= function(type, listener, useCapture) { 
    var listeners= this._getListeners(type, useCapture); 
    var ix= listeners.indexOf(listener); 
    if (ix!==-1) 
     listeners.splice(ix, 1); 
}; 

CustomEventTarget.prototype.dispatchEvent= function(evt) { 
    var listeners= this._getListeners(evt.type, false).slice(); 
    for (var i= 0; i<listeners.length; i++) 
     listeners[i].call(this, evt); 
    return !evt.defaultPrevented; 
}; 

注意:上面的代碼是把我的頭和未經考驗的頂部,但可能工作。但是它有一些限制,如只支持dispatchEvent返回值,如果Event對象支持DOM級別3 defaultPrevented屬性,並且不支持DOM級別3 stopImmediatePropagation()(除非您依靠自己的Event對象公開一個屬性它)。也沒有實現層次結構或捕捉/冒泡。

所以IMO:通過嘗試編寫參與DOM事件模型的代碼,你並沒有太多收穫。對於普通的JS回調工作,我只需要自己實現監聽器列表。

+0

我有我自己的事件模型 - 將處理程序綁定到「事件類型」,將它們存儲在散列中的函數,以及在繼承此模型(以及其他實用程序方法)的對象上觸發「事件」的函數。你是否說默認事件模型沒有比我的任何有價值的好處? – jayarjo

+1

是的,我認爲好處很小 - 由於無法可靠地讀取'preventDefault' /'stopPropagation' /'stopImmediatePropagation'是否具有'Event'的其他實現,因此您無法實現100%的互操作被稱爲。所以唯一的好處是DOM事件界面的熟悉程度......但它可以說是相當笨重的界面。 – bobince

+1

我偶然發現了這個:http://www.w3.org/TR/DOM-Level-3-Events/#interface-CustomEvent,W3C推薦它創建特定於應用程序的事件類型。據我所知,還沒有得到廣泛的支持,但似乎這是整個事情的發展方向。 – jayarjo

0

我認爲它是javascript;通常,任何可以獲得對DOM元素的引用的對象都應該能夠使用element.dispatchEvent函數分派事件;見:

https://developer.mozilla.org/en/DOM/document.createEvent

https://developer.mozilla.org/en/DOM/element.dispatchEvent

+0

是的,從這些頁面來到這裏。我的意思是FileReader似乎沒有與任何DOM元素相關,或者有一個引用它。但同時它本身有一個dispatchEvent方法,可以派發事件(我猜想是DOM事件)。有點混亂不是嗎?我想知道是否有辦法創建一個具有類似屬性的對象。 – jayarjo

+0

嗯,我手邊沒有任何FileReader的實現,所以它只是推測,但如果DOM元素只是內部保存爲私有方法,並且FileReader的dispatchEvent只是將調用轉發給內部的dispatchEvent DOM元素,我們怎麼知道? – phtrivier

+0

你是什麼意思的內部DOM元素?有這樣的真實世界術語嗎?還是你在再次猜測? :)我猜如果有任何內部的DOM元素,那麼FileReader不需要轉發任何東西。它本身可以是一個。 – jayarjo

1

jQuery可以從常規對象派發事件。 Here's a fiddle

function MyClass() { 
    $(this).on("MyEvent", function(event) { 
     console.log(event); 
    }); 

    $(this).trigger("MyEvent"); 
} 

var instance = new MyClass(); 
相關問題