jQuery.remove()真的是同步的吗?

时间:2017-09-05 08:07:47

标签: javascript jquery

我在Ajax请求的成功块中遇到以下代码:

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

执行时,我预计它会完成删除'某事'并在之后弹出警告,但由于某种原因警报弹出,并且只有在确认元素被删除后才会弹出。

为什么会这样?这是微不足道的代码,我想避免回调等。我该怎么检查?

它在FF上测试过。感谢您的提示。

2 个答案:

答案 0 :(得分:5)

作为T.J.克劳德在他的answer中说道。

  

DOM操作(插入元素,删除它们,移动它们)是   同步,虽然用户可能看不到你的结果   JavaScript代码完成,让浏览器使用该线程   重新绘制显示。

答案 1 :(得分:3)

就像Ivan Minakov said in his answer一样,为了在警报之前看到重新绘制的页面,您必须让JavaScript代码完整。发生这种情况后,您可以安排继续 - 显示警报。

通常情况下,这不会发生在JavaScript中 - 类似警报和提示的功能在他们实际阻止线程直到用户操作的意义上是例外的。

这意味着您可以通过以下方式实现目标:

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

或async / await如果那是你的事情:

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

// ...somewhere...

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