1

次のエラーが発生しましたが、理由がわかりません。

TypeError:オブジェクトは関数ではありません

これが私の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関数を持っています。

4

2 に答える 2

9

ここでの問題は、関数と同じ名前のフォーム要素があることです。

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

したがってnet_cash()onkeyupイベントを呼び出すinputと、同じ名前の関数ではなく、このDOMオブジェクトを参照していると見なされます。これら2つの名前を別々に考え出すことをお勧めします。

<form>インラインイベントハンドラーには、実行スコープとして囲み要素があります。属性を持つ各フォームコントロールはname、そのスコープ内の変数であるかのように扱われ、そこから競合が発生します。

これは、インラインイベントハンドラーの代わりに控えめなJavaScriptを使用するもう1つの大きな理由でもあります。そうすれば、関数名が要素名と競合することを心配する必要はありません。インラインイベントハンドラーを使用する際の落とし穴の詳細については、onclick =“”vsイベントハンドラーを参照してください。

于 2013-01-20T09:51:30.837 に答える
2

あなたのコードは私のためにうまく働いています。こちらのデモをご覧ください

したがって、次のことを確認してください

  1. 関数を呼び出す前に、スクリプトが含まれていることを確認してください。
  2. また、ID/名前と関数名を同じに保つことはお勧めできません

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

    //ここでIDと名前を変更します

于 2013-01-20T09:55:21.500 に答える