2012-11-20 91 views
3

可能重複:
How to reference the caller object (「this」) using attachEventIE事件的回調對象的JavaScript

這不是一個確切的重複。看到我的答案與假設的重複相比!

我可能會用我的術語,所以請隨時糾正我。也許這就是爲什麼我似乎無法找到任何相關的東西。沒有庫,

我有一個事件處理函數,它調用一個回調函數。花式,對吧?在IE <中,處理程序中的this對象是窗口。我不知道爲什麼,或者如何訪問正確的對象。

if (document.addEventListener){ 
    element.addEventListener(event, callback, false); 
} else { 
    element.attachEvent('on' +event, callback); 
} 

這部分確實工作

這部分並不:

function callback(event){ 
    console.log(this); 
} 

this在IE瀏覽器返回[object Window],而它返回,在其他瀏覽器稱爲callback功能的元件。這從我的完整腳本中顯着減少,但這應該是所有相關的。

編輯

通過@metadings How to reference the caller object ("this") using attachEvent提供這個環節是非常接近的。但是,還有兩個問題。

1)我需要同時調用這個函數event objectDOM element

2)這個事件處理委託風格:可能有子DOM元素觸發事件,這意味着event.target不一定(在我的情況下,通常不是)與監聽器的元素。

+2

嘗試使用'event.target'。 –

+0

@metadings你的鏈接似乎很接近,但我仍然失去了如何在我的方案中實現它。儘管嘗試... –

回答

1

好吧,關閉是走正道。以下是上述場景的答案:

(function(element, event){ 
    element.attachEvent(
     'on' + event, 
     function(e){ 
      callback(e, element); 
     } 
    ); 
})(element, event); 

這樣做!回調收到e作爲event objectelement作爲觸發偵聽器(不一定是事件目標)的DOM object

然後在回調:

function callback(event, obj){ 
    obj = obj || this; 
    console.log(event, obj); 
} 

與匿名函數和.CALL嘗試,如鏈接建議,提出thiscallback()event object,這是不工作了。

+0

這對於自定義或僞造事件觸發器也非常有用,因爲定製對象可以通過諸如target之類的鍵傳遞給'callback()'作爲'event',並且'obj'可以是選定的要調用的元素上。你沒有看到,以及爲什麼我需要觸發回調的元素是該元素上存在用於存儲其子元素事件的指令的屬性。 –

0

我投票決定關閉這一點,但好像你缺少的參數,所以像這樣的東西

element.attachEvent("on"+event, function(){ callback.apply(element, arguments); }); 
+0

請重新考慮您的近距離投票。這不是完全重複的。 –