Javascript 未启动AJAX完整处理程序

Javascript 未启动AJAX完整处理程序,javascript,jquery,ajax,events,Javascript,Jquery,Ajax,Events,在我的Web应用程序后端进行了一些艰苦的工作之后,我注意到GetMeasure请求需要10秒才能完成。我决定应用一个覆盖,这样潜在的用户就不会因为屏幕上什么都没有发生而感到困惑。不管请求是否成功,覆盖层都应该在调用后被删除——因此使用完整的处理程序应该是最好的选择——至少我认为是这样。我真的不明白为什么,但与成功处理程序相反,完整的处理程序不会被调用 AJAX请求: $_loadingCircle = $('<img id="loading" src="http://www.obergur

在我的Web应用程序后端进行了一些艰苦的工作之后,我注意到GetMeasure请求需要10秒才能完成。我决定应用一个覆盖,这样潜在的用户就不会因为屏幕上什么都没有发生而感到困惑。不管请求是否成功,覆盖层都应该在调用后被删除——因此使用完整的处理程序应该是最好的选择——至少我认为是这样。我真的不明白为什么,但与成功处理程序相反,完整的处理程序不会被调用

AJAX请求:

$_loadingCircle = $('<img id="loading" src="http://www.obergurgl.com/_images/layout/loading.gif"/>');
PopulateOverlay($_loadingCircle);
$.ajax({
    url: 'CoDTracker/Home/GetMeasures',
    type: 'POST',
    dataType: "html",
    data: {
        buID: buid,
        aID: aid,
        lID: lid
    },
    success: function (data) {
        $('#measures').html(data);
    },
    complete: function () {
        $_overlay.remove();
    }
});
$\u loadingCircle=$('');
PopulateOverlay($_loadingCircle);
$.ajax({
url:'CoDTracker/Home/GetMeasures',
键入:“POST”,
数据类型:“html”,
数据:{
buID:buID,
援助:援助,
盖子:盖子
},
成功:功能(数据){
$('#measures').html(数据);
},
完成:函数(){
$\u覆盖。删除();
}
});
请求以状态200(成功)结束,但覆盖不会被删除。我确信请求已完成,因为我的度量值已填充到页面中,而圆圈旋转得很疯狂,而不是消失

我做错什么了吗

编辑:

覆盖定义

function PopulateOverlay($content) {
    $_overlay = $('<div class="overlay">');
    $content.appendTo($_overlay);
    $_overlay.appendTo('body');
}
函数PopulateOverlay($content){
$_叠加=$('');
$content.appendTo($\u覆盖);
$_overlay.appendTo('body');
}

您的
$\u覆盖定义不正确。
请使用:

$_overlay = $('div.overlay');
有关更多信息,请参阅jQuery选择器: 选择具有特定类的div的方法不是复制整个
,而是像我在上面的示例中所做的那样

编辑:事实上,如果您进行此更改,您的PopulateOverlay将不再工作,因此您应该选择它而不将其分配给变量:

complete: function () {
    $('div.overlay').remove();
}

您的
$\u覆盖定义不正确。
请使用:

$_overlay = $('div.overlay');
有关更多信息,请参阅jQuery选择器: 选择具有特定类的div的方法不是复制整个
,而是像我在上面的示例中所做的那样

编辑:事实上,如果您进行此更改,您的PopulateOverlay将不再工作,因此您应该选择它而不将其分配给变量:

complete: function () {
    $('div.overlay').remove();
}

因为覆盖是附加在DOM中的,所以应该使用
.class

complete: function () {
    $('.overlay').remove();
}

因为覆盖是附加在DOM中的,所以应该使用
.class

complete: function () {
    $('.overlay').remove();
}

首先,如果没有错误,这就是所有的代码,它应该可以正常工作。 让我们试着做一个例子,使用
mimic
函数来模拟ajax complete的行为,我们可以这样编写:

var$\u overlay=null;//我们假设您在某个地方定义了它,并且它对您的所有函数都是可见的。
函数PopulateOverlay($content){
$_叠加=$('');
$content.appendTo($\u覆盖);
$_overlay.appendTo('body');
}
//将此视为延迟2秒的ajax调用。
函数模拟(cb){
设置超时(cb,2000);
}
功能工程(){
$someEle=$('example');
人口覆盖($someEle);
模拟(函数(){
$\u覆盖。删除();
});
}
$(函数(){
theWorks();
});
.overlay{
显示:块;
宽度:100px;
高度:100px;
背景色:黑色;
}
.举例{
颜色:青色;
}

首先,如果没有错误,这就是您的全部代码,它应该可以正常工作。 让我们试着做一个例子,使用
mimic
函数来模拟ajax complete的行为,我们可以这样编写:

var$\u overlay=null;//我们假设您在某个地方定义了它,并且它对您的所有函数都是可见的。
函数PopulateOverlay($content){
$_叠加=$('');
$content.appendTo($\u覆盖);
$_overlay.appendTo('body');
}
//将此视为延迟2秒的ajax调用。
函数模拟(cb){
设置超时(cb,2000);
}
功能工程(){
$someEle=$('example');
人口覆盖($someEle);
模拟(函数(){
$\u覆盖。删除();
});
}
$(函数(){
theWorks();
});
.overlay{
显示:块;
宽度:100px;
高度:100px;
背景色:黑色;
}
.举例{
颜色:青色;
}

控制台中有任何错误吗?请告诉我们如何定义
$\u overlay
,因为从上面的示例来看,这个变量(即对象)没有在任何地方定义。仅仅因为覆盖层没有被隐藏,并不意味着
完成:
不会触发。事实上,我认为您的问题在于
$\u覆盖层
。您可以通过添加
console.log('helloworld!')来测试这一点complete:function(){}
中的code>是一个函数中的所有代码,您会多次调用该函数吗?我认为您在运行ajax请求时正在重新定义
$\u overlay
,可能是通过多次调用
PopulateOverlay()
来实现的。您的问题缺少控制台中任何错误的相关上下文?请告诉我们如何定义
$\u overlay
,因为从上面的示例中,此变量(即对象)没有在任何地方定义。仅仅因为覆盖层没有被隐藏,并不意味着
完成:
不会触发。事实上,我认为您的问题在于
$\u覆盖层
。您可以通过添加
console.log('helloworld!')来测试这一点complete:function(){}
中的code>是一个函数中的所有代码,您会多次调用该函数吗?我认为您在运行ajax请求时正在重新定义
$\u overlay
,可能是通过多次调用
PopulateOverlay()
来实现的。您的问题缺少相关的上下文,似乎OP想要定义一个新的div,而不是针对DOMOP中已经存在的任何div,实际上OP正在尝试两者兼而有之。div是使用PopulateOverlay函数创建的。一旦AJAX请求完成,它就会被删除。如果我自己做类似的事情,我会将
放在我的HTML中,但只是隐藏,然后在AJAX请求发出时使其可见