实际加载某些内容时,Jquery加载回调不会触发

时间:2014-10-01 16:10:24

标签: jquery

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

$("#thing").load("page", null, callback);

所以我调试了jquery代码..正如预期的那样,它使用$ .ajax,抓取一个页面,使用$ .html在自己中播放它然后回调实际上是在$ .ajax的“完整”函数上触发的。无论ajax是否成功,此功能始终始终触发。在驾驶自己INSANE一段时间之后,我试着自己调用这个电话来测试我真的不会发疯..这就是我发现的

$.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

关于使用“always”而不是“complete”的评论。我想使用“load”而不是“ajax”,这是jq 1.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;
};

注意它如何使用“完整”..

1 个答案:

答案 0 :(得分:1)

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

应该做的是捕获此异常并忽略它,以便每次调用“完整”方法(所以我将其视为jquery中的错误)。