开发者问题收集

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

2012-04-17
10493

无法确定此代码中的错误在哪里。Chrome 调试控制台在第 31 行一直显示“Uncaught TypeError:无法调用未定义的方法‘addEventListener’”!

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
    };
;}) ();
3个回答

就我而言,这是由 Evernote Clipper 扩展脚本引起的。单击引发错误的脚本时,您会在注释中看到“Evernote”。

Zhongjie Wu
2012-08-09

您的 bind 调用是否可能以 undefined element 结束?(例如,您传递的选择器与您的 DOM 中的任何元素都不匹配)

Alexander Pavlov
2012-04-17

有些浏览器不知道“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。

d4rkpr1nc3
2012-04-17