2014-10-01 81 views
1

我剛剛移動到jquery 1.11.1(我在1.2.x之前在這個項目上)。用於將響應文本/ html拉入元素的$ .load函數似乎並沒有突然觸發回調!Jquery加載回調不啓動時,實際加載的東西

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

所以我調試了jQuery代碼..如預期它使用$阿賈克斯,抓住一個頁面,它PULS使用$ html的自我,然後回調實際上是對的「完整」的功能解僱$就。無論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

有關使用 「總是」,而不是 「完整」 的評論。我想用「負荷」而不是「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

'.complete'在1.11中不存在,它是'.always'。你的第一個例子雖然應該工作。刪除'空',' – 2014-10-01 16:12:55

+0

這不是我所做的..這就是實際的jquery「加載」方法.. ..我無法控制這個 – 2014-10-01 16:17:19

+0

我...不理解你的評論。 – 2014-10-01 16:17:52

回答

1

這裏的問題是一個奇怪的一個。從我的頁面返回的HTML無效!儘管它足以顯示。在「load」方法內部,在responseText/html的附加處調用$ .parseHTML方法。這會拋出並返回html,你會看到在目標元素中填充的html。

它應該可能做的就是捕獲這個異常並忽略它,這樣每次都會調用「complete」方法(所以我把它看作是jquery中的一個bug)。

+0

如果只有jQuery的承諾系統更像是本地的,那麼你可以使用.Catch。> 。< – 2014-10-01 16:36:37

+0

是否需要在調用'.load()'返回的'html'中捕獲錯誤? – guest271314 2014-10-01 16:39:59

+0

我想你可以使用$ patch的.parseHTML來捕獲和忽略任何引起的錯誤,但是你永遠不會知道如果你有無效的html。 – 2014-10-01 16:41:52