ここにはいくつかの問題がありますが、コードとは関係のない問題から始めましょう。JSFiddle では、JavaScript を配置する場所を選択できます。デフォルトではonload
、元の jsfiddle の出力で生成される JavaScript は次のようになります。
$(window).load(function(){
function amtcal(id)
{
var ntwt=$("#a1").val();
var rval=$("#aa1").val();
var product=rval*ntwt;
$("#baa1").val(product);
}
});
つまり、関数はそのウィンドウ ロード関数内にスコープされているため、DOM からは完全にアクセスできません。したがって、エラー:
ReferenceError: amtcal が定義されていません
これは、左側で「ラップなし - ヘッド」を選択することで修正できます。
では、実際のコードの何が問題なのですか? 見つけやすい問題は、jQuery を使用して 2 つの編集可能なテキスト ボックスの内容を読み取っていることです。
var ntwt=$("#a1").val();
var rval=$("#aa1").val();
それは問題ありませんが、テキストボックスは文字列を返し、文字列は乗算できないため、数値に変換する必要があります。整数が必要だと思います:
var ntwt= parseInt($("#a1").val(),10);
var rval= parseInt($("#aa1").val(),10);
この時点で、最初に 2 番目のテキスト ボックスを編集する限り、機能します。両方のテキスト ボックスから同じ関数を呼び出す必要があります。
<input placeholder="Net Wt" id="a1" onchange="amtcal(this.id)">
<input id="aa1" placeholder="Rate" style="width:50px;" onchange="amtcal(this.id)">
この時点ですべて動作します: http://jsfiddle.net/8JA4s/
ただし、jQuery とバニラの javascript/DOM を混在させています。混乱を避けるために、どちらか一方に固執する方が簡単なことがよくあります。
これを行う一般的な方法は、jQuery を使用してイベント ハンドラーをアタッチすることです。.on
$('#a1, #aa1').on('change',function(){
var ntwt=parseInt($("#a1").val(),10);
var rval=parseInt($("#aa1").val(),10);
var product=rval*ntwt;
$("#baa1").val(product);
});
もちろん、この方法で DOM 内のイベント ハンドラーを削除します。これを動作させるには、jsfiddle に配置する必要があります: http://jsfiddle.net/8JA4s/2/onLoad