是否可以在浏览器中检测重绘/重排
Is it possible to detect repaint/reflow in the browser?
不确定是否有解决此问题的方法。我想知道是否有办法检测浏览器何时实际更新 UI。
假设我想在运行长时间运行的同步代码块之前向元素添加一个类,在同步函数运行之后,该类将被删除。
el.classList.add('waiting');
longRunningSynchronousTask();
el.classList.remove('waiting');
如果我运行此代码,长时间运行的任务将启动,并在添加类之前阻止 UI。我尝试使用 MutationObserver
的,并使用 getComputedStyle
检查元素,但这不起作用,因为这些不会反映实时更新 UI 的时间。
可能是最好的解决方案(删除工作线程中长时间运行的代码,并在完成后发布消息以删除类)。这不是我真正的选择,因为需要支持较旧的浏览器。
在实现工作线程之外唯一有效的解决方案是使用 setTimeout
.我很想知道是否有人遇到过这个问题,以及是否有任何方法可以在浏览器中检测 UI 的重绘/重排。
请参阅我的示例以更好地说明问题。
const el = document.querySelector('.target');
const isRed = c => c === 'red' || 'rgb(255, 0, 0)';
let classActuallyApplied = false;
let requestId;
const longRunningTask = (mil, onComplete) => {
if (classActuallyApplied) {
cancelAnimationFrame(requestId);
var start = new Date().getTime();
while (new Date().getTime() < start + mil);
onComplete();
} else {
requestId = requestAnimationFrame(longRunningTask.bind(null, mil, onComplete));
}
}
const observer = new MutationObserver(function(mutations) {
classActuallyApplied = mutations
.filter(mutation => {
return mutation.type === 'attributes' &&
mutation.attributeName === 'class' &&
mutation.target.classList.contains('waiting');
}).length > 0;
});
const observerConfig = {
attributes: true,
childList: false,
characterData: false
};
observer.observe(el, observerConfig);
el.addEventListener('click', e => {
el.classList.add('waiting');
longRunningTask(1000 * 5, () => {
// el.classList.remove('waiting');
});
});
.target {
height: 100px;
width: 100px;
background-color: gray;
}
.waiting {
background-color: red;
}
<div class="target">
target
</div>
我相信requestIdleCallback就是你要找的。
2016 developers.google.com 日起:
就像采用requestAnimationFrame允许我们正确调度动画并最大限度地提高达到60fps的机会一样,requestIdleCallback将在帧末尾有空闲时间或用户处于非活动状态时安排工作。
这是一项实验性功能,但(截至 2021 年 3 月)大多数现代浏览器都支持此功能。请参阅 MDN 兼容性表和 caniuse.com。
相关文章:
- 访问布局信息是否也会导致浏览器重排
- 如何检测是否有溢出
- 如何检测用于WebGL的专用或集成显卡
- 防止Alt+Shift默认操作或检测多种操作系统语言的Javascript
- 如何在使用selectBoxIt JQuery插件时检测选项更改
- 如何使用密码检测网络中的状态连接
- 使用JavaScript检测Flash
- 在不阻止默认行为的情况下检测IE10中的缩放
- 检测个位数整数时正在转换毫秒
- 检测电话窃听,即:<a href="电话:xxx">在UIWebview上
- 动态插入的表:JQuery未检测到最后一行
- 检测页面上某个元素中选择(突出显示)或单击的内容
- jQuery检测浏览器是否支持Zoom
- 检测iframe是否跨域的愚蠢方法
- 检测图像分辨率
- 如何检测第三方广告服务器请求
- 我是否可以检测到javascript正在被卸载(作为调试模式)
- 当没有文本输入聚焦时检测空格键按下
- 正在检测导航到<a name=“;最新主题”></a>
- 是否可以在浏览器中检测重绘/重排