在阅读了所有可能的解决方案后,我想结合答案。
解决方案 1:绑定/取消绑定
//binding
$(document).bind("ajaxStart.mine", function() {
$('#ajaxProgress').show();
});
$(document).bind("ajaxStop.mine", function() {
$('#ajaxProgress').hide();
});
//Unbinding
$(document).unbind(".mine");
这是一个折旧的解决方案。在 jQuery 1.9 之前,ajax 的全局事件如 ajaxStart、ajaxStop、ajaxError 等可以绑定到任何元素。jQuery 1.9 之后:
从 jQuery 1.9 开始,jQuery 全局 Ajax 事件的所有处理程序,包括使用 .ajaxStart() 方法添加的处理程序,都必须附加到文档。
因此,我们无法将这些事件绑定/取消绑定到自定义命名空间。
解决方案 2:将属性设置global
为false
$.ajax({
url: "google.com",
type: "GET",
dataType: "json",
global: false, //This is the key property.
success: function (data) {
console.log(data);
},
error: function (data) {
console.log(data);
}
});
此解决方案可用于禁用ajaxStart()/ajaxStop()
事件。但是,它也会使 disable ajaxComplete(), ajaxError(), ajaxSend(), ajaxSuccess()
。如果您不使用这些全局事件,似乎还可以,但是当需要时,您必须返回并更改您设置的所有页面的解决方案global: false
。
解决方案 3:使用全局变量
var showLoadingEnabled = true;
$(document).ready(function () {
$('#loading')
.hide() // at first, just hide it
.ajaxStart(function () {
if (showLoadingEnabled) {
$(this).show();
}
})
.ajaxStop(function () {
if (showLoadingEnabled) {
$(this).hide();
}
});
});
function justAnotherFunction() {
window.showLoadingEnabled = false;
$.ajax({
url: 'www.google.com',
type: 'GET',
complete: function (data) {
window.showLoadingEnabled = true;
console.log(data);
}
});
}
不应在 javascript 文件中使用全局变量。但是,这是我能找到的最简单的解决方案。
我更喜欢我的项目的第三种解决方案。