[英]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.