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