原文:javascript系列之DOM(二)

原生DOM扩展

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

A:after()和before()

 function after(elem){
if(this.parentNode){
this.parentNode.insertBefore(elem,this.nextSibling)
}
}
function before(elem){
if(this.parentNode){
this.parentNode.insertBefore(elem,this)
}
}

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

B:text()

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

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系列之DOM(二)的更多相关文章

  1. javascript系列之DOM(一)

    原文:javascript系列之DOM(一) DOM(document object moudle),文档对象模型.它是一个中立于语言的应用程序接口(API),允许程序访问并修改文档的结构,内容和样式 ...

  2. javascript系列之DOM(三)---事件

    原文:javascript系列之DOM(三)---事件 事件是javascript跳动的心脏,是DOM所有成分结合的万金油.当我们在WEB 上进行某些交互时,事件也就发生了.点击某些内容,鼠标经过特定 ...

  3. javaScript系列 [27]- DOM

    本文将详细介绍DOM相关的知识点,包括但不限于Document文档结构.Node节点.Node节点的类型.Node节点的关系以及DOM的基本操作( 节点的获取.节点的创建.节点的插入.节点的克隆和删除 ...

  4. javascript系列-class9.DOM(上)

    欢迎加入前端交流群交流知识获取视频资料:749539640 1.文档对象模型DOM(document Object Model)        所谓DOM就是以家族的形式描述HTML       节点 ...

  5. javascript系列-class10.DOM(下)

    1.node节点(更详细的获取(设置)页面中所有的内容)         根据 W3C 的 HTML DOM 标准,HTML 文档中的所有内容都是节点:   元素是节点的别称,节点包含元素当然节点还有 ...

  6. JavaScript 系列--JavaScript一些奇淫技巧的实现方法(二)数字格式化 1234567890转1,234,567,890;argruments 对象(类数组)转换成数组

    一.前言 之前写了一篇文章:JavaScript 系列--JavaScript一些奇淫技巧的实现方法(一)简短的sleep函数,获取时间戳 https://www.mwcxs.top/page/746 ...

  7. JavaScript 系列博客(二)

    JavaScript 系列博客(二) 前言 本篇博客介绍 js 中的运算符.条件语句.循环语句以及数组. 运算符 算术运算符 // + | - | * | / | % | ++ | -- consol ...

  8. webpack4 系列教程(十二):处理第三方JavaScript库

    教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步<webpack4 系列教程(十二):处理第三方 JavaScript 库>原文地址.或者来我的小站看更多内容:godbm ...

  9. 深入理解JavaScript系列(24):JavaScript与DOM(下)

    介绍 上一章我们介绍了JavaScript的基本内容和DOM对象的各个方面,包括如何访问node节点.本章我们将讲解如何通过DOM操作元素并且讨论浏览器事件模型. 本文参考:http://net.tu ...

随机推荐

  1. Facebook Hacker Cup 2015 Round 1--Corporate Gifting(树动态规划)

    原标题:https://www.facebook.com/hackercup/problems.php?pid=759650454070547&round=344496159068801 题意 ...

  2. [JSP][JSTL]页面调用函数--它${fn:}内置函数、是推断字符串是空的、更换车厢

    页面中调用函数--之${fn:}内置函数 函数描写叙述 fn:contains(string, substring) 假设參数string中包括參数substring,返回true fn:contai ...

  3. 【6】和作为连续序列s

    称号:输入一个整数s,并打印出所有s整数的连续序列(含有至少2的数量). 如输入9,输出2.3.4和4.5两个序列 方案一:因为序列至少要2个数,则两个数上限值为(1+s)/2,我们能够枚举该序列的起 ...

  4. 20那天android得知

    20多天的实习(事实上,一个人学习的东西)要结束, 剩下的只是读研. 这项20许多天我学到了很多东西, 对android的发展也有了一定的了解.之后写这篇文章主要完成的研究可以得知快速回升 1.安德鲁 ...

  5. 学习通过Thread+Handler实现非UI线程更新UI组件(转)

    [Android线程机制] 出于性能考虑,Android的UI操作并不是线程安全的,这就意味着如果有多个线程并发操作UI组件,可能导致线程安全问题.为了解决这个问题,Android制定了一条简单的规则 ...

  6. SoC嵌入式软件架构设计II:没有MMU的CPU虚拟内存管理的设计和实现方法

    大多数的程序代码是必要的时,它可以被加载到内存中运行.手术后,可直接丢弃或覆盖其它代码. 我们PC然在同一时间大量的应用,地址空间差点儿能够整个线性地址空间(除了部分留给操作系统或者预留它用).能够觉 ...

  7. 2015最新iherb海淘攻略-图文入门教程

    IHerb是美国最热门的海淘海购网站之中的一个,适合不爱担心,怕麻烦的朋友入门海淘,由于它有中文页面,可直邮中国,上千个母婴用品.化妆品.保健品品牌,最重要的是!首次下单,价值$40及以上的订单会马上 ...

  8. java提高篇(十三)-----字符串

          可以证明,字符串操作是计算机程序设计中最常见的行为. 一.String 首先我们要明确,String并不是基本数据类型,而是一个对象,并且是不可变的对象.查看源码就会发现String类为f ...

  9. BZOJ 3589 动态树 树链拆分+纳入和排除定理

    标题效果:鉴于一棵树.每个节点有一个右值,所有节点正确启动值他们是0.有两种操作模式,0 x y代表x右所有点的子树的根值添加y. 1 k a1 b1 a2 b2 --ak bk代表质疑. 共同拥有者 ...

  10. c#委托实例化和调用语句

    系统訪问数据或调用方法有两种操作方式:一种是通过名称訪问或调用,还有一种是通过所在的内存地址来訪问调用.为了系统的安全与稳定,NET Framework的CLR库不同意程序通过指针来直接操作内存中数据 ...