- 浏览: 5158282 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
silence19841230:
先拿走看看
SpringBoot2.0开发WebSocket应用完整示例 -
wallimn:
masuweng 写道发下源码下载地址吧!三个相关文件打了个包 ...
SpringBoot2.0开发WebSocket应用完整示例 -
masuweng:
发下源码下载地址吧!
SpringBoot2.0开发WebSocket应用完整示例 -
masuweng:
SpringBoot2.0开发WebSocket应用完整示例 -
wallimn:
水淼火 写道你好,我使用以后,图标不显示,应该怎么引用呢,谢谢 ...
前端框架iviewui使用示例之菜单+多Tab页布局
原文:《Speeding up JavaScript: Working with the DOM》
作者: KeeKim Heng, Google Web Developer
译文地址:http://blog.csdn.net/emu/archive/2010/03/01/5334583.aspx
在我们开发互联网富应用(RIA)时,我们经常写一些javascript脚本来修改或者增加页面元素,这些工作最终是DOM——或者说文档对象模型——来完成的,而我们的实现方式会影响到应用的响应速度。
DOM操作会导致浏览器重解析(reflow),这是浏览器的一个决定页面元素如何展现的计算过程。直接修改DOM,修改元素的CSS样式,修改浏览器的窗口大小,都会触发重解析。读取元素的布局属性比如offsetHeithe或者offsetWidth也会触发重解析。重解析需要花费计算时间,因此重解析触发的越少,应用就会越快。
DOM操作通常要不就是修改已经存在的页面上的元素,要不就是创建新的页面元素。下面的4种优化方案覆盖了修改和创建DOM节点两种方式,帮助你减少触发浏览器重解析的次数。
方案一:通过CSS类名切换来修改DOM
这个方案让我们可以一次性修改一个元素和它的子元素的多个样式属性而只触发一次重解析。
需求:
(emu注:原文作者写到这里的时候脑子显然短路了一下,把后面的Out-of-the-flow DOM Manipulation模式要解决的问题给摆到这里来了,不过从示范代码中很容易明白作者真正想描述的问题,因此emu就不照翻原文了)
我们现在需要写一个函数来修改一个超链接的几个样式规则。要实现很简单,把这几个规则对应的属性逐一改了就好了。但是带来的问题是,每修改一个样式属性,都会导致一次页面的重解析。
view plaincopy to clipboardprint?
function selectAnchor(element) {
element.style.fontWeight = 'bold';
element.style.textDecoration = 'none';
element.style.color = '#000';
}
解决方案
要解决这个问题,我们可以先创建一个样式名,并且把要修改的样式规则都放到这个类名上,然后我们给超链接添加上这个新类名,就可以实现添加几个样式规则而只触发一次重解析了。这个模式还有个好处是也实现了表现和逻辑相分离。
view plaincopy to clipboardprint?
.selectedAnchor {
font-weight: bold;
text-decoration: none;
color: #000;
}
function selectAnchor(element) {
element.className = 'selectedAnchor';
}
方案二:在非渲染区修改DOM
(emu注:作者在这里再次脑子短路,把DocumentFragment DOM Generation模式的介绍提前到这里来了,emu只好再次发挥一下)
上一个方案解决的是修改一个超链接的问题,当一次需要对很多个超链接进行相同修改的时候,这个方案就可以大显身手了。
需求
需求是这样的,我们要写一个函数来修改一个指定元素的子元素中所有的超链接的样式名(className)属性。要实现很简单,我们可以通过遍历每个超链接并且修改它们的样式名来完成任务。但是带来的问题就是,每修改一个超链接都会导致一次重解析。
view plaincopy to clipboardprint?
function updateAllAnchors(element, anchorClass) {
var anchors = element.getElementsByTagName('a');
for (var i = 0, length = anchors.length; i < length; i ++) {
anchors[i].className = anchorClass;
}
}
解决方案
要解决这个问题,我们可以把被修改的指定元素从DOM里面移除,再修改所有的超链接,然后在把这个元素插入回到它原来的位置上。为了完成这个复杂的操作,我们可以先写一个可重用的函数,它不但移除了这个DOM节点,还返回了一个把元素插回到原来的位置的函数。
view plaincopy to clipboardprint?
/**
* Remove an element and provide a function that inserts it into its original position
* @param element {Element} The element to be temporarily removed
* @return {Function} A function that inserts the element into its original position
**/
function removeToInsertLater(element) {
var parentNode = element.parentNode;
var nextSibling = element.nextSibling;
parentNode.removeChild(element);
return function() {
if (nextSibling) {
parentNode.insertBefore(element, nextSibling);
} else {
parentNode.appendChild(element);
}
};
}
有了上面这个函数,现在我们就可以在一个不需要解析渲染的元素上面修改那些超链接了。这样只在移除和插入元素的时候各触发一次重解析。
view plaincopy to clipboardprint?
function updateAllAnchors(element, anchorClass) {
var insertFunction = removeToInsertLater(element);
var anchors = element.getElementsByTagName('a');
for (var i = 0, length = anchors.length; i < length; i ++) {
anchors[i].className = anchorClass;
}
insertFunction();
}
方案三:一次性的DOM元素生成
这个方案让我们创建一个元素的过程只触发一次重解析。在创建完元素以后,先进行所有需要的修改,最后才把它插入到DOM里面去就可以了
需求
需求是这样的,实现一个函数,往一个指定的父元素上插入一个超链接元素。这个函数要同时可以设置这个超链接的显示文字和样式类。我们可以这样做:创建元素,插入到DOM里面,然后设置相应的属性。这就要触发3次重解析。
view plaincopy to clipboardprint?
function addAnchor(parentElement, anchorText, anchorClass) {
var element = document.createElement('a');
parentElement.appendChild(element);
element.innerHTML = anchorText;
element.className = anchorClass;
}
解决方案
很简单,我们只要把插入元素这个操作放到最后做,就可以只进行一次重解析了。
view plaincopy to clipboardprint?
function addAnchor(parentElement, anchorText, anchorClass) {
var element = document.createElement('a');
element.innerHTML = anchorText;
element.className = anchorClass;
parentElement.appendChild(element);
}
不过,要是我们想要插入很多个超链接到一个元素里面的话,那么这个做法还是有问题:每插入一个超链接还是要触发一次重解析。下一个方案可以解决这个问题。
方案四:通过文档片段对象(DocumentFragment)创建一组元素
这个方案允许我们创建并插入很多个元素而只触发一次重解析。要实现这点需要用到所谓的文档片段对象(DocumentFragment)。我们先在DOM之外创建一个文档片段对象(这样它也就不需要解析和渲染),然后我们在文档片段对象中创建很多个元素,最后我们把这个文档片段对象中所有的元素一次性放到DOM里面去,只触发一次重解析。
需求
我们要写一个函数,往一个指定的元素上面增加10个超链接。如果我们简单的直接插入10个超链接到元素上面,就会触发10次重解析。
view plaincopy to clipboardprint?
function addAnchors(element) {
var anchor;
for (var i = 0; i < 10; i ++) {
anchor = document.createElement('a');
anchor.innerHTML = 'test';
element.appendChild(anchor);
}
}
解决方案
要解决这个问题,我们要先创建一个文档片段对象,然后把每个新创建的超链接都插入到它里面去。当我们把文档片段对象用appendChild命令插入到指定的节点时,这个文档片段对象的所有子节点就一起被插入到指定的元素里面,而且只需要触发一次重解析。
view plaincopy to clipboardprint?
function addAnchors(element) {
var anchor, fragment = document.createDocumentFragment();
for (var i = 0; i < 10; i ++) {
anchor = document.createElement('a');
anchor.innerHTML = 'test';
fragment.appendChild(anchor);
}
element.appendChild(fragment);
}
作者: KeeKim Heng, Google Web Developer
译文地址:http://blog.csdn.net/emu/archive/2010/03/01/5334583.aspx
在我们开发互联网富应用(RIA)时,我们经常写一些javascript脚本来修改或者增加页面元素,这些工作最终是DOM——或者说文档对象模型——来完成的,而我们的实现方式会影响到应用的响应速度。
DOM操作会导致浏览器重解析(reflow),这是浏览器的一个决定页面元素如何展现的计算过程。直接修改DOM,修改元素的CSS样式,修改浏览器的窗口大小,都会触发重解析。读取元素的布局属性比如offsetHeithe或者offsetWidth也会触发重解析。重解析需要花费计算时间,因此重解析触发的越少,应用就会越快。
DOM操作通常要不就是修改已经存在的页面上的元素,要不就是创建新的页面元素。下面的4种优化方案覆盖了修改和创建DOM节点两种方式,帮助你减少触发浏览器重解析的次数。
方案一:通过CSS类名切换来修改DOM
这个方案让我们可以一次性修改一个元素和它的子元素的多个样式属性而只触发一次重解析。
需求:
(emu注:原文作者写到这里的时候脑子显然短路了一下,把后面的Out-of-the-flow DOM Manipulation模式要解决的问题给摆到这里来了,不过从示范代码中很容易明白作者真正想描述的问题,因此emu就不照翻原文了)
我们现在需要写一个函数来修改一个超链接的几个样式规则。要实现很简单,把这几个规则对应的属性逐一改了就好了。但是带来的问题是,每修改一个样式属性,都会导致一次页面的重解析。
view plaincopy to clipboardprint?
function selectAnchor(element) {
element.style.fontWeight = 'bold';
element.style.textDecoration = 'none';
element.style.color = '#000';
}
解决方案
要解决这个问题,我们可以先创建一个样式名,并且把要修改的样式规则都放到这个类名上,然后我们给超链接添加上这个新类名,就可以实现添加几个样式规则而只触发一次重解析了。这个模式还有个好处是也实现了表现和逻辑相分离。
view plaincopy to clipboardprint?
.selectedAnchor {
font-weight: bold;
text-decoration: none;
color: #000;
}
function selectAnchor(element) {
element.className = 'selectedAnchor';
}
方案二:在非渲染区修改DOM
(emu注:作者在这里再次脑子短路,把DocumentFragment DOM Generation模式的介绍提前到这里来了,emu只好再次发挥一下)
上一个方案解决的是修改一个超链接的问题,当一次需要对很多个超链接进行相同修改的时候,这个方案就可以大显身手了。
需求
需求是这样的,我们要写一个函数来修改一个指定元素的子元素中所有的超链接的样式名(className)属性。要实现很简单,我们可以通过遍历每个超链接并且修改它们的样式名来完成任务。但是带来的问题就是,每修改一个超链接都会导致一次重解析。
view plaincopy to clipboardprint?
function updateAllAnchors(element, anchorClass) {
var anchors = element.getElementsByTagName('a');
for (var i = 0, length = anchors.length; i < length; i ++) {
anchors[i].className = anchorClass;
}
}
解决方案
要解决这个问题,我们可以把被修改的指定元素从DOM里面移除,再修改所有的超链接,然后在把这个元素插入回到它原来的位置上。为了完成这个复杂的操作,我们可以先写一个可重用的函数,它不但移除了这个DOM节点,还返回了一个把元素插回到原来的位置的函数。
view plaincopy to clipboardprint?
/**
* Remove an element and provide a function that inserts it into its original position
* @param element {Element} The element to be temporarily removed
* @return {Function} A function that inserts the element into its original position
**/
function removeToInsertLater(element) {
var parentNode = element.parentNode;
var nextSibling = element.nextSibling;
parentNode.removeChild(element);
return function() {
if (nextSibling) {
parentNode.insertBefore(element, nextSibling);
} else {
parentNode.appendChild(element);
}
};
}
有了上面这个函数,现在我们就可以在一个不需要解析渲染的元素上面修改那些超链接了。这样只在移除和插入元素的时候各触发一次重解析。
view plaincopy to clipboardprint?
function updateAllAnchors(element, anchorClass) {
var insertFunction = removeToInsertLater(element);
var anchors = element.getElementsByTagName('a');
for (var i = 0, length = anchors.length; i < length; i ++) {
anchors[i].className = anchorClass;
}
insertFunction();
}
方案三:一次性的DOM元素生成
这个方案让我们创建一个元素的过程只触发一次重解析。在创建完元素以后,先进行所有需要的修改,最后才把它插入到DOM里面去就可以了
需求
需求是这样的,实现一个函数,往一个指定的父元素上插入一个超链接元素。这个函数要同时可以设置这个超链接的显示文字和样式类。我们可以这样做:创建元素,插入到DOM里面,然后设置相应的属性。这就要触发3次重解析。
view plaincopy to clipboardprint?
function addAnchor(parentElement, anchorText, anchorClass) {
var element = document.createElement('a');
parentElement.appendChild(element);
element.innerHTML = anchorText;
element.className = anchorClass;
}
解决方案
很简单,我们只要把插入元素这个操作放到最后做,就可以只进行一次重解析了。
view plaincopy to clipboardprint?
function addAnchor(parentElement, anchorText, anchorClass) {
var element = document.createElement('a');
element.innerHTML = anchorText;
element.className = anchorClass;
parentElement.appendChild(element);
}
不过,要是我们想要插入很多个超链接到一个元素里面的话,那么这个做法还是有问题:每插入一个超链接还是要触发一次重解析。下一个方案可以解决这个问题。
方案四:通过文档片段对象(DocumentFragment)创建一组元素
这个方案允许我们创建并插入很多个元素而只触发一次重解析。要实现这点需要用到所谓的文档片段对象(DocumentFragment)。我们先在DOM之外创建一个文档片段对象(这样它也就不需要解析和渲染),然后我们在文档片段对象中创建很多个元素,最后我们把这个文档片段对象中所有的元素一次性放到DOM里面去,只触发一次重解析。
需求
我们要写一个函数,往一个指定的元素上面增加10个超链接。如果我们简单的直接插入10个超链接到元素上面,就会触发10次重解析。
view plaincopy to clipboardprint?
function addAnchors(element) {
var anchor;
for (var i = 0; i < 10; i ++) {
anchor = document.createElement('a');
anchor.innerHTML = 'test';
element.appendChild(anchor);
}
}
解决方案
要解决这个问题,我们要先创建一个文档片段对象,然后把每个新创建的超链接都插入到它里面去。当我们把文档片段对象用appendChild命令插入到指定的节点时,这个文档片段对象的所有子节点就一起被插入到指定的元素里面,而且只需要触发一次重解析。
view plaincopy to clipboardprint?
function addAnchors(element) {
var anchor, fragment = document.createDocumentFragment();
for (var i = 0; i < 10; i ++) {
anchor = document.createElement('a');
anchor.innerHTML = 'test';
fragment.appendChild(anchor);
}
element.appendChild(fragment);
}
发表评论
-
gradle编译错误:Could not find method compile() for arguments
2020-09-19 10:50 18466编译(IDEA+Gradle)一个别人的工程,出现一个 ... -
netty心跳检查之UDP篇
2019-09-15 08:50 2385部分UDP通信场景中,需要客户端定期发送心跳信息,以获取终 ... -
解决tomcat部署两个SpringBoot应用提示InstanceAlreadyExistsException
2019-06-30 11:49 3384两个SpringBoot应用部署在一个Tomcat中,单独 ... -
Eclipse配置MyBatis代码自动化功能
2019-06-29 10:16 17681.安装插件 Eclipse中,Help->Ecli ... -
vue.js中使用qrcode生成二维码
2019-05-20 00:00 7654一、安装包 npm install qrcodejs2 --s ... -
MySQL插入数据报错: Incorrect string value: '\xFD\xDE'
2019-03-31 23:19 1230我MySQL数据库用的uft-8字符集,插入数据一直很正常 ... -
vue自定义组件并双向绑定属性
2019-03-08 22:46 3255做了两个子组件,原理基本一样,一个是使用原生的select ... -
vue-router简单示例
2019-03-05 00:32 1147写个基本完整、稍有借鉴意义的示例,防止自己忘记。 &l ... -
“联通充值系统繁忙”轻松应对
2019-02-06 11:03 3973大过年的,联通充个值一直报“充值系统繁忙”。昨天晚上试了几 ... -
electron.js数据库应用---导航菜单(element-ui+mysql)
2019-02-05 21:33 2364一、环境搭建 略, ... -
electron.js数据库应用---入门(mysql+element-ui)
2019-01-27 23:19 7490我的机器:Windows10,64 ... -
SpringMVC 在controller层中注入成员变量request,是否线程安全
2018-12-17 21:17 2746@RestController public class ... -
VueJS 组件参数名命名与组件属性转化
2018-12-03 00:00 2072转自:https://www.cnblogs.com/meiy ... -
vue-resource拦截器实现token发送及检验自动化
2018-11-16 22:38 3076用了很长时间vue-resource,最近思考$http发 ... -
element-ui试用手记
2018-10-29 20:25 1741element-ui、iviewui都以vue.js为基础 ... -
iviewui中表格控件中render的使用示例
2018-07-07 16:46 9784示例了如何在表格中显示按钮,如何将代码转化为文字。 i ... -
Tomcat错误“Alias name tomcat does not identify a key entry”解决
2018-07-05 21:39 6560申请到了阿里云的证书后,下载、按照说明生成jks格式证书、 ... -
阿里云免费证书“fileauth.txt内容配置错误”解决
2018-07-05 20:43 5293最近研究微信小程序开发,上阿里云申请了个证书,使用文件验证 ... -
springboot2.0跨域配置
2018-07-04 22:11 5283springboot2.0跨域配置: 一、代码 ... -
微信小程序使用code换openid的方法(JAVA、SpringBoot)
2018-07-01 21:52 10398微信小程序序的代码中提示,使用code换取openid,但 ...
相关推荐
### 一、DOM优化原理与实践 #### 1. DOM操作为何缓慢 首先,我们需要了解在前端开发中,DOM(文档对象模型)操作是性能开销比较大的操作之一。这是因为DOM并非与JavaScript同属一个引擎,它们之间通过桥接接口进行...
**性能优化:** 得益于虚拟 DOM 和异步批处理更新机制,Vue.js 在处理大量数据时仍能保持良好的性能表现。 **社区支持强:** Vue.js 拥有一个活跃的社区和丰富的资源,如详细的文档、教程和插件等,这些都为开发者...
迷你DOM操作库是一种轻量级的JavaScript工具集,专门用于简化和加速DOM(Document Object Model)操作。在网页开发中,DOM是HTML或XML文档的结构化表示,它允许我们通过编程方式访问和修改页面元素。这个库因其小巧...
接下来,我们转向CSS优化: 1. **CSS选择器优化**:避免使用复杂的后代选择器,优先使用类选择器和ID选择器,因为它们的计算成本较低。 2. **减少冗余规则**:合并相似的CSS规则,避免重复定义相同的样式。 3. **...
11. 布局优化:合理使用display:none或visibility:hidden避免未显示的滑块元素占用空间,提高页面加载速度。 12. GPU加速:使用transform和opacity属性进行动画可使浏览器利用GPU进行硬件加速,提高性能。 13. ...
- **JavaScript操作样式**:频繁地通过JavaScript修改DOM元素的样式会影响页面渲染性能。应尽量减少这类操作,转而使用CSS3的过渡和动画特性来实现动态效果。 #### 七、利用浏览器缓存 - **设置合适的缓存策略**:...
标题中的“给页面加速,干掉Dom Level 0 Event”是指优化网页性能的一个关键策略,主要涉及JavaScript事件处理。在早期的DOM(文档对象模型)规范中,即DOM Level 0,事件处理主要通过两种方式:`element.onclick = ...
在前端开发领域,中级进阶阶段的开发者通常需要掌握更深入的JavaScript和CSS优化技巧,以提升网页性能和用户体验。JavaScript作为前端的核心语言,优化它能够显著提高页面加载速度和运行效率;而CSS优化则关乎页面...
在传统的Web应用中,所有的JavaScript代码都在主线程上运行,包括DOM操作。这可能导致UI在执行密集型任务时冻结,因为浏览器会等待脚本执行完毕才更新界面。Web Worker是为了克服这个问题而引入的,它们可以在单独的...
《使用Ajax, APIs和库进行DOM编程之加速篇》是一本2007年的图书,主要探讨了如何高效地利用Ajax、APIs以及各种库来优化DOM(文档对象模型)编程。这本书对于深入理解Web开发中的动态交互和前端性能提升具有重要的...
2. **JavaScript 库**:JavaScript 库是一组预先编写好的函数和方法,用于简化和加速 JavaScript 开发,dom-doll 就是这样一个库,专注于 DOM 操作。 3. **nano 库的概念**:nano 库通常指的是非常小、轻量级的库,...
现代浏览器提供了诸如V8引擎这样的高性能JavaScript解释器,但开发者仍需关注代码的优化,避免过度复杂的计算和不必要的DOM操作。 2. **内存管理**:JavaScript的垃圾回收机制处理内存分配和释放。过度创建对象或大...
1. 使用CSS3动画:JavaScript与CSS3结合,可以让浏览器硬件加速渲染,提高性能。例如,可以使用CSS3的transition和keyframes属性,然后用JavaScript触发动画。 2. 自定义事件:通过监听自定义事件,可以实现更复杂的...
1. **优化代码执行效率**:了解JavaScript引擎的工作原理,如V8引擎的即时编译(JIT)技术,可以帮助开发者编写更高效代码,减少不必要的计算和内存占用。 2. **避免全局变量**:全局变量会延长查找时间,增加内存...
1. jQuery:一个流行的JavaScript库,简化DOM操作、事件处理和Ajax请求。 2. React:Facebook开发的前端框架,主要用于构建用户界面,其虚拟DOM技术提高了性能。 3. Angular:Google维护的全面的前端框架,提供了...
在JavaScript的世界里,jQuery是一个广泛使用的库,它简化了DOM操作、事件处理和动画效果,极大地提升了开发效率。然而,随着网页复杂性的增加,性能优化变得尤为重要。本篇指南将深入探讨如何在使用jQuery时进行...
《高性能JavaScript编程》一书深入探讨了如何优化JavaScript在浏览器中的性能,这在现代Web开发中至关重要。浏览器中的JavaScript性能直接影响用户体验,因为JavaScript执行时会阻塞其他操作。以下是各章节主要内容...
2. **DOM操作优化**:DOM(Document Object Model)是Web页面的结构树,频繁的DOM操作会降低性能。通过减少DOM操作次数,使用文档碎片(document.createDocumentFragment)、事件委托等技术可以提升性能。 3. **...
在JavaScript的世界里,jQuery是一个广泛使用的库,它简化了DOM操作、事件处理、动画效果以及Ajax交互等任务。然而,随着网页复杂性的增加,优化jQuery代码以提高性能变得至关重要。本指南将深入探讨如何通过一系列...