DOM笔记

1 var container=document.getElementById(‘list‘);
2 for(var i=0;i<3;i++)
3 {
4     var item=document.createElement(‘li‘);
5     item.innerText=i+1;
6     container.appendChild(item);
7 }

使用DOM需要注意点:

1.变量命名:节点类的变量,加上nd前缀更加容易辨识。

2.选择符命名:给CSS用和JS用的选择符分开,给JS用的选择符加上js-或J-前缀,提高可读性

3.容错能力:对节点的存在性做检查,保证代码更加健壮

4.最小作用域原则:应该将代码包在声明即执行的函数表达式里,不产生全局变量,也避免变量名冲突风险。

处理大量DOM事件的方法:

使用事件委托

 1   var container=document.getElementById(js-‘list‘);
 2   for(var i=0;i<300;i++)
 3   {
 4        var nditem=document.createElement(‘li‘);
 5        nditem.innerText=i+1;
 6        ndcontainer.appendChild(nditem);
 7
 8       ndcontainer.addEvent(‘click‘,function(e){
 9         var target=e.target;
10        if (target.tagName===‘LI‘){
11           alert(target.innerHTML);
12       }
13    });
14   }

在每次循环中都会修改DOM结构,如果大循环执行时间过长,浏览器的渲染帧率过低将会导致卡顿,影响浏览效果。所以减少DOM操作次数、缩短循环时间可以坚持主线程阻塞的时间。

实用requestAnimationFrame以更加优化的方式,处理更大数量的DOM操作

 1 (()=>{
 2     const ndContainer=document.getElementById(‘js-list‘);
 3     if (!ndContainer) {
 4         return ;
 5     }
 6     const total=30000;
 7     const batchSize=4; //每批插入的结点次数,越大渲染任务越繁重
 8     const batchCount=total/batchSize; //需要处理多少次
 9     let batchOne=0; //以完成处理的个数
10
11     function appendItem(){
12         const fragment=document.createDocumentFragment();
13         for(let i=0;i<batchSize;i++){
14             const ndItem=document.createElement(‘li‘);
15             ndItem.innerText=(batchDone*batchSize)+i+1;
16             fragment.appendChild(ndItem);
17         }
18
19         ndContainer.appendChild(fragment);
20         batchDone+=1;
21         doBatchAppend();
22     }
23
24     function doBatchAppend(){
25         if (batchDone<batchCount) {
26             window.requestAnimationFrame(appendItem);
27         }
28     }
29
30     doBatchAppend();
31
32     ndContainer.addEventListener(‘click‘,function(e){
33         const target=e.target;
34         if (target.tagName===‘LI‘) {
35             alert(target.innerHTML);
36         }
37     })
38 })();

DOM树的广度优先遍历:

 1 const travers=(ndRoot)=>{
 2     const queue=[ndRoot];
 3     while(queue.length){
 4         const node=queue.shift();
 5         printInfo(node);
 6
 7         if (!node.children.length) {
 8             continue;
 9         }
10         Array.from(node.children).forEach(x=>queue.push(x));
11
12     }
13 };
14
15 const printInfo=(node)=>{
16     console.log(node.tagName,‘.${node.className}‘);
17 };
18
19 traverse(document.querySelector(‘.root‘));

参考自:王仕军专栏

时间: 2024-11-03 21:34:27

DOM笔记的相关文章

DOM笔记(十):JavaScript正則表達式

一.RegExp ECMAScript通过RegExp类型类支持正則表達式,语法和Perl类似: var exp = /pattern/flags; patternb部分是不论什么简单的或复杂的正則表達式:flags是每一个正則表達式所带的一个或者多个标志. 正則表達式的模式匹配支持三个标志: g:全局模式,即模式应用于整个字符串.而非在发现第一个匹配项时马上停止 i:不区分大写和小写模式 m:多行模式,即到达一行文本末尾是还会继续茶查找下一行中是否存在与模式匹配的项. 1.创建正則表達式 Ja

DOM笔记(四):HTML 5 DOM复杂数据类型

HTML 5 DOM定义了一下集合.列表等复杂的数据类型用于实现便捷的操作.相对于HTML 4 DOM,HTML 5 DOM增加了HTMLCollection.DOMTokenList.DOMStringMap.HTMLAllCollection. HTMLFormControlsCollection等. 一.HTMLCollection.HTMLAllCollection和HTMLFormControlsCollection 三个接口均用于表示一组元素组成的列表.HTMLAllCollecti

DOM笔记(十二):又谈原型对象

