使用JS/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;跳到.outerHeight()之间,有些东西还没有更新,经过一番挖掘,我发现了这一点:

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

jQuery';s css方法块,直到完全应用更改?

这似乎是我的实际问题,所以现在的问题是,我如何弄清楚重新绘制是什么时候发生的,我尝试过onloadload事件,但都没有被触发。

我也尝试了在那篇文章中建议的动画代码:

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

但这也没有奏效。

您面临的问题是,您无法真正控制浏览器如何显示更改。正如您所指出的,这些信息并不是立即可用的,即使从技术上讲超时是一种解决方案,但它缺乏优雅性,并危及您的UI进入回调地狱。

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

1.是否在0毫秒内工作

如果它的工作时间为0毫秒,那么基本上UI是在function成功执行之后、事件循环中的下一个function运行之前刷新的。

2.在没有jQuery的情况下进行操作是否会有不同的行为

比较的行为

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

带有

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

等效。如果是这样,那么这就不是jQuery的问题。如果不是,那么这就是jQuery问题。

结论

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

最新更新