未捕获的类型错误:无法调用未定义的“addEventListener”方法。

5

无法确定代码中错误出现在哪里。 Chrome 调试控制台一直显示 "Uncaught TypeError: Cannot call method 'addEventListener' of undefined",位于第31行!

jewel.dom = (function() {

    var $ = Sizzle;

    function hasClass(el, clsName){

        var regex = new RegExp("(^|\\s) + clsName + (\\s|$)");
        return regex.test(el.className);
    }

    function addClass(el, clsName) {

        if (!hasClass(el,clsName)) {
            el.className += ""+ clsName;
        }
    }

    function removeClass (el, clsName) {

        var regex = new RegExp("(^|\\s)" + clsName + "(\\s|$)");
        el.className = el.className.replace(regex, " ");
    }

    function bind(element, event, handler) {

        if (typeof element == "string") {
            element = $(element)[0];
        }

        element.addEventListener(event, handler, false)
}

    return {
        $:$,
        hasClass : hasClass,
        addClass : addClass,
        removeClass : removeClass,
        bind : bind
    };
;}) ();

2
元素不存在。请发布调用bind()的代码和定义element的代码。 - Teemu
找到了!问题出在另一个脚本中。我使用了谷歌浏览器开发者控制台,在正确的脚本中跟踪了回调函数 :D - Pasquale Sada
3个回答

1
在我的情况下,这是由于Evernote剪辑器扩展脚本引起的。当您单击抛出错误的脚本时,您会在注释中找到“Evernote”。

在我的情况下,我在另一个脚本中遇到了这个错误。关闭它解决了问题。 - pliashkou

0

你的 bind调用可能会导致 undefinedelement 吗?(例如,你传递了一个在你的 DOM 中没有匹配任何元素的选择器)


0

一些浏览器不知道什么是“addEventListener”。尝试这样做:

Element.prototype.setEvent = function(eventName, handler)
{
    if(document.addEventListener)
    {
        this.addEventListener(eventName, handler);
    }
    else
    {
        if(document.attachEvent)
        {
            this.attachEvent("on" + eventName, handler);
        }
    }
}
element.setEvent(eventName, handler);

同样适用于removeEventListener。
另外,尝试替换


 element = $(element)[0];

使用

 element = $("#" + element);

假设字符串包含元素的id,或者

 element = $("." + element)[0];

如果字符串包含元素的className。


1
这个浏览器报错了:"TypeError: 在第31行无法调用未定义的方法 'addEventListener'!" - Teemu
这不是浏览器的问题,也许Pavlov是对的...谁知道在各种脚本中哪里出了问题... - Pasquale Sada

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接