因为之前谢过一篇关于原型对象的笔记:浅谈JavaScript中的原型模式.现在我又重新看到这个话题,对原型有了进一步的理解,所以,又要谈谈原型对象. 一.理解原型对象 创建的每一个函数都有一个prototype属性,它指向这个函数的原型对象.利用原型模式创建的方法和属性是被所有实例所共享的. function Person(){} Person.prototype.name="dwqs"; Person.prototype.age=20; Person.prototype.sayNam

DOM笔记(十):JavaScript正则表达式

一.RegExp ECMAScript通过RegExp类型类支持正则表达式,语法和Perl类似: var exp = /pattern/flags; patternb部分是任何简单的或复杂的正则表达式:flags是每个正则表达式所带的一个或者多个标志. 正则表达式的模式匹配支持三个标志: g:全局模式,即模式应用于整个字符串,而非在发现第一个匹配项时立即停止 i:不区分大小写模式 m:多行模式,即到达一行文本末尾是还会继续茶查找下一行中是否存在与模式匹配的项. 1.创建正则表达式 JavaScr

DOM笔记(三):Element接口和HTMLElement接口

一.Element接口 Element接口表示一个元素,该接口扩展自Node接口,自然继承了Node接口的属性和方法,也有一套针对元素的属性和方法. Element接口常见的属性比较少,常用的就是一个只读的tagName属性,该属性返回元素名,数据类型是DOMString. Element接口定义的方法也主要是针对属性操作,常见方法如下: 方法名 数据类型 说明 getAttribute DOMString 返回对应属性 getAttributeNode Attr 返回对应属性节点 getAtt

DOM笔记(十三):JavaScript的继承方式

在Java.C++.C#等OO语言中,都支持两种继承方式:接口继承和实现继承.接口继承制继承方法签名,实现继承则继承实际的方法和属性.在SCMAScript中,由于函数没有签名,所以无法实现接口继承,只支持实现继承. 实现继承主要依靠原型链来实现. 一.原型链 原型链是利用原型让一个引用类型继承另一个引用类型的方法,在DOM笔记(十二):又谈原型对象中,描述了构造函数.实例和原型之间的关系: 每个构造函数都有一个原型对象,原型对象包含一个指向构造函数的指针,而每个实例都包含一个指向原型对象的内部

DOM笔记(二):Node接口

所有的节点都使用Node接口来表示,可以使用很多方法去获取节点,如document.getElementsByTagName().document.getElementsByName()等均返回一个NodeList对象,然后获取其中的节点. 节点对应的属性和放大均在Node接口予以定义: 1.Node接口常见的属性列表 属性名 数据类型 说明 nodeName DOMString 返回节点名 nodeValue DOMString 返回节点值 nodeType int 返回节点类型(见后文) p

DOM笔记(五):JavaScript的常见事件和Ajax小结

一.常见事件类型 1.鼠标事件 事件名称 说明 onclick 鼠标单击时触发 ondbclick 鼠标双击时触发 onmousedown 鼠标左键按下时触发 onmouseup 鼠标释放时触发 onmouseover 鼠标的光标移动到某对象上时触发 onmousemove 鼠标移动时触发 onmouseout 鼠标光标离开某对象时触发 ps:当单击一次鼠标左键的时候,将同时触发onclick.onmousedown.onmouseup三个事件,事件处理程序执行的先后顺序为:onmousedow

DOM笔记(一):HTMLDocument接口

操作HTML文档的第一步就是获取对文档元素的引用,每一个元素在DOM中就是一个节点,所有的元素在DOM中构成一个节点树. 用于获取元素节点定义的方法定义于HTMLDocument接口,window.document方法用于实现该接口,其定义的常用方法和属性如下: 属性或方法 返回值类型 说明 [getter] 任何类型 根据元素的name属性获取所有元素节点 all HTMLAllCollection 文档中所有元素组成的集合,已不推荐使用 body HTMLElement 获取<body>元

DOM笔记(七):开发JQuery插件

在上一篇笔记本中,讲解了如何利用jQuery扩展全局函数和对象:DOM笔记(六):怎么进行JQuery扩展? 在这篇笔记本中,将开发一个简单的动画插件,名称是example-plugin,用其实现一个简单的功能:光标移动到目标标签,标签移动,改变背景色:光标离开时,标签恢复原来的样式. 因为是jQuery对象的扩展,采用jQuery.fn.extend()进行扩展,插件名是dwqs,并且使用闭包: /* *示例插件功能: *光标移动到目标标签,标签移动,改变背景色:光标离开时,标签恢复原来的样式