[英]Prevent jQuery function from running while request is running
我有一個需要經常重用的功能。 當我將另一個頁面加載到當前頁面時,會發生問題,該函數將觸發兩次。 我嘗試了此解決方案,但無法使其正常工作( 單擊1次后禁用jquery函數,以防止多次執行 )。 有什么解決方案可以防止在發出請求時多次觸發該功能? 每次點擊僅觸發一次功能。
(function($) {
$.fn.likeclick = function(thiss, key) {
var $this = thiss;
var pid=key;
if ($this.hasClass('addd')) {
$.post("/blah.php?id="+pid, function(data) {
if (data=="ok"){
$this.removeClass('addd').addClass('rem');
$('.ccount#'+pid).html(function(i,val) {
return (parseFloat(val) + 1).toFixed(0);
});
}
});
} else {
$.post("/blah1.php?id="+pid, function(data) {
if (data=="okk"){
$this.removeClass('rem').addClass('addd');
$('.ccount#'+pid).html(function(i,val) {
return (parseFloat(val) - 1).toFixed(0);
});
}
});
}
};
})(jQuery);
用法:
<div class="like addd"></div>
$('.like').click(function() {
likeclick($(this),this.id);
});
如果我正確地理解了您的問題,那么您需要的是一種讓函數知道在發出請求之前當前是否有活動請求的方式。 為什么不添加類似hasActiveRequest
的布爾值來跟蹤此情況? 因此,默認情況下為false
,然后單擊它們時,檢查布爾值...如果為false,則將其設置為true
並發出請求; 否則,如果它為true
,則不要發出請求(因為已經在進行請求)。 請求完成后,將布爾值設置回false
。
由於這些功能不適用於使用.post()方法加載的頁面(或數據),因此我嘗試將jQuery函數直接或通過.js文件添加至加載的頁面。 無論哪種方式,在使用.post()加載幾頁后,代碼都會多次執行。 無論我使用延遲,超時函數還是添加布爾值來嘗試防止每次單擊均觸發該函數多次,該函數仍會多次執行。
經過無休止的搜索,我在jQuery文檔中找到了這篇文章( http://docs.jquery.com/FAQ#Why_do_my_events_stop_working_after_an_AJAX_request.3F )。
在該文章中指出:
謹防! 從jQuery 1.4.2開始,多次將同一處理程序綁定到同一元素將導致其執行多次。 這與jQuery的早期版本以及DOM 2 Events規范(通常會忽略重復的事件處理程序)不同。
更多研究提出了.live()方法,但該方法已被棄用。 .on()方法替換了.live()。 所以我的解決方案是:
$(document).on('click', '.like', function(){
var $this = $(this);
likeclick($this,this.id);
});
現在,我不必從.post()方法向加載的頁面(數據)添加函數,也不必使用其他方法來嘗試防止函數觸發兩次。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.