2012-02-20 90 views
0

我想用閉包庫來構建一個小應用程序。我試圖使用事件代表團以下代碼:關閉庫生成的瀏覽器事件沒有目標

var dom_ = goog.dom.$('targetelementid'); 
goog.events.listen(dom_, goog.events.EventType.CLICK, function(e) { 
    console.log(e); 
}, false); 

的問題是,當事件調度和處理函數執行生成的對象(goog.events.BrowserEvent)的目標和currentTarget當前屬性設置空值。我不明白這是爲什麼。

如果我使用常規偵聽器添加(使用addEventListener)傳遞給處理程序函數的事件已正確設置目標。

有關在事件對象中沒有指定目標時如何在關閉庫代碼中使用事件委託模式的任何說明?

回答

1

事實並非如此,當事件在處理程序中可用時,事件具有目標和其他所有需要的事件,但是,在goog.events中的所有已註冊處理程序都用盡後,事件對象將處理完畢(即其所有屬性被刪除/ null-ed),並且由於現代Web瀏覽器控制檯實現顯示對象的「實時」視圖,對象似乎是空的。

提示:使用'調試器'這個概念可以讓你停止JavaScript執行並在調試器中打開堆棧。

0

嘗試用範圍對象(這是addEventListener在後臺執行的操作)擴充代碼,因爲如果「this」是派發事件的目標,則目標無關緊要。

var dom_ = goog.dom.$('targetelementid'); 
goog.events.listen(dom_, goog.events.EventType.CLICK, function(e) { 
    console.log(e); 
}, false, this); 

注意「this」在最後。

+0

情況並非如此,在這兩個代碼片段中,函數都在全局範圍內執行。問題在於,Chrome顯示對象的「活動副本」,並且一旦爲該事件類型註冊的所有偵聽器都執行完畢,closure就會處理Event對象,因此目標在調試控制檯中丟失,並被刪除。 Google過多優化?無論如何,在回調執行時,目標屬性是可用的。我只是無法在調試控制檯中看到它。我通過閱讀events.js文件最終得出結論。 – 2012-02-28 14:05:35