javascript - 在同步 ajax 调用期间将鼠标指针设置为忙碌

标签 javascript jquery ajax asynchronous

我的站点中有很多 ajax 调用,根据数据的大小,它可以让用户等待 2-4 秒。所以我想在从服务器加载数据时将鼠标样式更改为“忙碌”。我已经发现,异步 ajax 调用可以通过使用这样的全局代码很好地完成:

$(document).ajaxSend(function (){
    $('body').addClass('wait');
}).ajaxComplete(function () {
    $('body').removeClass('wait');
});

效果很好。问题是,我应该如何处理那些同步功能? 我在某处需要 async: false。因此,如果没有其他方法可以解决它。我宁愿在每个同步 ajax 调用中手动编写相同的代码,也不愿将每个 ajax 调用重写为异步。因为把假的变成真并不容易。我找到的唯一方法是在 ajax 调用之前和 ajax 调用之后(我的意思是成功)手动添加代码,如下所示:

$('html, body').css("cursor", "wait");
$.ajax({
  url: //your url
  type: //your type post or get 
  dataType: "html",
  data: //data send by ajax
  success: function(returnData) {
    $('html, body').css("cursor", "default");
    //any other actions ....
  },
  error: function(e) {
    alert(e);
  }
});

它会工作,但我有 20 多个 js 文件,我什至不知道我有多少 ajax 调用。所以我想问一下是否有另一种方法可以解决这个问题,这样我就不需要在每个 ajax 调用中编写 50 多次相同的代码?

最佳答案

您可以监听 ajaxSendajaxComplete 事件,并在您的 body 上切换一个 CSS 类,根据需要启用/禁用加载指针

var $body = $('body');
$(document).ajaxSend(function(){
    $body.addClass('loading');
});

$(document).ajaxComplete(function(){
    $body.removeClass('loading');
});
body.loading{
    cursor: progress; // Or any other type you want
}

如果您计划并行跟踪多个 AJAX 请求,您可能需要注册一个计数器。您可以在每次发生 ajax 调用时递增计数器,在调用完成时递减计数器,如果计数器达到零则删除加载类

关于javascript - 在同步 ajax 调用期间将鼠标指针设置为忙碌,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48380928/

相关文章:

javascript - 我如何显示我的 table ?

javascript - 如何使状态栏/地址栏在 Firefox 或 IE 中消失?

javascript - d3.nest 具有多列

javascript - Div 在 Safari 10.0.1 上未正确呈现(就像是否存在溢出 :hidden somewhere but there isn't)

JQuery 滚动按钮不适用于某些浏览器和移动设备

javascript - 使用javascript循环遍历fileList

javascript - Angular 1.5 在 ng-repeat 上隐藏重复值

javascript - jquery 设置所有复选框被选中

jquery - 使用 jquery 最接近选择第一个 <td> 值

php - 如果 3 个 Ajax 返回中只有 2 个是 Json,则 JQuery 不起作用