2017-09-05 55 views
0

我面對下面的代碼在Ajax請求的成功塊:jQuery.remove()是否真的同步?

$('#something').remove(); 
alert('something was removed'); 

執行時我預期完成刪除「東西」,之後彈出一個警告,但由於某種原因警報彈出並且只有在確認元素被移除之後。

這是爲什麼發生?這是微不足道的代碼,我想避免回調等。我應該檢查什麼?

它在FF上進行了測試。感謝您的提示。

+1

DOM是同步更新的,也許在頁面之前沒有呈現警報? – Kos

+0

其offcourse同步 –

+0

嘗試使用'console.log'而不是'alert'? – evolutionxbox

回答

3

就像Ivan Minakov said in his answer一樣,爲了看到在警報之前重新繪製的頁面,您必須讓JavaScript代碼完整。發生這種情況後,您可以安排繼續 - 顯示警報。

通常,這不會發生在JavaScript中 - 像alert和prompt這樣的函數是例外的,因爲它們在用戶行爲之前實際上阻塞了該線程。

這意味着你可以達到你想要的東西:

$('#something').remove(); 
setTimeout(() => { 
    alert('something was removed'); 
}); 

或異步/等待,如果這是你的事:

// in an async function 
$('#something').remove(); 
await delay(0); 
alert('something was removed'); 

// ...somewhere... 

function delay(ms) { 
    return new Promise(resolve => setTimeout(resolve, ms)); 
} 
+0

非常感謝。 – Dropout

+0

@Kos爲什麼只有當'alert'在setTimeout時纔有效?起初,我把'$('#something')。remove()'放到setTimeout(而不是alert)中,但它不起作用。 – juice

+0

@juice聽起來像一個無關的問題,它應該工作 – Kos

5

As T.J.

DOM操作(插入元素,刪除它們,移動它們)是 同步的,雖然用戶可能無法看到結果,直到你的 JavaScript代碼完成,讓瀏覽器使用線程:克勞德在他answer說 重新繪製顯示。

+0

因此,基本上即使在渲染髮生之前,警報也會執行,而不是自定義的模式窗口,因爲自身必須渲染而等待渲染?只是想確認一下。 – Dropout

+0

@Dropout正好。 – Stavm

+0

非常感謝。我會對此表示讚賞,因爲這是一個很好的解釋,但我會標記@Kos提到的解決方法,作爲答案。再次感謝。 – Dropout