我剛剛發現FileReader調度事件就像它是一個DOM元素一樣。是嗎?我想知道是否有可能創建一個類似於FileReader的對象,該對象在HTML/XML結構中沒有表示形式,但可以派發事件?是否可以在常規對象(不是DOM)上分派事件?
回答
FileReader
有一個像addEventHandler
方法,因爲它是defined實現EventTarget
接口。 EventTarget
由DOM Events規範定義,但您不需要是一個DOM對象來實現它。 window
,XMLHttpRequest
和FileReader
是實現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回調工作,我只需要自己實現監聽器列表。
我認爲它是javascript;通常,任何可以獲得對DOM元素的引用的對象都應該能夠使用element.dispatchEvent函數分派事件;見:
是的,從這些頁面來到這裏。我的意思是FileReader似乎沒有與任何DOM元素相關,或者有一個引用它。但同時它本身有一個dispatchEvent方法,可以派發事件(我猜想是DOM事件)。有點混亂不是嗎?我想知道是否有辦法創建一個具有類似屬性的對象。 – jayarjo
嗯,我手邊沒有任何FileReader的實現,所以它只是推測,但如果DOM元素只是內部保存爲私有方法,並且FileReader的dispatchEvent只是將調用轉發給內部的dispatchEvent DOM元素,我們怎麼知道? – phtrivier
你是什麼意思的內部DOM元素?有這樣的真實世界術語嗎?還是你在再次猜測? :)我猜如果有任何內部的DOM元素,那麼FileReader不需要轉發任何東西。它本身可以是一個。 – jayarjo
bobince has the right idea,但他的代碼只是一個例子。對於經過實際測試的實施,Mr. Doob has one that he uses in three.js。
如果您不太在意模擬ECMAScript API,請考慮[signals](http://millermedeiros.github.com/js-signals/)和[bacon](https://github.com/raimohanska/ bacon.js)。 – bsimpson
jQuery可以從常規對象派發事件。 Here's a fiddle。
function MyClass() {
$(this).on("MyEvent", function(event) {
console.log(event);
});
$(this).trigger("MyEvent");
}
var instance = new MyClass();
- 1. 是或否分號在對象事件
- 2. java.awt.Robot.waitForIdle()是否等待事件分派?
- 3. 測試對象是否是一個DOM事件
- 4. 是否可以使用DOM從XML文件創建對象?
- 5. 在elasticsearch中,是否可以對嵌套對象使用常規查詢?
- 6. 是否可以在grails中分隔常規和反向UrlMappings?
- 7. 是否可以在常規Web服務器上使用Apache Thrift?
- 8. 是否可以重寫從對象派生的`__name__`?
- 9. 是否可以觸發DOM事件並使其在DOM樹中停止?
- 10. Cycle.js驅動程序中是否可以有多個DOM對象?
- 11. 是否可以手動調用一個dom對象的點擊?
- 12. 是否可以將多行作爲單個DOM對象處理?
- 13. DOM呈現中是否存在事件?
- 14. 如何在Dart上準備好對象時分派事件?
- 15. 是否可以使用InternetExplorer COM對象上載FTP文件?
- 16. 克隆JavaScript事件對象的最佳方法是什麼,以便它可以重新分派?
- 17. 是否可以判斷DOM是否被修改,以及哪個部分?
- 18. 是否可以在運行時將接口分配給對象?
- 19. 是否可以將多個DOM對象寫入單個Xml文件?
- 20. 是否可以在抽象類中創建事件?
- 21. 異常聲明中的派生對象類型是否意外?
- 22. WPF - 是否可以在樣式中分配事件?
- 23. 是否有Javascript事件可以根據用戶輸入不斷更新DOM?
- 24. 是否可以將多個規則流組分配給規則?
- 25. 這是事件分派同步嗎?
- 26. 是否可以在「正常文件系統」上進行事務處理?
- 27. 測試對象是否爲DOM元素
- 28. 是否可以刪除對象本身,而不是參考
- 29. 是否可以在常規Java項目中導入Maven JAR?
- 30. 是否可以繼承COM對象?
我有我自己的事件模型 - 將處理程序綁定到「事件類型」,將它們存儲在散列中的函數,以及在繼承此模型(以及其他實用程序方法)的對象上觸發「事件」的函數。你是否說默認事件模型沒有比我的任何有價值的好處? – jayarjo
是的,我認爲好處很小 - 由於無法可靠地讀取'preventDefault' /'stopPropagation' /'stopImmediatePropagation'是否具有'Event'的其他實現,因此您無法實現100%的互操作被稱爲。所以唯一的好處是DOM事件界面的熟悉程度......但它可以說是相當笨重的界面。 – bobince
我偶然發現了這個:http://www.w3.org/TR/DOM-Level-3-Events/#interface-CustomEvent,W3C推薦它創建特定於應用程序的事件類型。據我所知,還沒有得到廣泛的支持,但似乎這是整個事情的發展方向。 – jayarjo