2012-07-09 23 views
9

做jQuery中下面的響應單擊禁用Click事件:jQuery的:對,直到從Ajax調用

$('#signupbox1').on('click', '#signup1', function() { 

    var str = $('#signupform').serialize(); 

    // make it look like a waiting button 
    $('#signup1').addClass("btn_wait"); 
    var btn_val = $('#signup1').val(); 
    $('#signup1').val(''); 

    $.ajax({ 
     type: "POST", 
     url: "signup_step1.php", 
     data: str, 
     success: function(msg) { 

      //doing stuff here 

     $('#signup1').removeClass("btn_wait"); 
     $('#signup1').val(btn_val); 
     } 
    }); 

}); 

,直到你收到來自Ajax調用的答案你怎麼能禁止click事件呢?所以,當你點擊按鈕時,它不僅會由於添加的類而「轉換」爲等待按鈕,而且點擊事件也會「暫停」......這可能嗎?

非常感謝您提前!

回答

13
$('#signupbox1').on('click', '#signup1', function() { 

    var str = $('#signupform').serialize(); 

    // make it look like a waiting button 
    var btn_val = $('#signup1').val(); 
    $('#signup1').addClass("btn_wait").val('').unbind('click'); 

    $.ajax({ 
     type: "POST", 
     url: "signup_step1.php", 
     data: str, 
     success: function(msg) { 
      $('#signup1').removeClass("btn_wait").val(btn_val); 
     }, 
     complete: function() { 
      $('#signup1').bind('click'); // will fire either on success or error 
     } 
    }); 

}); 
+0

您可能還需要將錯誤事件綁定回來。用戶應該可以再試一次。 – Shyju 2012-07-09 20:04:12

+0

哦,謝謝佐爾坦!太簡單!哦,我的上帝......我感到羞愧! :) – Chris 2012-07-09 20:04:21

+0

@Shyju:是的,謝謝你的提示! – Chris 2012-07-09 20:04:49

2

您可以添加一個標記來表示「正在加載」。你可以使用任何東西,如變量,屬性或屬性。在這個例子中,我使用jQuery .data()

此外,建議您使用submit事件,而不是在提交表單時向提交按鈕添加點擊處理程序。

$('#signupform').on('submit', function() { 

    var form = $(this), 
     loading = form.data('loading'), //check loading status 
     str, button, val; 

    //if not loading 
    if(!loading){ 

     //set loading to true 
     form.data('loading',true); 

     str = form.serialize(); 
     button = $('#signup1', form); 
     val = button.val(); 

     // make it look like a waiting button 
     button 
      .addClass("btn_wait"); 
      .val(''); 

     $.ajax({ 
      type: "POST", 
      url: "signup_step1.php", 
      data: str, 
      success: function(msg) { 

       //remove loading state 
       form.data('loading',false); 

       //return button to normal 
       button 
        .removeClass("btn_wait"); 
        .val(val); 
      } 
     }); 
    } 

}); 
+0

哦,哇..謝謝約瑟夫這個全面的答案!那麼,將.data設置爲加載只適用於提交事件?目前我隱藏了表單的第一部分(4個輸入)並顯示第二個部分(另外4個輸入),然後在第二個部分我想使用整個表單的提交按鈕...你認爲這不是一個好理念? signup_step1.php只是檢查值的正確性......這必須再次完成,你是正確的,當提交整個表格,因爲數據可能已經改變,當然...... – Chris 2012-07-09 20:18:21

+0

@Chris jQuery'.data() '可以被任何東西使用。我相信你的形式問題需要在另一個問題。 – Joseph 2012-07-09 20:21:37

+0

好的,謝謝!你是對的... – Chris 2012-07-09 20:23:30