2014-09-22 161 views
2

我正在进行测验项目,其中用户选择多项选择答案(单选按钮),然后单击链接继续下一个问题。如果没有选择单选按钮,则无法点击该链接。一旦选择了一个单选按钮并单击链接,就会使用AJAX从MySQL数据库中提取下一个问题。双击两次触发事件

我遇到的问题是,如果用户双击链接,则跳过一个问题。所以,如果你在问题1,并双击链接,问题3加载而不是2.

是否有一种方法在jQuery中使一个事件只触发一次,如果链接是单击或双击?

感谢

$('#next-question-click').on("click", function(){ 
if ($('[name="radio-question"]').is(':checked')){ 
    var answer = $(".question-content ul li input:checked + label").text(); 
    question_number = question_number + 1; 

    if(question_number<100){ 
     next_question(question_number); 
    } 
} else { 
    $("#error-text").html('Please select an answer.'); 
} 
    return false; 
}) 

.on("dblclick", function(e){ 
    e.preventDefault(); //cancel system double-click event 
}); 
+0

最有可能你的代码只需要一个小的调整,那么你为什么不发布您的代码,我们会看到什么地方错了 – Huangism 2014-09-22 17:11:30

+0

你是如何触发事件???您必须先解除事件绑定并重新绑定。这是我们大多数人所做的常见错误。 – maddy 2014-09-22 17:24:27

+0

@Huangism谢谢 - 我编辑了这个问题,并发布了我的代码 – badcoder 2014-09-22 20:02:52

回答

0

jQuery.one()功能是你在找什么。

+0

我试过了,但是它防止链接在问题2后被点击,因为整个系统通过Ajax加载,即页面不刷新。 – badcoder 2014-09-22 16:48:11

+1

是的,如果你想使用'one()',你必须在ajax调用之后重新绑定事件处理程序。 – dave 2014-09-22 16:50:01

0

而不是解除绑定和重新绑定事件,我通常使用一个变量作为标志。 事情是这样的......

var working = false; 
$('#next-question-click').on("click", function(){ 

    if (working) return false; //Dont do anything, basically. 

    if ($('[name="radio-question"]').is(':checked')){ 
     var answer = $(".question-content ul li input:checked + label").text(); 
     question_number = question_number + 1; 

     if(question_number<100){ 
      working = true; 
      next_question(question_number); 
     } 
    } else { 
     $("#error-text").html('Please select an answer.'); 
    } 

    return false; 
}) 

而且,在next_question功能,接下来的问题就是加载并准备回答后,你会增加working = false;

2

你只需要门通过增加执行一类。所以你的代码只会在当前问题没有改变的情况下执行。现在

理想情况下,你应该从$('#next-question-click')清除活性类在你的Ajax调用成功函数加载新的问题,以确保该函数将只执行了新的问题已经加载

的后发优势添加一个类是为了不会污染全局变量空间,至于要添加什么类,这取决于你。我只是用积极作为一个例子

$('#next-question-click').on("click", function() { 
    if (!$(this).hasClass('active')) { 
     if ($('[name="radio-question"]').is(':checked')) { 
      $(this).addClass('active'); 
      var answer = $(".question-content ul li input:checked + label").text(); 
      question_number++; 

      if (question_number < 100) { 
       next_question(question_number); 
       $(this).removeClass('active'); // this should go into the success/complete function of the ajax call 
      } 
     } else { 
      $("#error-text").html('Please select an answer.'); 
     } 
    } 

    return false; 
}); 
+0

工作很好!非常感谢兄弟:) – badcoder 2014-09-22 20:45:38