0

古いJavaScript計算機をレガシーサイトから新しいサイトに移植しようとしています。従来の計算機は、テーブル/divマークアップの混乱を含むフォームです。この計算機のすべてのロジックを処理するJSファイルは1つだけです。計算の各入力フィールドに入力すると、onChange()はJSファイルで定義された関数を呼び出します。これはすべて良いです。Chrome開発ツールにエラーが表示されることはなく、期待どおりの結果が得られます。

この計算機はマークアップの混乱であるため、不要な要素とインラインスタイルを削除して、より短い(マークアップの長さ)フォームを作成しました。問題は、新しいマークアップと同じレガシーJSファイルで電卓を使用しようとすると、機能しないことです。または、私はそれの約98%が機能しないと言うべきです。まだいくつかの数値を出力しているようですが、すべてではありません。古いマークアップに戻すとすぐに、再び機能します。

新しいマークアップを使用すると、「未定義のプロパティの長さを読み取れません」というメッセージが表示されます。一部のフィールドがJSに値を送信していることがわかっているため、これを修正する方法がわかりません。また、エラーが発生せず、古いhtml(以下のJSFiddleリンクに表示)を使用して計算が期待どおりに機能する理由もわかりません。

更新:ここに完全な例があります:http://machinesandwich.com/demo.html

4

1 に答える 1

1

これを見つけるのはちょっと面倒でしたが、短所は、マークアップがJavaScriptが期待するものと一致していないことです(複数の場所で)。

私が最初に見つけたのは、新しいマークアップに、両方ともという名前の2つのフォームフィールドが含まれていることISB_Elecです。

その場合、onchangeイベントがトリガーされると、fnISBud(form)が呼び出され、続いてが呼び出されますfnStrToInt(form.ISB_Elec.value)fnStrToInt文字列を期待していますが、同じ名前の2つのフォーム要素があるため、NodeListが渡されます。その後for、ループは例外をスローします。

これは、2つのフォームフィールドの両方に名前が付けられている他の少なくとも1つの場所で発生しISB_Trans_Otherます。

最後に、fnISBud(form)関数は一連のフィールド固有の計算を実行し、ある場所でを呼び出しますが、マークアップに名前がfnStrToInt(form.ISB_Ins_Auto.value)付けられた入力はありませんISB_Ins_Auto。これも例外をスローします。

要約すると、マークアップを再確認<input />し、JS関数が期待する各要素を適切に含めて名前を付けていることを確認してください。

于 2012-06-12T22:21:25.913 に答える