在webkit中对本机JavaScript方法使用apply/call

在webkit中对本机JavaScript方法使用apply/call,javascript,webkit,Javascript,Webkit,我试图用下面的代码通过apply调用addEventListener,但在webkit的控制台中得到了“TypeError:TypeError” addEvent = (function (handler) { return function (element, event, fn) { handler.apply(element, [event, fn, false]); }; }(addEventListener || attachEvent)); 我尝试了apply和ca

我试图用下面的代码通过apply调用addEventListener,但在webkit的控制台中得到了“TypeError:TypeError”

addEvent = (function (handler) {
  return function (element, event, fn) {
    handler.apply(element, [event, fn, false]);
  };
}(addEventListener || attachEvent));
我尝试了apply和call来调用该方法,但都没有用。我是否错过了一些显而易见的事情,或者因为一些我还不知道的原因而试图做一些不被允许的事情


另一篇文章对此进行了一点讨论,但并不完全是我如何尝试使用它的

实现这一点的另一种方法(如新月闪光所述)如下:

addEvent = (function () {   
  return addEventListener ? 
    function (element, event, fn) {
      element.addEventListener (event, fn, false); 
    } :
    function (element, event, fn) { 
      element.attachEvent ('on' + event, fn); 
    };
}) ();

然后,可以将其扩展以减少两个事件模型之间的其他差异

你在这里打破了一些抽象概念
window.addEventListener.apply(anElement,[…])
不保证与
anElement.addEventListener()
相同,这是因为DOM api是通过主机(os)对象实现的,不需要与语言规范对齐(即,它们是不同的规范)。此外,IE的attachEvent要求传递的事件名称有一个
“on”
前缀。这是我第一次发布到Stack,我喜欢它。很高兴有人比我聪明,愿意帮忙。更好的方法是这样的:元素[handler.name](事件,fn,false);这主意不错,但我认为最好在返回函数之外执行if检查,以便只对其求值一次。利用闭包,我创建了一个“on”变量,并在返回函数之前设置它,然后在函数中使用它。var on=handler.name==“attachEvent”?“在“:”;然后在返回的函数内部:元素[handler.name](on+event,fn,false);我只是想知道这是否适用于IE,因为我在家里,只在mac电脑上。我完成了闭包代码,现在addEvent具有一个或其他内部函数的值。