2013-05-16 25 views
2

我正在写一个小型库供内部使用, ,我是一个业余的Javascript开发人员,请记住我的错误。TypeError:prc.cng()不是Firefox中的函数,未捕获TypeError:Object#<HTMLInputElement>在Chrome中没有方法'cng'

我已经写了一个小的HTML文件,以及它下面去了JavaScript,

<html> 
<head> 
    <script> 
    var prc = { 
     cng : function(evt){ 
      console.log(evt); 
     } 
    } 
    </script> 
</head> 
<body> 
    <input type='text' id='prc' onkeydown="prc.cng(window.event)"/> 
<body> 
</html> 

我试着在Firefox和Chrome执行此,而不是在IE不过,

当我试图在Firefox ,它给出了这个错误"TypeError: prc.cng is not a function",并且在chrome中尝试时给出了"Uncaught TypeError: Object #<HTMLInputElement> has no method 'cng'"

我试过在StackOverflow中搜索这个,但他们面临的问题与我所面临的问题完全不同。几乎所有面临的问题都涉及到jQuery,请注意,我没有使用任何类型的库,并使用普通的旧Javascript编写。

任何帮助将不胜感激,以增进我对这个问题的理解。

+0

它适用于我在Chrome 27中正常工作:http://jsfiddle.net/barmar/BWfA7/ – Barmar

+0

你从Chrome中得到的错误意味着你正在改变'prc'的值,它正在被设置到''元素。检查您的脚本以进行变量重用。 – Barmar

+0

小提琴似乎工作正常:)。好的,我使用的是Chrome 24和Firefox 18.0。似乎无法理解为什么会发生这种情况:( – kashipai

回答

2

具有与现有JS变量相同的id的元素是将该变量的内容翻开并用对该元素的引用替换它。

快速解决方案是更改变量名称或元素ID。


更健壮的解决方案是将所有数据保持在尽可能窄的范围内。如果你不急于把它变成全球性的,那么就不要让它成为全球性的,并且它不会在脚本之外被覆盖。

由于使用内部事件的属性,你只能引用变量<script>元素,如果他们是全球性的,这也是一个很好的时间停止使用,并移动到现代的东西。

// Self-executing anonymous function expression used to limit scope 
(function() { 

    // Locally scoped prc that won't clash with the element 
    var prc = { 
     cng : function(evt){ 
      console.log(evt); 
     } 
    } 

    // Event handler binding 
    document.getElementById('prc').addEventListener('keydown', function (evt) { 
     prc.cng(evt) 
    }); 

}()); 

注意,该脚本不拖延执行,直到loaddomReady所以把它后的输入,这样,当找到事件处理程序的尝试发生在输入存在。

+0

不错。!谢谢你教我一些新的@Quentin – kashipai

0

我已经找到了自己问题的答案,感谢@Barmar,他帮助我理解了这个问题。

当我在HTML定义任何元素这样

<input type='text' id='test' onkeydown='test.fn()'/> 

这意味着对象由浏览器对于相同的创建。所以,如果我写了与id冲突的JavaScript,那么在该页面的任何地方都无法访问它。

<script> 
    var test = { 
    fn : function(){ 
     console.log('test'); 
    } 
    } 
</script> 

所以理想的是重命名id或重命名对象。

相关问题