2010-10-13 214 views
5

嗨,我有一個很大的問題,一直在困擾着我很長一段時間,大多數時候我已經能夠避免它,但現在沒有其他方式。下面是一個函數,執行時會爲每個選中的框發送一個post請求。我需要它等到$ .each完成刷新頁面。我已經在每個回調函數中使用location.reload進行了測試。在10個選定的盒子中,只有7-8個在$ .each回調中重新加載,如果在$ .each(仍在.click中)之後移動,則處理3-4個。我需要它以某種方式等待$ .each完成並刷新頁面。有沒有辦法做到這一點?

$('button.moveToTable').click(function(event){ 
      $("input:checked").each(function(){ 
       $.post('/table/move-to-table', 
       {orderID: $(this).val(), 
        tableID: $('#moveToTableID').val() 
       }, 
       function(data){ 
        location.reload(); 
       }); 
      }); 
      //location.reload(); 
     }); 

回答

6

一種簡單的方法是將元素數量存儲在全局範圍內並將其減去。當最後一個元素完成請求時,它將重新加載。請注意,如果某個請求返回錯誤,則會失敗,您必須處理錯誤事件並減去window.Remaining。兩次或多次點擊也可能破壞此方法。

window.Remaining = 0; 
$('button.moveToTable').click(function(event){ 
    window.Remaining = $("input:checked").length; 
    $("input:checked").each(function(){ 
     $.post('/table/move-to-table', 
     {orderID: $(this).val(), 
      tableID: $('#moveToTableID').val() 
     }, 
     function(data){ 
      --window.Remaining; 
      if (window.Remaining == 0) 
       window.location.reload(); 
     }); 
    }); 
    //location.reload(); 
}); 
+1

使用'length'屬性的好主意。你可以避免像'window.Remaining = $('input:checked')。each(function(){...}).''這樣的操作兩次運行選擇器。 :o) – user113716 2010-10-13 23:22:53

+0

只是一個旁註:你爲什麼把這個放在'window'下面?這在本地範圍內也會起作用。不需要污染全局名稱空間。 – 2010-10-13 23:39:44

5

不知道這是最好的解決辦法,但一個想法是將增加爲每一個發送的請求的數量,然後遞減它作爲請求返回。

使用計數作爲標誌來確定reload()是否應該觸發。

事情是這樣的:

var count = 0; 

$('button.moveToTable').click(function(event){ 
      $("input:checked").each(function() { 
       count++; // Increment the counter for each request 

       $.post('/table/move-to-table', 
       {orderID: $(this).val(), 
        tableID: $('#moveToTableID').val() 
       }, 
       function(data) { 
        count--; // Decrement as the requests return 

         // Only reload if the count is 0 
        if(count === 0) 
         location.reload(); 
       }); 
      }); 
     }); 

你或許應該有一些代碼,以防止click從第二點擊發生。你可以使用相同的count變量。

如:

if(count === 0) { 
    $("input:checked").each(func... 

或者一個更好的想法可能是使用this solution from nsw1475和所有複選框只發送一個請求,如果該選項提供給您。

2

一個更好,更高效和無缺陷的方法可能是使用each()函數來生成一個json數組,存儲哪些複選框已被選中,然後使用.post將所有數據傳遞到一起。完成後,調用頁面刷新。