为什么元素没有在警报之前显示?

IT技术 javascript jquery css
2021-03-16 21:30:54

在这个简单的例子中https://jsfiddle.net/4rsje4b6/1/为什么#test在警报出现之前没有显示元素?

jQuerycss()方法不应该是同步的吗?

#test {
  display: none;
}
<span id="test">Element</span>
$("#test").css("display", "inline");
alert("Showed element!");

更新:

这种行为在 Chrome 版本 52.0.2743.116 m、Windows 10 上对我来说很明显。

1个回答

它同步更改样式,如果您读回下一行的值并显示它,您会注意到

$("#test").css("display", "inline");
alert("Showed element!" + $("#test").css("display"));

但是样式对象的更改会触发向页面渲染器发送重绘请求消息,一旦浏览器空闲,即在此脚本例程结束后,就会立即处理该消息。

不过,这取决于浏览器。在 Edge 中它工作正常,元素会立即显示,但在 Chrome 和 Vivaldi 中则不然。

另一个测试浏览器如何处理这个问题:如果你调整浏览器窗口的大小,JSFiddle 将缩放(每个区域保持相同的相对大小)。如果您在打开警报的情况下调整 Vivaldi 浏览器的大小,则不会这样做。事实上,如果你把它变小,然后显示警报,然后让它变大,你只会在新空间中得到一个灰色区域,直到你关闭消息框。在 Edge 中,fiddle 只会在后台调整大小,即使整个浏览器窗口都是灰色的,所以这不仅仅是处理时间的问题,更重要的是 Chrome 在打开警报时完全冻结页面。

@AndreaCasaccia - 如果你想保证在某些 JS 将该 JS 放入超时回调函数之前重新绘制,例如。像这样
2021-04-17 21:30:54
谢谢你的回答。这很糟糕。但我想警报对话框不再使用了,所以......
2021-04-19 21:30:54
@apsillers 确实如此。另一个测试。-edit- 从评论移到回答
2021-05-03 21:30:54
(+1) 换句话说,在某些浏览器中,对象的样式状态与其在屏幕上的外观之间的关系具有异步更新的关系,而不管样式如何更新。
2021-05-11 21:30:54