未捕获的TypeError:无法调用未定义的方法'addEventListener'

问题描述:

无法确定此代码中的错误在哪里。 Chrome调试控制台继续说:“Uncaught TypeError:无法在第31行调用未定义的方法'addEventListener'!未捕获的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 
    }; 
;})(); 
+2

'element'不存在。请发布调用'bind()'的代码和定义'element'的代码。 – Teemu 2012-04-17 11:01:20

+0

发现它!这是另一个脚本的问题。我使用谷歌Chrome开发者控制台e跟踪了右脚本中的回调:D – 2012-04-17 12:42:31

难道你bind调用与undefinedelement结束了呢? (例如,您传递的选择器与DOM中的任何元素都不匹配)

某些浏览器不知道“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 2012-04-17 11:04:36

+0

这不是浏览器问题,也许巴甫洛夫是正确的...谁知道在各种脚本中的问题是什么... – 2012-04-17 11:14:31

在我的情况下,这是由Evernote Clipper扩展脚本引起的。点击发出错误的脚本时,您会在评论中找到“Evernote”。

+0

在我的情况下,我在另一个脚本中有这个错误。关闭它解决了问题 – 2013-06-12 14:28:09