2010-03-31 71 views
3

我試圖讓一個按鈕,onclick將應用類loading(將光標設置爲「等待」)的身體,然後進行一系列的ajax請求。jQuery addClass()沒有運行之前jQuery.ajax()

代碼是:

$('#addSelected').click(function(){ 
    $('body').addClass('loading'); 

    var products = $(':checkbox[id^=add_]:checked'); 
    products.each(function(){ 
     var prodID = $(this).attr('id').replace('add_', ''); 
     var qty = $('#qty_' + prodID).val(); 
     if($('#prep_' + prodID).val()) 
     { 
      prodID += ':' + $('#prep_' + prodID).val(); 
     } 
     // Have to use .ajax rather than .get so we can use async:false, otherwise 
     // product adds happen in parallel, causing data to be lost. 
     $.ajax({ 
      url: '<?=base_url()?>basket/update/' + prodID + '/' + qty, 
      async: false, 
      beforeSend: function(){ 
       $('body').addClass('loading'); 
      } 
     }); 
    }); 
}); 

我試着做

$('body').addClass('loading'); 

這兩種請求之前,作爲一個beforeSend回調,但沒有任何區別。

在螢火蟲我可以看到body沒有得到loading類,直到請求完成後。

任何想法?


我還沒有以我認爲是乾淨的方式排序,但我找到了解決方案。

如果我添加setTimeout(function(){以上var products...,和}, 1);products.each塊的端部下方,該塊被延遲,所以會發生addClass第一。

+0

什麼元素有addSelected的id?如果它是一個錨標記,它可能會導致頁面刷新。除非你在你的代碼中防止了這些。 – Samuel 2010-03-31 14:33:05

+0

它的一個標準<輸入類型「按鈕」... /> – Josh 2010-03-31 14:36:27

+0

在我的使用經驗** addClass()**元素必須已經有一個** class =「」**! 如果元素沒有類,則必須使用** attr()**,而不是像這樣: $('body')。attr('class','loading'); – 2010-04-01 11:51:22

回答

2

看看.ajaxStart jquery event

這將是這個樣子

$('#addSelected').ajaxStart(function() { 
    $('body').addClass('loading'); 
}); 

編輯:我看了一下jQuery的文檔,發現設置異步=假鎖從其他行動瀏覽器。從jQuery文檔:

asyncBoolean 默認:true

默認情況下,所有的請求被髮送異步(即這是默認設置爲true)。如果您需要同步請求,請將此選項設置爲false。請注意,同步請求可能會暫時鎖定瀏覽器,並在請求處於活動狀態時禁用任何操作。

可能這會導致問題?嘗試在ajaxStart事件中記錄到控制檯並查看它是否正在觸發。

+0

這也是在請求完成後開始的:S – Josh 2010-03-31 14:13:12

+0

記錄到控制檯工作正常,它只是jquery方法被延遲。看起來我將不得不使用setTimeout方法。 – Josh 2010-03-31 15:46:17

+0

與原始問題中描述的完全相同的問題,在ajax調用中設置'async:false'對我有用! – TheThirdMan 2016-11-17 17:15:09

0

你使用的是什麼版本的jQuery?我的功能非常類似,我的電話總是在ajax呼叫之前發生。我正在使用jQuery的v1.4.2,所以也許你的問題是一箇舊版本?另外,由於您正在執行「each()」循環,因此您肯定需要在.ajax調用之前調用addClass。

+0

使用1.3.2,並試圖與谷歌託管1.4.2,我有同樣的問題。 Theres在頁面上也沒有其他的jquery。 – Josh 2010-03-31 14:33:07