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

我修复了您的代码,以便它在此 Fiddle执行重新计算。由于您的 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() {

现在,事件处理程序会在每个输入中释放一个键时触发。这是一种更简单、更安全的元素选择方法。它不需要 for 循环,因为 .keyup() 将作用于 jQuery 集合中选择的所有元素。

当您使用 Javascript 调试器(例如 Firebug 或 Chrome 的调试器)时,您还会发现此类问题更容易诊断。在处理程序函数中添加诸如“console.log('Keyup failed!')”之类的语句(记录比警报更容易,因为它不会窃取焦点并且不需要键盘或鼠标交互)。如果日志语句没有触发,您就知道事件处理程序没有正确附加。此外,您可以这样做:

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