单击1后禁用jqueryfunction,以防止多次执行
我有以下function,它可以获取超出默认情况下显示的20个以上的注释
$('.more_comments_link').live('click', function() { $(".more_comments_link").text("Fetching More Comments ..."); var ajaxOpts = { type: "get", url: "ajax_getcomments.php", dataType: 'json', data: "&itemid=&type=1&owner=&more=1", success: function(data) { $('.discussion-more').after(data); $(".discussion-more").hide(); } }; $.ajax(ajaxOpts); return false; });
它的工作原理,唯一的问题是,用户可以非常快速地点击按钮3次,并且它会向ajax_getcomments.php发送3个请求,每次都获得相同的结果集。
我尝试添加
$(".more_comments_link").unbind('click');
但它没有做任何事情。
初始结果集也是用jquery获取的,因此我使用.live(click'
不确定它是否与它不起作用有关。
live
不与unbind
– 你需要die
不是。
但是有一个更好的解决方案。 由于您可能希望能够多次更新内容,因此可以设置变量以查看当前是否正在运行请求:
var requestRunning = false; $('.more_comments_link').live('click', function () { if (requestRunning) { // don't do anything if an AJAX request is pending return; } $(".more_comments_link").text("Fetching More Comments ..."); var ajaxOpts = { type: "get", url: "ajax_getcomments.php", dataType: 'json', data: "&itemid= echo $id; ?>&type=1&owner= echo $event[" data "][" e_creator "]; ?>&more=1", success: function (data) { $('.discussion-more').after(data); $(".discussion-more").hide(); }, complete: function() { requestRunning = false; } }; requestRunning = true; $.ajax(ajaxOpts); return false; });
对于一个非常简单的解决方案,所有这些解决方案都非常复杂; 根据以下文档使用.one():
只需将live
更改为one
。 见下文:
$('.more_comments_link').one('click', function() {
您可以使用.die()
取消绑定.live()
事件。
-
live
-
die
或者在其他位置设置一个标记,表示请求正在进行中,并在单击处理程序的开头检查。
尝试使用disabled关键字。 这样您就不必解除绑定function,只需将其禁用即可:
$('.more_comments_link').live('click', function() { $(this).attr("disabled", true); $(".more_comments_link").text("Fetching More Comments ..."); var ajaxOpts = { type: "get", url: "ajax_getcomments.php", dataType: 'json', data: "&itemid= echo $id; ?>&type=1&owner= echo $event["data"]["e_creator"]; ?>&more=1", success: function(data) { $('.discussion-more').after(data); $(".discussion-more").hide(); } }; $.ajax(ajaxOpts); return false; });
根据您的使用情况,您可能不必使用live ,在这种情况下,您可以完全按照自己的意愿执行操作。
$('.more_comments_link').live('click', function(e) { if($(e.target).data('oneclicked')!='yes') { $(this).text("Fetching More Comments ..."); var ajaxOpts = { type: "get", url: "ajax_getcomments.php", dataType: 'json', data: "&itemid= echo $id; ?>&type=1&owner= echo $event["data"]["e_creator"]; ?>&more=1", success: function(data) { $('.discussion-more').after(data); $(".discussion-more").hide(); } }; $.ajax(ajaxOpts); return false; } $(e.target).data('oneclicked','yes'); });
对我来说,这工作:
$('.more_comments_link').live('click', function() { if(e.handled !== true) // This will prevent event firing more than one time { e.handled = true; //your code here... } });
我的解决方案,在所有ajax请求上全局工作,如果是活动请求,则具有相同URL的新请求将被中止。 工作正常。
var activeRequests = []; $(document).ajaxComplete(function(e, jqxhr, settings) { var i = activeRequests.indexOf(settings.url); if (i != -1) { setTimeout(function(){ activeRequests.splice(activeRequests.indexOf(settings.url), 1); }, 75); } }); $(document).ajaxSend(function(e, jqxhr, settings) { var i = activeRequests.indexOf(settings.url) if (i != -1) { jqxhr.abort(); activeRequests.push(settings.url); } });
您可以使用:
$('element').off()
这将禁用您正在收听的组件的任何事件
您只需单击网页上的按钮即可使用
$('button id or classs').one('click',function(){ });