2012-07-30 65 views
1

我在嘗試從onclick事件傳遞事件對象時遇到了跨瀏覽器問題。JavaScript和傳遞事件實例功能

目前,我做了以下

for (var i = 0; i < list.length; i++) 
{ 
    var link= list[i];  
    link.onclick = function(el) { return function() {LinkManager.HandleOnClick(window.event, el); }}(link); 
} 

Firefox不尊重window.event。然而,我怎麼能通過它呢?

我使出了「不」乾淨的解決方案:

for (var i = 0; i < list.length; i++) 
{ 
    var link= list[i];  
    link.onclick = SomeClickHandler; 
} 

function SomeClickHandler(e) 
{ 
    e = e || window.event; 
    if (typeof (e) !== 'undefined') 
    { 
    var element = e.target || e.srcElement; 
    LinkManager.HandleOnClick(e, element); 
    } 
} 

誰能推薦解決它的一個更好的辦法?我真的不喜歡我所做的解決方法。

感謝,

+0

我認爲您的解決方案比以前的更好...你是不是在綁定新功能每個元素,但是您正在重用相同的功能。 – 2012-07-30 14:18:47

回答

0

如果我理解正確的,你要當它被稱爲你的處理程序可以訪問el變量和事件對象。這是可能的,並不難,但你可能要在關閉讀了起來:

link.onclick = (function(el) 
{ 
    return function (e)//this function will receive the event object 
    { 
     e = e || window.event;//for ie 
     LinkManager.HandleOnClick(e, el); 
    } 
})(link); 

但是,說實話,這是矯枉過正,試試這個(雙關語意):

link.onclick = function(e) 
{//this refers to `link`, the clicked element 
    e = e || window.event;//for ie 
    LinkManager.HandleOnClick(e, this); 
}; 

甚至更少的代碼:

link.onclick = function(e) 
{//this refers to `link`, the clicked element 
    e = e || window.event;//for ie 
    LinkManager.HandleOnClick.apply(this,[e]); 
    //LinkManager.HandleOnClick will receive 1 argument, the event object, and 'this' will point to 'link' 
}; 

甚至更​​少:

link.onclick = LinkManager.HandleOnClick;//this === link, 1 argument: the event object 

也就是說,你正在遍歷一個列表,並將一個事件監聽器附加到每個單獨的子元素。我強烈建議你使用delegaion:

if (list.addEventListener) 
{ 
    list.addEventListener('click',LinkManager.HandleOnClick,false); 
} 
else if (list.attachEvent) 
{ 
    list.attachEvent('onclick',LinkManager.HandleOnClick); 
} 
else 
{ 
    //use the loop you have now as a last resort 
} 

//LinkManager.HandleOnClick should start like so: 
LinkManager.HandleOnClick = function(e) 
{ 
    e = e || window.event;//<- you have the event object here 
    var target = e.target || e.srcElement;//=== list item: your link variables, your element 
    console.log(this);//<-should reference the list element (<ul> || <ol>) 
}; 

不管怎樣,這就是我想解決這個

0
var handler = function (evt) { 
    // do something here 
} 

if(window.addEventListener) { 
    link.addEventListener("click", handler); 
} else if(document.attachEvent) { 
    link.attachEvent("onclick", handler) 
} 
+0

我想最終讓我的處理程序像這樣: – Sam 2012-07-30 14:06:26

+0

我希望我的處理程序具有以下簽名。 VAR處理器=功能(EVT,ARG){// 做的東西在這裏 } 與上面的方法,我不明白的方式來傳遞參數。其次,我必須通過在第一個例子中返回一個匿名方法來避免任何關閉參數解決問題。 我在想這樣做會做什麼。但是,這也沒有用。 function(evt){return function(arg){LinkManager.HandleOnClick(evt,arg); }(arg)}; – Sam 2012-07-30 14:12:23

+0

只是爲了清楚起見:當使用閉包時,將參數傳遞給外部函數(返回函數的函數,返回的函數將是接收事件對象的函數:'(function(argument){return function(eventObject) {//處理事件};})(argumentValue);' – 2012-07-30 15:37:30