2012-11-07 80 views
-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.我還想要的是,如果一個問題只包含一個答案(就像上面例子中的問題2只有一個答案),那麼我希望文本輸入變爲只讀,文本輸入應該顯示相同數量佔總分的,它有反正等於用相同的標記,所以它看起來像下面這樣:

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

這裏是一個的jsfiddle demo讓你知道的HTML代碼是什麼樣子。在jsfidle中,我所做的是在文本框中插入了值,但是如果計算總計之間的差值,我將「總分」留給「5」,當他們都應該使「0」標記和文本輸入中輸入的數字。還質疑2的文字輸入是隻讀的,這是因爲它只是一個單一的答案,這個問題

下面是HTML代碼,這是在的jsfiddle:

<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> 

我只想說,有可無數的問題和衆多的答案,請不要只提供一個只適合這個例子的答案。如果問題中有很多答案,它需要工作。

+0

你爲什麼要發佈的服務器代碼,而不是住HTML?你可以更容易地使用html和jsfiddle.net中的演示來描述roww規則 – charlietfl

+0

@charlietfl當你說你想看到實時html,你的意思是查看頁面源代碼嗎?我非常樂意創建一個jsfiddle演示來顯示可能的表格。給我10分鐘,在jsfiddle – user1794342

+0

是的..取代所有的PHP ...它不適合在JavaScript計算問題的上下文演示。 – charlietfl

回答

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(); 

DEMO:http://jsfiddle.net/jTXy5/1/

+0

嗨,謝謝你的回答,我只有一個問題,我已經更新了你的小提琴[這裏](http://jsfiddle.net/jTXy5/3/)。顯然,如果有2個答案,你的小提琴就會起作用。但在更新的小提琴中,我添加了一個額外的答案,以便問題1有3個答案。現在,第一個和第二個答案的文本輸入在計算時起作用,而不是第三個文本輸入。每個問題可以有多個答案,每個問題可能有1,2,3或甚至10個答案。那麼爲了使計算適用於大量的文本輸入,需要改變什麼? – user1794342

+0

好的......原文隱含1或2.假設你的php可以告訴組中有多少人?如果這樣可以幫助大量添加額外的標記,以便能夠對所有輸入和總計框進行「分組」。然後可以使用簡單的js代碼遍歷整個「組」。如果你在所有輸入上使用了'data-'html5屬性,而且'question_'加上數字,那麼這個組中的所有數據都具有相同的數據值。 – charlietfl

+0

演示與調整標記。 **請注意**在單個「只讀」問題中不能有'rowspan = 2'單元格,並在其他單元格中添加一些數據屬性。代碼實際上比這些調整更簡單。 http://jsfiddle.net/JWTQk/1/ – charlietfl

0

如果你正在處理由字符串表示的數字的值,並且你正在進行簡單的數學運算,如加法,除法等,那麼你只需要小心添加。

帶有「+」運算符的表達式(其中一個值是字符串)將導致它被視爲連接字符串而不是添加數字。因此,您可以將所有內容都轉換爲數字(例如,使用parseInt,parseFloat或Number作爲函數調用),或者您可以在添加的地方處理它。

例如給定的字符串值:

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

在以下所有,ab轉換爲數字,因爲使用的數學運算符的:

a * b // 30 

a - b // -1 

a/b // 0.833333... 

a + b // 56 

,因爲如果其中一個操作數是一個字符串,所有其他操作數都轉換爲字符串,「+」用於連接。

因此,對於另外你可以這樣做:

+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 

等。只要使用最好的方法,對於那些試圖維護你的代碼的人(可能是你)來說最清楚。

+0

我認爲如果我使用JavaScript函數並僅使用javascript函數來簡單地確定輸入的內容會更好輸入文字並減去與總分的差值。這樣,如果用戶在文本輸入中輸入一個數字並單擊,它會進行計算並立即顯示新值,以獲得總分數。我感謝你的努力tho :)但認爲我需要這樣做javascript方法 – user1794342

+0

也可能有很多答案。一個問題可以有1,2 3或10個答案。沒有固定的答案數量,所以沒有固定數量的文本輸入(因爲每個文本輸入都屬於問題中的答案) – user1794342