首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >JavaScript中的什么机制会导致DOM或CSSStyleDeclaration中的更改触发页面的重绘?

JavaScript中的什么机制会导致DOM或CSSStyleDeclaration中的更改触发页面的重绘?
EN

Stack Overflow用户
提问于 2013-05-04 12:01:24
回答 2查看 184关注 0票数 2

我认为我们理所当然地认为,每当我们更改DOM元素的属性或其CSSStyleDeclation对象的属性时,页面都会被重绘:

http://jsfiddle.net/peqtL/

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
document.getElementById("foo").innerHTML = "bar";
document.getElementById("foo").style.padding = "30px";

但是仔细想想,.style返回一个CSSStyleDeclaration对象,而padding返回一个属性。现在我们只需设置一个属性,那么如何触发并使页面看起来不同呢?

我在想,这是不是经典的"Observer Pattern",页面渲染器注册每个DOM元素和CSSStyleDeclaration对象,每当属性改变时,通知渲染器重新绘制页面的一部分?

或者,即使我们更改了某些内容,整个页面也会受到影响:例如,z-index将影响自身和所有兄弟节点的“覆盖”顺序,因此我们需要重新绘制父节点并向下绘制树,或者如果元素具有position: relativeposition: absolute,它可能会影响页面上的任何元素,因此需要重新绘制整个页面。因此,换句话说,渲染器可能不需要向每个DOM元素及其CSSStyleDeclaration对象注册。渲染器只需要注册顶级DOM对象( document<html>标记元素,它是document.documentElement,一个简单的实现是,对其属性或其后代的属性的任何更改,然后通知渲染器重新绘制整个页面。只要我们简单地获取属性的值,就不需要通知渲染器重新绘制页面。

这个“观察者模式”是DOM和JavaScript引擎的内部模式--也就是说,我们不能真正接触或知道它是如何在底层完成的?

我知道它的实现应该是隐藏的,对于使用超文本标记语言和JavaScript的用户来说是未知的,但从编程的角度来看,我希望知道作为软件系统的一部分,什么是一种实用的实现方式。

EN

回答 2

Stack Overflow用户

发布于 2013-05-21 15:26:10

实现此模式的一个好方法是使用css类。您应该避免修改每个HTML元素的DOM特性。若要修改HTML元素集的可视方面或添加新类,请执行以下操作。在下面的示例中,可以看到一个简单的示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    //html
    First name: <input type="text" id="fmame" class="mandatory">
    Last name:  <input type="text" id="lname" class="mandatory" value="Blablabla">

    //javascript
    var inputs = $("input");
    for (var i = 0, j = inputs.length; i < j; i++) {
        if (inputs[i].className === 'mandatory' && inputs[i].value === '')
            inputs[i].className += ' error';
    }

    //css
    .error {
        background-color: red;
    }
票数 0
EN

Stack Overflow用户

发布于 2015-02-19 02:10:12

观察者模式

似乎所有的布局引擎(Gecko、Trident和WebKit)都在DOM (according to this doc)上实现侦听器,这意味着它们实现了Observer pattern。实际上,每个节点都有一个附加的侦听器。

According to a certain Lindsey Simon,更新可以在任何方向触发回流,直到树上的任何端点,但布局引擎尝试尽可能减少回流和重绘计算。我会解释..。

www-archive.mozilla.org中,Gecko调用reflow有几个原因,每个原因都有不同的计算结果,包括InitialResize (相当明显)。这里相关的是incremental

增量回流

当脚本操作DOM或资源已完成异步加载(如图像)时的...occurs。Gecko将此称为“增量”,因为它试图“尽可能多地重用现有状态”(source)。当您修改DOM节点时,监听程序会自动向异步队列添加一个回流请求。为了优化队列的评估,Gecko将"coalesce",或者在共享一个目标的队列中组合类似的回流请求。不再相关的回流请求被删除(例如,如果目标帧被删除)。

高效的DOM操作

有一些方法可以明确地避免在脚本中触发不必要的回流。

在将document fragments上的

  • 操作添加到DOM节点之前,它们不会触发回流。display:none
  • 节点在更改其显示类型之前不会触发回流,即使您通过脚本对对象执行样式更改也是如此。
  • 如果要执行有效的动画,position:absolute不会向其父级发出回流,因为它已从流中删除。<代码>H224<代码>F225

请注意,从DOM读取属性还可以强制队列求值,因此信息是准确的。

我希望这是有用的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16374053

复制
相关文章
[93]怎样在Ubuntu中设置环境变量
首先启动终端。 单击屏幕左上角的Ubuntu图标,在弹出的窗口中点击搜索栏,输入“terminal”, 稍等片刻,终端就会赫然在目!二话不说,直接点击! 然后打开环境设置文件。 Ubuntu的环境设置文件为/etc/profile。它本质上是一个Shell脚本,其中存储了每次启动系统或终端时都要运行的命令。 在终端中输入"sudo gedit /etc/profile",回车,然后输入管理员密码后回车,即可打开。 加入环境变量设置语句。 Linux系统中,设置环境变量的语
周小董
2022/04/12
9.8K0
[93]怎样在Ubuntu中设置环境变量
在 Heroku 上部署 Django 应用
Heroku是一个很棒的平台,它有很多的控件,并且搭建环境相对来说也比较容易。本指南中,我将一步一步指导你在Heroku平台上部署一个简单地Django应用。
星哥玩云
2022/07/03
1.6K0
android在代码中怎么设置 RadioGroup的默认值
这种需求一般是   个人中心 需要的   当用户修改了个人资料之后,下次在修改的话需要从服务器中拿到数据   
wust小吴
2019/07/08
5.2K0
html中如何设置默认图片?
大家可能都知道img标签是怎么设置默认图片的,但是你知道background-img是如何设置默认图片的嘛?
Javanx
2019/09/04
5K0
html中如何设置默认图片?
SAP中默认参数设置
在SAP项目中,我们经常会碰到配置输入默认值的情况,为了避免每次都要输入这些默认值,我们可以设置这些参数自动填充,方便为某些特定用户自动带出一些参数值。
matinal
2020/11/27
2K0
SAP中默认参数设置
node环境中设置process环境变量
node中有全局变量process表示当前node进程,process(进程)其实就是存在node中的一个全局变量,process.env包含着关于系统环境的信息。但是process.env中并不存在NODE_ENV这个东西。其实NODE_ENV只是一个用户自定义的变量。
biaoblog.cn 个人博客
2022/08/11
4.1K0
5.移植uboot-设置默认环境变量,裁剪,并分区
在上一章使uboot支持网卡传输文件后,但是每次启机时,环境变量都要变为默认值,需要重新设置ip,MAC地址才行,由于没有配置mtdparts命令,启动内核也不成功
诺谦
2019/05/24
3K0
在Ubuntu_meta 16.04中设置默认Python3.5的命令
ubuntu_meta 默认是安装了python2.7 和python3.5两个版本
墨文
2020/02/28
1.2K0
在Ubuntu_meta 16.04中设置默认Python3.5的命令
pycharm中设置默认浏览器
我们用pycharm开发web项目的时候,是需要浏览器才能运行的,那么怎么设置默认浏览器呢?下面给大家分享一下!
小海怪的互联网
2020/10/18
2.2K0
Eclipse中Maven默认JDK版本设置
解决办法:Elipse Preference设置中可以指定Maven settings.xml文件,该文件中可以指定JDK版本:
老夫子
2019/04/14
2.8K0
Eclipse中Maven默认JDK版本设置
export在linux中用法_设置环境变量命令
Linux 命令详解(一)export 命令 – Tinywan – 博客园 (cnblogs.com)
全栈程序员站长
2022/10/04
1.4K0
pycharm 设置环境变量_电脑环境变量怎么设置
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/175266.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/27
4.5K0
pycharm 设置环境变量_电脑环境变量怎么设置
[Linux] 设置默认python
linux中往往会安装很多个版本的python, 所以会牵扯到默认python的设置问题. 主要是设置系统环境变量的问题.
py3study
2020/01/06
2.8K0
linux centos中添加删除修改环境变量,设置java环境变量
前言 安装完软件必要添加环境变量。指令很少,然而长时间不写就会不自信:我写的对吗?于是百度开始,于是发现又是各有千秋。好吧,好记星不如烂笔头。当然,最重要的是,百度出来的都他妈的是如何添加环境变量,只字不提删除和修改。显然,都是像我一样的外门汉做笔记的,用啥写啥。 增加环境变量 百度出来的都是修改/etc/profile文件,添加export var=value。我也没认真去看linux的指令的书,不过发现一个不错的做法。 在/etc/profile.d/下有一堆sh脚本,这些脚本就是系统初始化的环境变量
Ryan-Miao
2018/03/13
5.1K0
通过Mono 在 Heroku 上运行 .NET 应用
英文原文:Running .NET on Heroku 中文原文:在 Heroku 上运行 .NET 应用 自从加入了Heroku之后,我就想在这个平台上运行.NET程序。现在我很高兴向大家宣布,我们已经有了一个可用的环境reasonably workable Mono buildpack。我的目标是能够在Windows上使用Visual Studio创建一个ASP.NET MVC解决方案去创建一个Heroku的应用程序。它能够使用git命令push Heroku,构建Heroku,应用部署在Mono和X
张善友
2018/01/29
3.2K0
在Heroku上部署Node.js
今天,我们将演示如何在Heroku上部署Node.js应用。Heroku官方提供免费帐户使用,在此之上,我们最多可以托管5个应用程序。但如果你有大量需求的话,就需要购买特殊账户。我接下来要用来示范的N
Techeek
2018/01/04
3.6K0
deploy to heroku
deploy to heroku install heroku https://devcenter.heroku.com/articles/getting-started-with-java#introduction create heroku webapp plugin <dependency> <groupId>org.glassfish.jersey.archetypes</groupId> <artifactId>jersey-heroku-webapp</artifactId>
用户3004328
2018/09/06
1.2K0
CentOS设置环境变量
在CentOS中设置环境变量1. 当前会话生效PATH=$PATH:/home/new/binecho $PATH2. 当前用户有效vim ~/.bash_profile最后加PATH=$PATH:$HOME/bin:/home/new/bin生效source ~/.bash_profile3. 全局/etc/profilevim /etc/profile最后加PATH=$PATH:/home/new/binexport PATH立即生效source ~/.bash_profile4. 全局/etc/pro
莫得急
2022/12/01
8.5K0
如何设置python的环境变量_anaconda环境变量手动设置
在python项目实践中,不知道为什么我的os.getenv一直拿不到环境变量,于是我就试了三种设置环境变量的方法,中解决了问题。
全栈程序员站长
2022/09/25
4.6K0
如何设置python的环境变量_anaconda环境变量手动设置
点击加载更多

相似问题

在heroku上设置环境变量

13

在Symfony中设置默认环境变量

10

如何设置环境变量Heroku

116

如何恢复默认的Heroku环境变量?

10

Heroku设置默认站点

116
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文