2011-06-08 48 views
1

我有結果頁面,其中結果加載了Ajax,我有jq UI滑塊的價格和複選框更改結果生活。在每次更改時都會加載結果,但是當我開始快速點擊複選框和滑塊時,每次都會調用結果,並且在某個時刻停止工作。在每次更改後放置一些計時器都不是我正在尋找的解決方案。Jquery ajax實時結果問題

+0

那麼你在找什麼解決方案?一個讓人們瘋狂點擊的地方?你應該展示你的代碼並澄清你想要的東西。 – Fosco 2011-06-08 18:48:33

回答

1

你需要使用一個定時器,而不是爲每個變化,僅有1全球計時器。每選中一個複選框,移動滑塊等,設置一個500ms的超時提交你的ajax請求。但每次進行更改時,還要清除現有的計時器,並設置一個新的計時器。

這樣,提交只發生在500ms不活動之後。如果用戶點擊開心,定時器每次都會被清除,只有當他們停止點擊後,ajax纔會被提交。

myForm.find('input, textarea, select').bind('change', function() 
{ 
    var self = $(this); 

    self.attr('changed', 'changed'); // -- mark as modified 

    clearTimeout($(document).data('ajaxTimer')); // -- prevent previous changes from being submitted 
    $(document).data('ajaxTimer', setTimeout(submitData, 500)); // -- start new timer for submission 
}); 

function submitData() 
{ 
    var allInputs = myForm.find('input, textarea, select'); 
    var changedInputs.filter('[changed]'); 

    allInputs.removeAttr('changed'); // -- mark all as submitted 

    changedInputs.each(function() 
    { 
     // gather values here 
    }); 

    // build your AJAX request here 
} 
+0

也許這是解決方案,但我應該每次抓取所有輸入以查看更改。這是我看到它的方式。有沒有其他方式可以看到變化? – Yovo 2011-06-08 19:16:08

+0

您不必每次都抓取所有輸入。只是一次綁定事件。提交值時,可以將它們全部提交併讓服務器決定使用哪些值,也可以記錄以前的值並僅提交已更改的值。更好的是,您可以向每個元素添加一個屬性,指示它是否已被修改。參見上面的例子... – KOGI 2011-06-08 19:25:21

0

在本回答說:Stop AJAX Request using jQuery,您可以指定要求的一些變量,然後如果這個變量被設置,您可以撥打另一個電話之前停止已經掛起的請求。

這樣,生效的結果將是最新的,不應該有混淆。

我貼在這裏,我引用的答案:

var request = $.ajax({ 
    type: 'POST', 
    url: 'someurl', 
    success: function(result){} 
}); 

然後你就可以中止請求:

request.abort(); 
+0

如何檢查ajax呼叫是否已啓動?我試過如果(request!=「」){request.abort();}但它不能很好地工作。 – Yovo 2011-06-09 10:40:14

+0

@Yovo嘗試使用if(typeof request!='undefined'){'作爲條件。 – Tadeck 2011-06-09 11:06:19

+0

謝謝,但我嘗試了幾個這樣的方法,它總是在某個時候打破。我每次都調用一個相同的函數,如果它正在進行,我嘗試填充它,所以我相信有另一種方法可以做到這一點如果您有任何想法,我想在這裏。 – Yovo 2011-06-09 12:45:36