javascript - 使用 JS/Jquery 动态更改元素时,等待元素的 css 更新

标签 javascript jquery css

因此,在对我遇到的问题进行了大量搜索之后,我发现我遇到的问题是,因为当我将 css 应用于元素时,信息不会立即可用,这就是我的意思:

我有一个元素,我用 display: block;display: none; 隐藏和显示,问题是在我显示该元素后,我需要获取其高度:

$element.css({ display: "block"});

console.log($element.outerHeight()); // <- this returns 0

所以我开始在某个时候尝试超时,即使超时为 1 毫秒,它仍然可以工作并返回正确的高度:

setTimeout(() => {
    console.log($element.outerHeight()); // with 1ms timeout, it works and gives real height
}, 1)

弄清楚这一点后,1毫秒的延迟不可能是某种继承的转换或任何东西,所以这让我想到,也许是在从 display: block; 的跳转之间。 externalHeight() 有些东西还没有更新,经过一番挖掘后我发现了这个:

引用:“由于 jQuery 使用内联样式更新标记,并且浏览器决定何时重新绘制,因此您将在不同的浏览器中看到不同的行为。”

Does jQuery's css method block until the change is fully applied?

这似乎是我的实际问题,所以现在的问题是,我如何确定重绘何时发生,我尝试过 onload, load事件,但没有一个被触发。

我还尝试了该帖子中建议的动画代码:

$element.animate({
  display: 'block'
}, {
  duration: 0,
  done: function(animation, jumpedToEnd) {
    console.log($element.outerHeight());
  }
})

但这也不起作用。

最佳答案

您遇到的问题是您无法真正控制浏览器如何显示更改。正如您所指出的,这些信息并不是立即可用的,尽管超时在技术上是一种解决方案,但它缺乏优雅性,并且会危及您进入callback hell的用户界面。 .

为了查看更优雅的解决方案是否有效,您需要测试的是

1。是否0毫秒有效

如果它的工作时间为 0 毫秒,那么基本上,UI 会在成功执行 function 之后和 event loop 中的下一个 function 之前刷新。正在运行。

2。不使用 jQuery 的行为是否有所不同

比较行为

$element.css({ display: "block"});

for (let index = 0; index < $element.length; index++) {
    $element[index].style.display = "block";
}

是等价的。如果是这样,那么这不是 jQuery 的问题。如果不是,那么这是一个 jQuery 问题。

结论

作为一般指导,您可能需要类似回调的行为,并且为了实现这一点,您可能需要使用 promise architecture 。如果有效的话。

关于javascript - 使用 JS/Jquery 动态更改元素时,等待元素的 css 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65448012/

相关文章:

javascript - 如何将部分数据转换为 HTML

javascript - asp.net 中的部分粗体文本

angularjs - 无法让 ng-animate 移除 ng-hide

javascript - JS API 文档 [, arg ] vs , [ arg ]

java - 在客户端 (GWT) 更新 Web 应用程序的最佳实践

javascript - 无法将从 api 提供的数据中检索到的背景图像添加到 div node.js

Jquery .find() .animate 不工作

html - 通讯边框错误

Javascript - 更改事件对象同级上的文本

javascript - Apache Flex 的 future 版本是否支持将 MXML 和 ActionScript 交叉编译为 JavaScript?