2014-09-22 205 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