-1

私のアプリケーションでは、たとえば次のようなテーブルがあります。

Question No.    Question                 Answer     Marks per Answer    Total Marks
1               Here are 2 answers       B          (text input)            5
                                         D          (text input)
2               Here is a single answer  True       (text input)            5

上記の表には、各回答に属するテキスト入力があります。現在、各質問には独自の合計点数があります。私がやりたいのは、ユーザーがテキスト入力に数字を入力した場合、テキスト入力に入力された数字と「合計マーク」列の下の数字の差を計算する必要があるということです。したがって、以下の例を見ると、次のようになります。

 Question No.   Question                 Answer     Marks per Answer    Total Marks
 1              Here are 2 answers       B          (text input) = 2        2
                                         D          (text input) = 1
 2              Here is a single answer  True       (text input) = 5        0

上の表からわかるように、質問1の回答のテキスト入力は合計で3になります。したがって、5(質問1の合計点数から)マイナス3 = 2(合計点数は2になります)

質問2の場合、質問2の回答のテキスト入力は5に等しいため、5(質問2の合計点数から)から5 = 0(合計点数は0になります)を引いたものになります。

私の質問:

  1. これらの計算を実行するために使用する最良の方法はどのように、そして何ですか?

2.質問に回答が1つしかない場合(上記の例の質問2には回答が1つしかない場合など)、テキスト入力を読み取り専用にし、テキスト入力に同じ番号を表示する必要があります。とにかく同じマークと等しくなければならないので、合計マークは次のようになります。

Question No.   Question                  Answer     Marks per Answer             Total Marks
 2              Here is a single answer  True       (text input(readonly)) = 5        0

これがjsfiddleデモなので、HTMLコードがどのように見えるかがわかります。jsffidleで行ったことは、テキストボックスに値を挿入したことですが、合計の差を計算すると、実際には両方が「0」になるはずなのに、質問の「合計マーク」を「5​​」のままにしました。テキスト入力に入力されたマークと数字。また、質問2のテキスト入力は読み取り専用です。これは、この質問に対する単一の回答であるためです。

以下は、jsfiddleにあるhtmlコードです。

<table border='1' id='markstbl'>
<tr>
<th class='questionth'>Question No.</th>
<th class='questionth'>Question</th>
<th class='answerth'>Answer</th>
<th class='answermarksth'>Marks per Answer</th>
<th class='noofmarksth'>Total Marks</th>
</tr>
<tr class="questiontd">
<td class="questionnumtd" rowspan="2">1</td>
<td class="questioncontenttd" rowspan="2">Here are 2 Answers Question</td>
<td class="answertd">B</td>
<td class="answermarkstd"><input class="individualMarks" name="answerMarks[]" id="individualtext" type="text" value="3" /></td>
<td class="noofmarkstd" rowspan="2">5</td>
</tr>
<tr class="questiontd">
<td class="answertd">D</td>
<td class="answermarkstd"><input class="individualMarks" name="answerMarks[]" id="individualtext" type="text" value="2" /></td>
</tr>
<tr class="questiontd">
<td class="questionnumtd" rowspan="2">2</td>
<td class="questioncontenttd" rowspan="2">Here is single Answer Question</td>
<td class="answertd">True</td>
<td class="answermarkstd"><input class="individualMarks" name="answerMarks[]" id="individualtext" type="text" value="5" readonly="readonly"/></td>
<td class="noofmarkstd" rowspan="2">5</td>
</tr>
</table>

たくさんの質問と答えがあり得るとだけ言っておきますが、この例だけに当てはまる答えを提供するだけではありません。質問に多数の回答がある場合は、機能する必要があります。

4

2 に答える 2

1

これが、計算を行うための基本的なフレームワークであるソリューションです。検証ルールが必要な場合は調整する必要があります

$('tr').each(function() {
    var $input = $(this).find('input');
    var $row = $(this);
    var is_multiple = !$input.prop('readonly');
    var rowClass = is_multiple ? 'multiple' : 'single';
    if (is_multiple) {
        var is_first = $row.find('td').length == 5;
        rowClass += is_first ? ' first' : ' second';
    } else {
        /* readonly just needs marks changed once on page load */
        $row.find('.noofmarkstd').text(5 - $input.val());
    }
    $input.addClass(rowClass);
});

$('input.multiple').keyup(function() {
    var $input = $(this);
    var is_first = $input.is('.first');
    var $row = $input.closest('tr');
    var $otherRow = $row[is_first ? 'next' : 'prev']();
    var $marks = is_first ? $row.find('.noofmarkstd') : $otherRow.find('.noofmarkstd');

    var calcs = 5 - ($input.val() || 0) - ( $otherRow.find('input.multiple').val() || 0);
    $marks.text(calcs);    
});

/* if need calcs for multiples generated on pageload trigger a change on the first in set*/
 $('input.first').change();

デモ:http://jsfiddle.net/jTXy5/1/

于 2012-11-07T11:06:57.630 に答える
0

文字列で表される数値を扱っている値で、加算や除算などの単純な数学演算を実行している場合は、加算に注意するだけで済みます。

1つの値が文字列である「+」演算子を使用した式では、数値を加算するのではなく、文字列を連結したものとして扱われます。したがって、すべてを数値に変換するか(たとえば、parseInt、parseFloat、または関数として呼び出される数値を使用して)、加算がある場合はそれを処理することができます。

たとえば、指定された文字列値:

var a = '5';
var b = '6;

以下のすべてで、数学演算子を使用しているため、数値に変換されますab

 a * b // 30 

 a - b // -1 

 a / b // 0.833333... 

しかし

 a + b // 56 

オペランドの1つが文字列の場合、他のすべては文字列に変換され、「+」が連結に使用されるためです。

したがって、追加のためにあなたはすることができます:

 +a + +b // 11

加算や連結ができない場所で「+」とすると、単項演算子として扱われるため、aとbを数値に変換します。したがって、中央の「+」は数値を処理するため、加算として扱われます。

「+」が適用される前にaとbの値を数値にするスキームは、加算として扱われることを意味します。例:

parseInt(a) + parseInt(b);

Number(a) + Number(b);

a*1 + b*1  // since multiplication is done before addition

等々。あなたのコードを維持しようとする人たち(あなたかもしれない)にとって最もよく見え、最も明確になるものを使うだけです。

于 2012-11-07T02:38:34.023 に答える