修改和创建DOM节点两种方式的4种优化方案

原文:《Speeding up JavaScript: Working with the DOM》
作者:KeeKim Heng, Google Web Developer
翻译:http://www.blogjava.net/emu/archive/2010/03/01/314185.html

在我们开发互联网富应用(RIA)时,我们经常写一些javascript脚本来修改或者增加页面元素,这些工作最终是DOM——或者说文档对象模 型——来完成的,而我们的实现方式会影响到应用的响应速度。

DOM操作会导致浏览器重解析(reflow),这是浏览器的一个决定页面元素如何展现的计算过程。直接修改DOM,修改元素的CSS样式,修改浏 览器的窗口大小,都会触发重解析。读取元素的布局属性比如offsetHeithe或者offsetWidth也会触发重解析。重解析需要花费计算时间, 因此重解析触发的越少,应用就会越快。

DOM操作通常要不就是修改已经存在的页面上的元素,要不就是创建新的页面元素。下面的4种优化方案覆盖了修改和创建DOM节点两种方式,帮助你减 少触发浏览器重解析的次数。

方案一:通过CSS类名切换来修改DOM

这个方案让我们可以一次性修改一个元素和它的子元素的多个样式属性而只触发一次重解析。

需求:

emu注:原文作者写到这里的时候脑子显然短路了一下,把后面的Out-of-the-flow DOM Manipulation模式要解决的问题给摆到这里来了,不过从示范代码中很容易明白作者真正想描述的问题,因此emu就不照翻原文了)

我们现在需要写一个函数来修改一个超链接的几个样式规则。要实现很简单,把这几个规则对应的属性逐一改了就好了。但是带来的问题是,每修改一个样式 属性,都会导致一次页面的重解析。

function selectAnchor(element) {
  element.style.fontWeight = 'bold';
  element.style.textDecoration = 'none';
  element.style.color = '#000';
}

解决方案:

要解决这个问题,我们可以先创建一个样式名,并且把要修改的样式规则都放到这个类名上,然后我们给超链接添加上这个新类名,就可以实现添加几个样式 规则而只触发一次重解析了。这个模式还有个好处是也实现了表现和逻辑相分离。

.selectedAnchor {
  font-weight: bold;
  text-decoration: none;
  color: #000;
}

function selectAnchor(element) {
  element.className = 'selectedAnchor';
}

时间: 2025-01-02 07:29:29

修改和创建DOM节点两种方式的4种优化方案的相关文章

JQuery创建DOM节点的方法_jquery

本文实例讲述了JQuery创建DOM节点的方法.分享给大家供大家参考.具体分析如下: 用JQuery选择器能够快捷而轻松地查找到文档中的某个特定的元素节点,然后可以用attr()方法来获取元素的各种属性的值.但真正的DOM操作并非这么简单.在DOM操作中,常常需要动态创建HTML内容,使文档在浏览器里的呈现效果发生变化,并且达到各种各样的人机交互的目的. HTML DOM结构如下: <p class="nm_p" title="欢迎访问" >欢迎访问&l

mybatis集成spring有4种方式,哪种方式好?

问题描述 mybatis集成spring有4种方式,哪种方式好? mybatis集成SPRING大概有3,4种方式,架构师给过来的架构是用继承SqlSessionDaoSupport方式的,个人觉得这样比较麻烦,还是用MapperScannerConfigurer的方式比较好.有没有大神给分析分析?

200分请教,年未全分了。left join和查询 ibatis 好 两种方式,哪种方式更好。

问题描述 有两张表:表一book表字段名类型idintnamevarchar(200)表二book_desc表字段名类型idintbidint--表一的外建1对1的关系contentvarchar(2000)数据库是mysql,数据量大约有两万多条idnamecontent1我的父亲我的父亲描述的是....我现在想把此表展示出来,用的是ibatis现在有两种一种是在sqlmap里将<selectid="getBookListByQuery"parameterClass="

4种方式以改善搜索引擎优化的投资回报率

现代营销方式,使您可以跟踪您的投资回报率在竞选的每一步.长话短说,如果你不优化您的投资回报率的运动,那么你很可能付诸东流投掷钱.谷歌分析,和其他工具的范围,允许你计算你在哪里,你的钱,是什么原因导致这种情况发生.有三件事情你需要做的第一,才可以真正开始看你对SEO的投资回报率. 1.了解销售的价值是什么.如果你是一个服务提供商,这可能是有点难以量化,但你应该知道你的平均销售值. 2.计算平均销售利润率 3.(分析)目标或电子商务跟踪(如果可以的话)和平均销售值给你的目标价值. 现在允许你进行了广

jQuery获取DOM节点实例分析(2种方式)_jquery

本文实例讲述了jQuery获取DOM节点.分享给大家供大家参考,具体如下: jQuery中包裹后的DOM对象实际上是一个数组,要获得纯粹的DOM对象可以有两种方式: 1.使用数组索引方式访问,例如: 复制代码 代码如下: var dom = $(dom)[0]; 2.使用函数get()访问,例如: 复制代码 代码如下: var dom = $(dom).get(0); get()函数中的参数为索引号. 3.示例 var div = document.createElement("DIV"

JavaScript中对DOM节点的访问、创建、修改、删除_基础知识

DOMDOM就是Document object Model的缩写.文档对象模型是把XML或HTML以树节点为表现形式的文档.用DOM方法和属性,你可以访问,修改,删除页面上任意一个元素,也是可以添加一个元素.DOM是独立于语言的API,可以被任意语言所实现,当然也包括了Javascript 看看下面的一个文本. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/x

javascript-js里操作DOM节点性能损失最低的方式是什么?

问题描述 js里操作DOM节点性能损失最低的方式是什么? 可能这个标题不太合适,如下有个例子,一种是用原生js里的创建节点.文本节点.插入父节点内的方式,一种是用数据格式化字符串的方式 // 方式1: var a = document.createElement('a'); a.href = 'http://www.baidu.com'; a.target ='_blank'; var text = document.createTextNode('this is baidu homepage'

如何修改request的parameter的几种方式

这篇文章仅仅用来参考,本身不想写,request之所以不想让你修改parameter的值,就是因为这个东西一般不然改,有人问我为什么不让改,表面上说我只能说这属于篡改数据,因为这个使用户的请求数据,如果被篡改就相当于篡改消息,如果你一天给别人发消息发的是:你好,而对方收到的是:fuck you!,你会怎么想,呵呵!当然它主要是怕不安全把参数数据该乱了,因为程序员毕竟是自己写程序,尤其是在公共程序里面写,后台程序员发现自己的数据不对,也找不到原因:一般WEB应用会提供一个attribute来提供自

不停止MySQL服务增加从库的两种方式

 现在生产环境MySQL数据库是一主一从,由于业务量访问不断增大,故再增加一台从库.前提是不能影响线上业务使用,也就是说不能重启MySQL服务,为了避免出现其他情况,选择在网站访问量低峰期时间段操作.  一般在线增加从库有两种方式,一种是通过mysqldump备份主库,恢复到从库,mysqldump是逻辑备份,数据量大时,备份速度会很慢,锁表的时间也会很长.另一种是通过xtrabackup工具备份主库,恢复到从库,xtrabackup是物理备份,备份速度快,不锁表.为什么不锁表?因为自身会监控主