Jquery加载回调不';当有东西真的上膛时不要开火

Jquery加载回调不';当有东西真的上膛时不要开火,jquery,Jquery,我刚转到jQuery1.11.1(在这个项目之前我在1.2.x上)。用于将响应文本/html拉入元素的$.load函数似乎不会突然触发回调 $("#thing").load("page", null, callback); 所以我调试了jquery代码。。正如预期的那样,它使用$.ajax,抓取一个页面,将其放入自用$.html中,然后在$.ajax的“complete”函数上实际触发回调。无论ajax是否成功,此函数都意味着始终启动。在让自己发疯一段时间后,我试着自己调用这些电话来测试我是否

我刚转到jQuery1.11.1(在这个项目之前我在1.2.x上)。用于将响应文本/html拉入元素的$.load函数似乎不会突然触发回调

$("#thing").load("page", null, callback);
所以我调试了jquery代码。。正如预期的那样,它使用$.ajax,抓取一个页面,将其放入自用$.html中,然后在$.ajax的“complete”函数上实际触发回调。无论ajax是否成功,此函数都意味着始终启动。在让自己发疯一段时间后,我试着自己调用这些电话来测试我是否真的发疯了。。这就是我发现的

$.ajax({url:"page"})
            .done(function(r){
                $("#thing").html(r);
            })
            .complete(function(){alert("complete");});
这会填充元素,但不会给我alernt。。但下面的内容确实给了我一个警告!。。为什么?

$.ajax({url:"page"})
            .done(function(r){
                //$("#thing").html(r);
                alert("done...?");
            })
            .complete(function(){alert("complete");});
我完成并完成了警报

更新1

有关使用“始终”而不是“完成”的评论。我想使用“load”而不是“ajax”,这是jq1.11.1中的代码

// Keep a copy of the old load method
var _load = jQuery.fn.load;

/**
 * Load a url into a page
 */
jQuery.fn.load = function( url, params, callback ) {
    if ( typeof url !== "string" && _load ) {
        return _load.apply( this, arguments );
    }

    var selector, response, type,
        self = this,
        off = url.indexOf(" ");

    if ( off >= 0 ) {
        selector = jQuery.trim( url.slice( off, url.length ) );
        url = url.slice( 0, off );
    }

    // If it's a function
    if ( jQuery.isFunction( params ) ) {

        // We assume that it's the callback
        callback = params;
        params = undefined;

    // Otherwise, build a param string
    } else if ( params && typeof params === "object" ) {
        type = "POST";
    }

    // If we have elements to modify, make the request
    if ( self.length > 0 ) {
        jQuery.ajax({
            url: url,

            // if "type" variable is undefined, then "GET" method will be used
            type: type,
            dataType: "html",
            data: params
        }).done(function( responseText ) {

            // Save response for use in complete callback
            response = arguments;

            self.html( selector ?

                // If a selector was specified, locate the right elements in a dummy div
                // Exclude scripts to avoid IE 'Permission Denied' errors
                jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :

                // Otherwise use the full result
                responseText );

        }).complete( callback && function( jqXHR, status ) {
            self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
        });
    }
    return this;
};
//保留旧加载方法的副本
var_load=jQuery.fn.load;
/**
*将url加载到页面中
*/
jQuery.fn.load=函数(url、参数、回调){
如果(url的类型!=“字符串”&&&&U加载){
返回_load.apply(这是参数);
}
变量选择器、响应、类型、,
self=这个,
off=url.indexOf(“”);
如果(关闭>=0){
选择器=jQuery.trim(url.slice(off,url.length));
url=url.slice(0,关闭);
}
//如果它是一个函数
if(jQuery.isFunction(params)){
//我们假设是回调
回调=参数;
参数=未定义;
//否则,构建一个参数字符串
}else if(参数和类型参数==“对象”){
type=“POST”;
}
//如果我们有需要修改的元素,请提出请求
如果(自我长度>0){
jQuery.ajax({
url:url,
//如果“type”变量未定义,则将使用“GET”方法
类型:类型,
数据类型:“html”,
数据:params
}).done(函数(responseText){
//保存响应以在完整回调中使用
响应=参数;
html(选择器?
//如果指定了选择器,请在虚拟div中找到正确的元素
//排除脚本以避免IE“权限被拒绝”错误
jQuery(“”).append(jQuery.parseHTML(responseText)).find(选择器):
//否则使用完整结果
响应文本);
}).complete(回调函数和函数(jqXHR,状态){
self.each(回调,响应| |[jqXHR.responseText,status,jqXHR]);
});
}
归还这个;
};

注意它是如何使用“complete”的。

这里的问题很奇怪。从我的页面返回的HTML无效!虽然它足够有效,可以显示。在“load”方法中,$.parseHTML方法在responseText/html的追加时被调用。这将抛出并返回html,您将看到在目标元素中填充的html


它应该做的可能是捕获这个异常并忽略它,以便每次都调用“complete”方法(因此我认为这是jquery中的一个bug)

.complete
在1.11中不存在,它是
。总是
。不过,您的第一个示例应该有效。删除
null,
这不是我要做的。。这就是实际的jquery“load”方法所做的。。我无法控制这一切。。。我不明白你的评论。我明白了。“完成”实际上并不是以相同的方式删除的。成功和.error是。不过,我的评论的后半部分仍然适用。如果在“完成”代码中故意调用异常,会发生什么?因为这是两者之间唯一的区别。e、 g.扔“猴子”;如果jQueryPromise系统更像本地系统,那么您可以使用.catch.>。调用
.load()
,是否返回了捕获
html
中错误的要求?我想您可以使用monkey-patch$.parseHTML捕获并忽略导致的任何错误,但这样您就永远不会知道是否有无效的html。这是我希望使用完整的jquery源代码开发并部署min版本的内容,因此不允许使用monkey!我在generate页面上找到了这个问题,但是我这里的主要抱怨是“complete”方法并不总是被触发的,即使这是隐含的。ajax可能会失败,但如果内部回调(元素填充)失败怎么办。基本上,这是我的html格式不正确,所以我想这是我自己的问题