2013-05-16 48 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或重命名對象。

相關問題