0

我写了一些跨浏览器代码来添加事件监听器,然后 chrome 开始变得时髦,有人知道为什么会这样吗?

添加事件监听代码:

function addEventListener(Elm,Type,Func)
{
    if(Elm.attachEvent)
        Elm.attachEvent((Type.substr(0,2) == 'on' ? Type : 'on'+Type),Func);
    else
        Elm.addEventListener(Type,Func);
}

调用方法的代码:

addEventListener(window,'load',SetSize);
addEventListener(window,'resize',SetSize);

错误:

Uncaught TypeError: Object load has no method 'addEventListener' 

您可以非常清楚地看到我已经以正确的顺序传递了参数,但它们并没有按所述顺序进行解释..

4

3 回答 3

6

您已覆盖window.addEventListener.

本机签名是:event_name, callback但你的签名是:object, event_name, callback

更改函数的名称addEventListener或命名空间,例如my_framework.addEventListener

于 2013-08-05T15:33:33.980 回答
3

你重新定义了window.addEventListener. 您在全局命名空间中声明的任何内容基本上都属于window,因此:

function addEventListener(...) {

}

是相同的:

window.addEventListener = function(...) {

}

本机的参数签名addEventListenereventName, listener,但您有Elm, Type, Func

然后在你的函数体内,你正在做Elm.addEventListener并传递它'load'SetSize. 在该调用中,它再次调用您的函数(因为Elmis window),这一次,它尝试调用addEventListenerstring 'load',这将不起作用,因为 string 没有该方法。

更改函数的名称或命名空间,它应该可以工作。

于 2013-08-05T15:35:18.653 回答
2

我会说窗口对象没有.attachEvent 或.addEventListener。

这可能是因为您的函数名为 addEventListener 并覆盖了 window.addEventListener()

于 2013-08-05T15:35:48.640 回答