javascript - 为什么可以通过同步脚本测量刚刚附加的 DOM 元素?
问题描述
根据事件循环基础知识和视频,在所有 JS 脚本完成后执行重新渲染任务。像素流水线
但是,如果将元素同步添加到 DOM 并测量宽度或高度,而无需等待重新渲染 - 它可以工作!甚至可以更改元素的内容并再次测量 - 仍然有效。
那么,为什么会这样呢?
let element = document.createElement('div');
Object.assign(element.style, {
'position': 'absolute',
'float': 'left',
'whiteSpace': 'nowrap',
'visibility': 'hidden',
'font': '12px arial',
'display': 'inline-block'
});
element.innerText = 'some text';
document.querySelector('body').appendChild(element);
// Why does it work? According to the video,
// I need to wait when async render task be completed, isn't it?
console.log(element.offsetWidth);
解决方案
确实,浏览器通常会批量更改 dom 并在动画帧出现时一次性应用它们。但是,如果您要求一个取决于该渲染是否完成的值(例如获取宽度),浏览器可能会被迫立即进行重排以便为您提供答案。这通常应该避免,因为它可能是一个性能问题。
推荐阅读
- javascript - 用于多人游戏的 Socket.io 与 WebRTC DataChannel
- java - 在 kafka 中应用 SMT 后删除接收器数据库中的行不起作用
- android - 我正在学习 Nativescript,我被困在一个创建国家、州和城市列表视图的场景中
- php - Understanding how calling a protected method belonging to one object works under a different object
- java - JoinPoint 或 ProceedingJoinPoint 的对象怎么会调用方法呢?
- xml - 使用目标 XML 上的 XSLT 转换属性将 XML 转换为 XML
- math - “反转” x(integer) 给出三角图的 y=0
- python - 无法弄清楚为什么我收到语法错误
- r - geom_ribbon 跳过可用数据(有时)
- botframework - 在 Microsoft BOT 框架中添加两条消息之间的延迟