2017-05-30 84 views
3

我有一個Ajax調用,它返回一段HTML代碼,該代碼應該替換頁面上的舊HTML代碼,併爲它們提供新屬性。在成功動態更改元素後,我想運行另一段JS代碼,它讀取並使用動態重新加載的元素的某些屬性。但是,JS傾向於讀取舊數據(就像它正在同步運行一樣)。動態重載元素並在JQuery中讀取它們的新屬性

我找到的唯一解決方法是設置一個計時器,但計時器的延遲時間必須相對較高(300毫秒)以保證它始終正確完成。什麼是正確的方法來做到這一點?

這是我現在所擁有的一個僞代碼。它的工作原理,但300毫秒的延遲時間是可怕的。

$.post("ajax/test.html", function(newCode) { 
    $("#myDynamicDiv").html(newCode); 
    setTimeout(function(){ 
     //Use the data that was just stored in #myDynamicDiv 
    },300); 
}); 
+0

我一直這樣做,它完美的工作,也許它的ajax緩存搞亂你,我總是關掉它,有一個全球性的設置。顯然要確保正在讀取屬性的JS在post函數內部和html插入之下。 – Seabizkit

回答

2

對我來說,我使用.promise().done()可能是它會與你

$("#myDynamicDiv").html(newCode).promise().done(function(){ 
    // your code here 
}); 

編輯工作:要的人誰就會來到這裏後..While我的代碼不與Mohasen工作他自己找到解決方案.. Please find his answer below

+0

這不完全正常,至少在我的情況下,但我看着「完成」和「承諾」,看看我有沒有什麼東西在那裏。一旦我開始工作,我會盡快告訴你! – Mohsen

+0

好的我使用「then」和Deferred對象來工作。我接受了你的回答,因爲它讓我走上了正軌。謝謝! :) – Mohsen

+0

@Mohsen你可以將它添加到我的回答中,用正確的代碼和你的名字[由Mohsen更新和正確的答案]可能會有助於未來的人..有一個偉大的日子:-) –

1

我接受了穆罕默德 - 尤瑟夫的回答,但既然這還沒有包括完整的答案,下面是我最終做的完整版:

JQuery ajax調用在被調用時總是返回一個「Deferred」對象。你可以使用這個對象的「then()」方法在ajax調用完成後運行。這裏是代碼:

dfrd = $.post("ajax/test.html", function(newCode) { 
    $("#myDynamicDiv").html(newCode); 
}); 

dfrd.then(function(){ 
    //Anything that is here is guaranteed to happen after the Ajax call is done. 
}); 
+0

我給你+1這個答案,並指出它在我的答案..有一個偉大的日子:-) –