2012-07-30 39 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