0

ここにjsfiddleデモがあります:http://jsfiddle.net/9b9PW/15/

私がやろうとしているのは、「回答ごとのマーク」テキスト入力に値を入力して、質問ごとに質問ごとの個々の回答のマークを設定することです。次に、テキスト入力に入力された値と[残りのマーク]列に表示された値の差を自動的に計算します。これは、他のテキスト入力に使用するために残っているマークの数を知るためです。

しかし、私が抱えている問題は、質問ごとにこの計算がまったく実行されないことです。私が求めているのは、計算が機能するために何を変更する必要があるかということです。

以下は、計算が機能している場合にフィドルのマークを入力したときの出力の例です。以下の質問には、3つの間違った答えが含まれています。

Question No.    Incorrect Answer    Marks per Answer    Total Marks     Marks Remaining
1                  B                2 (text input)       7              2
                   F                1 (text input)       
                   G                2 (text input)       

すべてのテキスト入力の合計値="5"。「合計マーク」は「7」であるため、この質問の「残りのマーク」列のデフォルト値は「7」でした。したがって、7から5を引いた値は2になります。そのため、質問には「2」の値が残っています。

4

1 に答える 1

1

このフィドルで再計算を実行するようにコードを修正しました。Javascriptのフォーマットが非常に貧弱だったため、時間がかかりました。StackOverflowに質問を提示するときは、インデントを含めてコードを適切にフォーマットしてください。

問題は、イベントハンドラーの割り当ての周りに奇妙なforループがあり、クラスセレクターが正しくないことでした。任意の要素に複数のクラスを追加できるため、各入力「marksperanswer」にクラスを追加し、以前のコードを置き換えました。

//find each question set and add listeners
for (var i=0;i<=questions;i++){                                     
$('input[class*="q'+i+'"]').keyup(function(){

これとともに:

//find each question set and add listeners
$('.marksperanswer').keyup(function() {

イベントハンドラーは、各入力でキーが離されたときにトリガーされるようになりました。これは、要素を選択するためのはるかに簡単で防弾の方法です。.keyup()はjQueryコレクションで選択されたすべての要素に作用するため、forループは必要ありません。

また、FirebugやChromeのデバッガーなどのJavascriptデバッガーを使用すると、このような問題の診断がはるかに簡単になることもわかります。ハンドラー関数内に「console.log('Keyupfired!')」のようなステートメントを追加します(フォーカスを奪うことはなく、キーボードやマウスの操作を必要としないため、ロギングはアラートよりもはるかに簡単です)。logステートメントが起動しない場合は、イベントハンドラーが正しくアタッチされていないことがわかります。また、これを行うことができます:

var testCollection = $('input[class*="q'+i+'"]');

デバッガーでtestCollectionを調べると、0個の要素が割り当てられていることがわかります。したがって、CSSセレクターが何も選択するように機能していないことがわかります。ログ$( "。marksperanswer")をコンソールすると、期待どおりに3つの選択肢が表示されます。

Object[input.individualMarks 0, input.individualMarks 0, input.individualMarks 0]
0   input.individualMarks 0
1   input.individualMarks 0
2   input.individualMarks 0
(etc.)
于 2013-02-13T21:01:11.250 に答える