0

我不知道在哪里句法逻辑错误位于最下面的脚本中。本质上,它的作用是提醒人们他们必须等待 1.5 秒才能回答单选按钮类型的问题并自动转到下一页。如果他们花费超过 1.5 秒,则不会发出警报。

这个脚本是为一个点击事件编写的,但我需要它来处理两个嵌套事件,点击一个单选按钮选项会自动触发“下一步”按钮移动到下一页。例如,如果您取出以下事件(及其结束括号),则效果很好:

$("[class*=bfasg] .radio").click(function(){    

我检查了Esprima的语法以确保括号正确,所以问题出在其他地方。

$(document).ready(function() {
   minTime(1.5);
   function minTime(minTime) {
       var startTime = new Date();
       $("[class*=bfasg] .radio").click(function(){$("#movenextbtn").click(function(){
           var endTime = new Date();
           if((endTime - startTime)/1000 <= minTime) {
                alert('You must spend at least '+minTime+' seconds on the question.');
                return false;
            }
            else {
                return true;
            }
        }); 
      });
    }
});

有哪位专家可以发现问题吗?

4

2 回答 2

4

(请参阅下面更新问题的答案)

这不是语法错误。这是一个逻辑错误。

如果您一致地格式化代码,它会变得更加清晰:

$(document).ready(function () {
    minTime(1.5);

    function minTime(minTime) {
        var startTime = new Date();
        // Hooking up a click handler
        $("[class*=bfasg] .radio").click(function () {
            // This code doesn't run until/unless someone clicks
            // one of the `[class*=bfasg] .radio` elements.
            $("#movenextbtn").click(function () {
                var endTime = new Date();
                if ((endTime - startTime) / 1000 <= minTime) {
                    alert('You must spend at least ' + minTime + ' seconds on the question.');
                    return false;
                } else {
                    return true;
                }
            });
        });
    }
});

您在那里所做的就是说“当有人单击一个[class*=bfasg] .radio元素时,在该元素上连接一个事件处理程序#movenextbtn。”

您可能不想等到有人单击单选按钮后才连接事件。如果您的目标是在两组元素上连接 click 事件,请将它们组合在同一个选择器中,就像在 CSS 中一样:

$(document).ready(function () {
    minTime(1.5);

    function minTime(minTime) {
        var startTime = new Date();
        $("[class*=bfasg] .radio, #movenextbtn").click(function () {
            var endTime = new Date();
            if ((endTime - startTime) / 1000 <= minTime) {
                alert('You must spend at least ' + minTime + ' seconds on the question.');
                return false;
            }
        });
    }
});

(顺便说一句,true从 jQuery 事件处理程序返回没有意义,所以我在上面删除了它。)


您在下面评论过:

发生的情况是我想单击单选按钮以自动触发“下一步”按钮以转到下一页,因为我每页有一个问题。

这并没有从根本上改变事情。您还没有显示按钮移动到下一页的作用,但您只需将该代码放在click上面的一个处理程序中。例如,您仍然挂接click单选按钮和按钮,并且您仍然使用通用代码处理该事件。例如:

$(document).ready(function () {
    minTime(1.5);

    function minTime(minTime) {
        var startTime = new Date();
        $("[class*=bfasg] .radio, #movenextbtn").click(function () {
            var endTime = new Date();
            if ((endTime - startTime) / 1000 <= minTime) {
                alert('You must spend at least ' + minTime + ' seconds on the question.');
                return false;
            } else {
                // ****Move to next page here****
            }
        });
    }
});

或者,您可以让单选按钮单击触发按钮上的单击事件,如下所示:

$(document).ready(function () {
    minTime(1.5);

    function minTime(minTime) {
        var startTime = new Date();

        // Hook up `click` on the radio buttons
        $("[class*=bfasg] .radio").click(function () {
            // Respond to click by firing click on the #movenextbtn
            $("#movenextbtn").click();
        });

        // Hook up `click` on the #movenextbtn
        $("#movenextbtn").click(function () {
            var endTime = new Date();
            if ((endTime - startTime) / 1000 <= minTime) {
                alert('You must spend at least ' + minTime + ' seconds on the question.');
                return false;
            }
        });
    }
});

当您可以使用通用逻辑时,我不喜欢触发这样的合成事件,但这是一种选择。

于 2013-06-29T06:16:52.370 回答
0
function callMe() {
  // Do Something
}

$(document).ready(function() {
  callMe();
});

在 ready() 之外声明 FUNCTION,然后在 ready() 内部定义 FUNCTION。最好在文档就绪之外定义它们。并且,如果需要,将方法的实现放在准备好的文档中。

于 2013-06-29T07:12:16.940 回答