2016-11-04 91 views
-1

我搞亂了jQuery一個AJAX幾天,我走到了死衚衕。我試圖用AJAX加載一些內容 - 這部分工作正常 - 之後我想執行其他腳本。但是,第一個腳本加載的內容在第二個腳本完成之前不會顯示出來。代碼如下所示:

$.ajax({ 
      url : folder, 
      success: function (data) { 
       $(data).find("a").attr("href", function (i, val) { 
        if(val.match(/\.(jpe?g|png|gif)$/)) { 
         var $codeText = "<li class='ui-state-default'><a href='#' data-featherlight='" + folder + val + "'><img src='" + thumbFolder + val + "' data-src='"+ thumbFolder + val + "'/></a></li>"; 
         $("ul[id=sortable]").append($codeText); 
         $("li").featherlight(folder + val); 
        }; 
       }); 
      } 
     }) 

$(window).ajaxComplete(function(){ 
    console.log("Haba"); 
    var x = 0; 
    while(x < 50000) 
     { 
     console.log("Haba nr "+x); 
     x++; 
     } 

整個代碼被觸發,但所有控制檯消息後都會在網站上顯示圖像。有沒有人有任何建議先做什麼來顯示圖片?我也嘗試完成()。和ajaxStop(),仍然沒有效果。

+0

你使用'while'循環阻止瀏覽器執行其他任何操作(如添加/渲染圖像) – Andreas

+0

我試圖找到強制瀏覽器只有在通話完成後才執行while循環。 – filipg

回答

0

爲什麼在將圖片加載到ajax調用的成功函數中後,爲了運行代碼而運行代碼,然後在加載圖片的代碼之後執行該代碼?

$.ajax({ 
    url : folder, 
    success: function (data) { 
     //Code to load pictures 

     console.log("Haba"); 
     var x = 0; 
     while(x < 50000) { 
      console.log("Haba nr "+x); 
      x++; 
     } 
    }); 

我認爲它不是表現你想要的方式運行的原因是因爲Ajax調用完成後,會得到一個響應返回之後。該響應會觸發在ajax調用的成功函數中的邏輯之前運行的ajax完整函數。另外,你寫它的方式,即使你的ajax調用失敗,ajax完整邏輯也會觸發。我認爲你不想要的。

+0

我一開始試過這種方法,沒有奏效。 – filipg

+0

結果是什麼?什麼「不起作用」? – user1289451

+0

我的意思是,我仍然不得不等待所有的代碼執行圖片才能顯示出來。 – filipg

1

你必須使用Ajax中,.done()函數來獲取asynchrone結果:

var jqxhr = $.ajax("example.php") 
 
    .done(function(data) { 
 
    alert("success : " + data ); 
 
    }) 
 
    .fail(function() { 
 
    alert("error"); 
 
    }) 
 
    .always(function() { 
 
    alert("complete"); 
 
    });

+0

之前嘗試過,結果相同 - 必須執行所有代碼,然後才顯示圖片。 – filipg

+0

嘗試使用$ .post或$ .get這是更容易使用 –

+0

謝謝,我會嘗試它,但仍然 - 我想知道我的代碼有什麼問題:) – filipg

0

嘗試使用的setTimeout()

function ajaxDone(){ 
    console.log("Haba"); 
    var x = 0; 
    while(x < 50000) 
    { 
     console.log("Haba nr "+x); 
     x++; 
    } 
} 
$(window).ajaxComplete(function(){ 
    window.setTimeout(ajaxDone,1); 
});