如何阻止用户反复单击jQuery AJAX调用?

我有一个带有以下脚本的网页

使用Javascript

function LinkClicked() { var stage = this.id; var stop = $('#ContentPlaceHolderMenu_txtDate').val(); var nDays = $('#ContentPlaceHolderMenu_txtNumberOfDays').val(); $("[id$='spinner']").show(); $.ajax({ type: 'POST', contentType: 'application/json', url: "...", data: "{stage:'" + stage + "',stop:'" + stop + "',nDays:'" + nDays + "'}", success: function (data) { $("[id$='spinner']").hide(); PlotData(data.d); }, error: function () { $("[id$='spinner']").hide(); alert("An error occured posting to the server"); } }); } 

在查询运行时如何阻止用户反复单击? 呼叫来自网格中的单元,无法轻松禁用。 理想情况下,我想在脚本中执行此操作而不禁用DOM上的链接。

在这里,我点击了五次,你可以看到发送了五个AJAX请求。 该页面应该禁用在它已经运行时重复调用的同一个调用。

在此处输入图像描述

提前致谢。

你可以有一个跟踪状态的外部变量

 var linkEnabled = true; function LinkClicked() { if(!linkEnabled){ return; } linkEnabled = false; var stage = this.id; var stop = $('#ContentPlaceHolderMenu_txtDate').val(); var nDays = $('#ContentPlaceHolderMenu_txtNumberOfDays').val(); $("[id$='spinner']").show(); $.ajax({ type: 'POST', contentType: 'application/json', url: "...", data: "{stage:'" + stage + "',stop:'" + stop + "',nDays:'" + nDays + "'}", success: function (data) { $("[id$='spinner']").hide(); PlotData(data.d); linkEnabled =true; }, error: function () { $("[id$='spinner']").hide(); alert("An error occured posting to the server"); linkEnabled = true; } }); } 

这样做的另一个好处是,如果需要,您可以选择启用此function的其他效果,并且只能阻止重复ajax调用。

(注意,理想情况下,您希望将外部变量粘贴在闭包或命名空间中,而不是将其变为全局变量)。

用户单击时禁用按钮,并在从ajax获得响应时将disabled设置为false。

在函数外部声明一个变量,初始值为false:

 var pending = false; 

当你提出请求时,你会做:

 if (pending == true) {return;} pending = true; 

这使得它在您已经运行时停止,并且在请求完成时:

 pending = false; 

现在即使没有按钮,请求也不会多次触发。

另外,您的数据不需要是字符串。 你可以这样做:

 data: {stage: stage, stop: stop, nDays: nDays} 

你可以检查使用它

 var ajax_stat = false function doing_ajax(){ if(ajax_stat) return; ajax_stat = true; var xmlRequest = $.ajax({ type: 'POST', contentType: 'application/json', url: "...", data: "{stage:'" + stage + "',stop:'" + stop + "',nDays:'" + nDays + "'}", success: function (data) { $("[id$='spinner']").hide(); PlotData(data.d); }, error: function () { $("[id$='spinner']").hide(); alert("An error occured posting to the server"); ajax_stat = false; } }); } 

使用下面的代码。 它不会进行多个ajax调用。

 function LinkClicked() { if($(window).data("ajaxRUnning")){ return; } $(window).data("ajaxRUnning",true); var stage = this.id; var stop = $('#ContentPlaceHolderMenu_txtDate').val(); var nDays = $('#ContentPlaceHolderMenu_txtNumberOfDays').val(); $("[id$='spinner']").show(); $.ajax({ type: 'POST', contentType: 'application/json', url: "...", data: "{stage:'" + stage + "',stop:'" + stop + "',nDays:'" + nDays + "'}", success: function (data) { $("[id$='spinner']").hide(); PlotData(data.d); $(window).data("ajaxRUnning",false); }, error: function () { $("[id$='spinner']").hide(); alert("An error occured posting to the server"); $(window).data("ajaxRUnning",false); } }); }