【问题标题】:Why is element not being shown before alert?为什么在警报之前不显示元素?
【发布时间】:2016-08-15 17:42:20
【问题描述】:

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

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

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

更新:

我在 Chrome 版本 52.0.2743.116 m、Windows 10 上表现出这种行为。

【问题讨论】:

  • 好吧,它似乎对我有用(Windows 7 上的 Firefox 47.0.1)。目前无法向您发送屏幕截图,但我可以清楚地看到显示警报时 DOM 上呈现的“元素”字样。
  • 是的,在 Firefox 47.0.1 中也适用于我,在 Chrome 版本 52.0.2743.116 m 上观察到了这种行为。
  • 我也面临同样的问题。有人可以帮忙,如何为 Chrome 浏览器使用或修复它?这是示例narendra-pal-singh.github.io/Web-Development/html/divBox.html

标签: javascript jquery css


【解决方案1】:

它会同步更改样式,如果您read back the value on the next line and show it,您会注意到。

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

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

不过,这取决于浏览器。在 Edge 中它可以正常工作,并且元素会立即显示,但在 Chrome 和 Vivaldi 中却不是。

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

【讨论】:

  • (+1) 换句话说,在某些浏览器中,一个对象的样式状态和它在屏幕上的外观之间的关系是异步更新的,不管样式是如何更新的.
  • 感谢您的回答。这很糟糕。但我想警报对话框不再使用了,所以......
  • @apsillers 确实如此。另一个测试。 -edit- 从评论移到答案
  • @AndreaCasaccia - 如果你想保证在某些 JS 将 JS 放入超时回调函数之前重绘 eg. like this
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-13
  • 1970-01-01
  • 2015-09-11
相关资源
最近更新 更多