2013-01-20 88 views
1

我碰到下面的錯誤,我無法找到原因:Javascript對象不是一個函數

TypeError: object is not a function

這裏是我的html:

<td><input type="text" value="" id="cash_retained" name="cash_retained" onkeyup="net_cash()" size="25"></td> 
<td><input type="text" value="" id="cash_change" name="cash_change" onkeyup="net_cash()" size="25"></td> 
<td><input type="text" value="0" id="net_cash" name="net_cash"></td> 

這裏是我的js函數:

function net_cash() { 
    var cash = 0; 
    var retained = document.getElementById("cash_retained"); 
    var change = document.getElementById("cash_change"); 

    cash += parseInt(retained.value); 
    cash += parseInt(change.value); 

    if (isNaN(cash)) { 
     document.getElementById("net_cash").value = "0"; 
    } else { 
     document.getElementById("net_cash").value = cash; 
    } 
} 

我不明白爲什麼這是行不通的。我有其他類似的js函數,它們發現它很好。

回答

9

在這裏出現的問題是,你必須使用相同的名稱功能的表單元素:

<td><input type="text" value="0" id="net_cash" name="net_cash"></td> 

所以,當你在onkeyup事件稱之爲net_cash(),它認爲你是指這input DOM對象而不是同名的功能。我建議爲這兩件事分別命名。

內聯事件處理程序將封閉的<form>元素作爲其執行範圍。每個具有name屬性的表單控件都被視爲該範圍內的變量,這就是衝突的來源。

這也是使用unobtrusive JavaScript而不是內聯事件處理程序的另一個重要原因。如果你這樣做,你不必擔心你的函數名稱與你的元素名稱衝突。有關使用內聯事件處理程序的陷阱的更多信息,請參閱onclick=「」 vs event handler

+0

哇不知道名字指向'window.var' –

+2

@eicto:'window'對象*可笑*擁擠。這就是爲什麼我可以避免在代碼中創建任何*全局變量的原因;標記足夠創造它們。 –

+0

我希望函數聲明能夠隱藏這個元素名稱作爲全局變量的怪癖嗎? – Bergi

2

你的代碼對我來說工作正常。見demo here

因此,請以下

  1. 一定確保要包括調用 函數之前,腳本。
  2. 此外,它是不是一個好主意,讓IDS /名稱和函數的名稱

    <td><input type="text" value="0" id="net_cash" name="net_cash"></td> 
    

    //改變這裏的idand名

+0

你的演示工作,這也是我的回答。但與此同時,@JLRishe也是如此。 JavaScript DOM真的是一個謎...... –

+0

Yea .. +1對JLRishe ...我剛剛提到他們重複..我不認爲這會造成一個問題,因爲我從來沒有面對它。 :) 謝謝... – Wolf

相關問題