javascript系列之DOM(二)

简介: 原文:javascript系列之DOM(二)原生DOM扩展      我们接着第一部分来说,上文提到了两种常规的DOM操作:创建文档片段和遍历元素节点。我们知道那些雨后春笋般的库,有很大一部分工作就是提供了一些优秀 的DOM操作API。
原文: javascript系列之DOM(二)

原生DOM扩展

     我们接着第一部分来说,上文提到了两种常规的DOM操作:创建文档片段和遍历元素节点。我们知道那些雨后春笋般的库,有很大一部分工作就是提供了一些优秀 的DOM操作API。可见原生的一些方法和属性,还不能很灵活快捷的来完成我们所希望的操作。下面将总结出总结出几种很实用的扩展方法。包括 after()和before(),

A:after()和before()

 1 function after(elem){
 2     if(this.parentNode){
 3         this.parentNode.insertBefore(elem,this.nextSibling)
 4     }
 5 }
 6 function before(elem){
 7     if(this.parentNode){
 8         this.parentNode.insertBefore(elem,this)
 9     }
10 }

     这里的after()和 before()方法主要是为了快速解决this,this.nextSibling之间的空间问题。方便我们灵活的插入元素节点。两种方法的核心当然是insertBefore(),它是父节点和子节点,子节点之间联系的重要桥梁。

B:text()

 1 function text(elem){
 2     var str="";
 3     //判断是否有子节点
 4     elem=elem.childNodes||elem;
 5     for(var i=0;i<elem.length;i++){
 6         //若果不是元素节点,追加文本值
 7         str+=elem.nodeType!=1?elem.nodeValue:text(elem.childNodes[i]);    
 8     }
 9     return str;
10 }

     text()获取匹配元素集合(他的后代)中每个元素的文本内容,对于文本节点nodeValue属性为其文本内容,对于属性节点nodeValue为其属性值,他对于元素节点是不可用的。

DOM性能优化

     在DOM操作中,我们再完成其所期望实现的功能的同时,我们最应该关心的就是优化问题。DOM操作很耗费性能,相信各位前端儿们早有耳闻,在前文中提到的 createDocumentFrament()算是一个引子。DOM操作的效率为什么会这么低?这么慢?为什么说DOM操作是性能优化的主攻点?因为有 reflow和repaint这两个小屁孩的存在。而且浏览器为了保证执行结果的准确性(太宠这两个孩子了),他们想要什么就立马去实现(同步执行)。要 是他两贪得无厌,操作的波及范围比较大,次数比较频繁时。这后果可就够喝一壶的了。有必要先介绍下这两个坏小子: reflow 意味着结构的 改变,比如一堆元素,改变其中一个的宽高,那么相应的所有元素的位置都要改变.repaint意味着样式的改变比如div调整了背景色等,但是位置不 变,只改变我们操作的元素.所以通常来看repaint的代价要远小于reflow,比它斯文点,速度也更快.

      我们既然发现了问题的根源所在,就是去解决这些问题。毕竟这两个小屁儿又不是咱的亲儿子,该打屁股可不能客气。把我的一个原则当然就是尽量减少DOM操作了,不给他们更多放肆的机会。这里有几条原则。首先就从createDocumentFrament()说起吧!

A:createDocumentFrament()

      实例见前文,试想若果我们没有个这“盒子”,那document每构造一个元素,页面就要重构依次,后果可想而知。我们先把药添加的元素包裹起来,寄存在这个预定的盒子(文档碎片)里,然后一次性添加到文档中,jQuery就是这么干的。

B:display:none

      将display设置为"none",只是把这个元素从当前的DOM结构暂时删除起来, 让其不可见。这样私下就可以好好调戏他了,这个结构是个大容器,可以干很多事情,比如说添加一堆元素。一切完毕之后恢复。这样它只是一次重构。

C:class

     这个还是比较容易理解的,修改属性(样式居多)时,你逐一修改要访问很多次,而替换class就相当于批量操作了,访问一次DOM就可以了,当然性能提高了.

D:变量保存

      用变量保存DOM对象而不是多次获取,最典型的莫过于for(var i=0;i<list.length;i++)和for(var i=0,l=list.length;i<l;i++)效率比较,每次循环都要去获取长度可是很伤神又伤身的哦。你平时写的时候注意了这个细节了 嘛?

 

目录
相关文章
|
JavaScript 前端开发 Go
CSS 与 JS 对 DOM 解析和渲染的影响
【10月更文挑战第16天】CSS 和 JS 会在一定程度上影响 DOM 解析和渲染,了解它们之间的相互作用以及采取适当的优化措施是非常重要的。通过合理的布局和加载策略,可以提高网页的性能和用户体验,确保页面能够快速、流畅地呈现给用户。在实际开发中,要根据具体情况进行权衡和调整,以达到最佳的效果。
568 57
|
JavaScript 前端开发 API
JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
array.map()可以用来数据转换、创建派生数组、应用函数、链式调用、异步数据流处理、复杂API请求梳理、提供DOM操作、用来搜索和过滤等,比for好用太多了,主要是写法简单,并且非常直观,并且能提升代码的可读性,也就提升了Long Term代码的可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
JavaScript 前端开发 索引
js中DOM的基础方法
【10月更文挑战第31天】这些DOM基础方法是操作网页文档结构和实现交互效果的重要工具,通过它们可以动态地改变页面的内容、样式和行为,为用户提供丰富的交互体验。
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
948 5
|
XML 移动开发 JavaScript
js中BOM和DOM总结(基础篇)
文章总结了JavaScript的BOM和DOM知识点,包括window、screen、location、history、navigator对象,以及消息框、计时器和cookie。同时,介绍了DOM的概念、节点获取和修改方法,以及事件处理。
js中BOM和DOM总结(基础篇)
|
JavaScript 前端开发 开发者
.js的dom元素操作
【10月更文挑战第29天】通过灵活运用这些 DOM 元素操作方法,JavaScript 可以实现丰富的网页交互效果,如动态更新页面内容、响应用户操作、创建和删除页面元素等。在实际开发中,开发者可以根据具体的需求和场景,选择合适的 DOM 元素操作方法来实现所需的功能,为用户提供更加流畅和动态的网页体验。
|
移动开发 JavaScript 前端开发
原生js如何获取dom元素的自定义属性
原生js如何获取dom元素的自定义属性
693 4
|
JavaScript 前端开发
JavaScript HTML DOM 事件
JavaScript HTML DOM 事件
155 6
|
JavaScript 前端开发 索引
JavaScript HTML DOM 节点列表
JavaScript HTML DOM 节点列表
177 5
|
JavaScript 前端开发 索引
你可能没有听说过 js中的 DOM操作还有这个: HTMLCollection 和 NodeList
该文章详细解释了JavaScript中HTMLCollection和NodeList这两种DOM集合类型的特性、使用方法及其区别,并通过实例代码展示了如何操作这两种集合来选取和遍历DOM元素。