JQuery提交函数有时会工作

时间:2012-08-10 02:08:42

标签: javascript jquery submit

我正在为一个包含使用jquery的jsp文件的类创建一个Web应用程序。我希望应用程序在提交之前触发警报。这在我的实际程序中有时会起作用,而其他时候从不会触发警报。我似乎无法找到一个总是有效或无法工作的实例。除非我添加Firebug断点,否则我的错误控制台会对此事保持沉默。然后它给了我

Error: attempt to run compile-and-go script on a cleared scope
Source File: http://code.jquery.com/jquery-1.7.2.min.js
Line: 2

但我不知道这意味着什么。就Firebug而言,我无法理解为什么在警告信息之前,评估会停止。

我试图制作一个记录问题的sscce,但我想这与我的真实程序有太大不同,因为提交从未奏效。我将从我的真实程序中显示一些代码。 (抱歉没有SSCCE。)

$(document).ready(function() {
    $("#questionDisplay").submit(function() {
        var correctAnswer = $(".correctAnswer").attr("value");
        var answer = "";

        if ($(".multipleChoice").length > 0) {
            answers = $("input:checked");
            for (var obj in answers) {
                answer += obj.attr("value") + "#";
            }
        } else if ($(".fillBlank").length > 0) {
            for (var answerNo = 1; $(".answer" + answerNo).length > 0; ++answerNo) {
                answer += $(".answer" + answerNo).attr("value") + "#";
            }
        } else {
            answer = $(".answer1").attr("value");
        }

        if (answer == correctAnswer) {
            alert("Yes! Correct!");
        } else {
            alert("Sorry, incorrect.");
        }
    });
});

jsp是一个巨大的混乱(我们必须使用scriplets :(),但如果你想看到它只是lemme知道。

如何让我的提交处理程序每​​次都能正常工作?

1 个答案:

答案 0 :(得分:3)

在您的示例中,answers是一个jQuery元素集合。使用for(var obj in answers) { }循环播放它实际上是循环遍历答案的属性,而不是元素本身。因此,在属性上调用.attr()是行不通的。

通常,如果我看到我的调试器状态jQuery有错误,那么99.9%的时间我在非jquery选择的对象上调用jQuery方法。在这种情况下,我在Chrome的JavaScript控制台中看到了错误,有时结果可能因控制台不同而有所不同。

一个好的做法是使用$来存储jQuery元素的变量前缀,以指示它们是jQuery对象。例如,$answers可以更轻松地跟踪其中包含的内容。

使用:

answers.each(function() {
     answer += $(this).attr("value") + "#";
});

而不是:

for (var obj in answers) {
    answer += obj.attr("value") + "#";
}