2013-01-20 71 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

相关问题