Javascript DOM基础
文档对象模型很重要,对文档结构,样式等等的改变就要靠它了,今天还算比较清闲,继续更新。不过有的程序调试的好纠结,fuck.由于这个编辑器有点问题,代码块展示不出来所以把代码全部显示出来了,请谅解。
DOM——文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口。Document Object Model的历史可以追溯至1990年代后期微软与NETscape的“浏览器大战”,双方为了在Javascript与JSscript一决生死,于是大规模的赋予浏览器强大的功能。微软在网页技术上加入了不少专属事物,计有VBScript、ActiveX控件、以及微软自家的DHTML格式等,使不少网页使用非微软平台及浏览器无法正常显示。DOM即是当时蕴酿出来的杰作。这一段往事了解就行了。
DOM分级——根据W3C DOM规范,DOM是HTML与XML的应用编程接口(API),DOM将整个页面映射为一个由层次节点组成的文件。有1级、2级、3级共3个级别。
DOM节点——父元素和子元素的关系。一个父元素只有一层的隶属关系。例如UL和Li,如果li下面还有诸如strong的标签,那么他就不是UL的子节点(元素)。
childNodes()
1 <script> 2 window.onload=function(){ 3 var oUl=document.getElementById('ul1'); 4 alert(oUl.childNodes.length); 5 }; 6 </script> 7 <body> 8 <ul id="ul1"> 9 <li>1</li> 10 <li>2</li> 11 <li>3</li> 12 </ul> 13 </body>
在火狐和谷歌下弹出7,在IE9弹出3,浏览器之间的不兼容问题。当然你可以使用childern来代替childNodes,就不会出现兼容性的问题了。
1 <script> 2 window.onload=function(){ 3 var oUl=document.getElementById('ul1'); 4 oUl.childNodes[0].style.background='red'; 5 }; 6 </script>
上面这段代码,本来是给li添加一个红色背景,但是没有成功,不知哪出问题了。原因在于火狐会把li与li之间的空格,也就是空的文本节点算作是一个节点。
nodeType节点类型,1代表元素节点,2代表attr属性,3代表文本节点;
offsetParent表示某个定位元素的父元素,获取元素在页面上的绝对坐标;
首尾子节点firstChild和firstElementChild分别在IE和火狐下有效果,可以通过一个判断语句来实现兼容或者通过“或”语句复制给一个变量,然后来实现。同样的还有lastChild和lastElementChild
兄弟子节点nextSibling和nextElementSibling。previousSibling和nextElementSiling
DOM方式操纵元素——setAttribute,getAttribute,removeAttribute
1 <script> 2 window.onload=function(){ 3 var otxt=document.getElementById('txt1'); 4 //otxt.value='123'; 5 //otxt['value']="12" 6 //otxt.setAttribute('value','1'); 7 alert(otxt.getAttribute('id')); 8 }; 9 </script> 10 <body> 11 <input type="text" id="txt1" /> 12 </body>
用className获取元素
封装函数来多次运用,获取类名通常使用很频繁,下面是封装函数的代码:
1 <script type="text/javascript"> 2 function getByClass(oParent, sClass)//第一个参数是父级元素,第二个参数是你要获取的类的名称 3 { 4 var aEle=oParent.getElementsByTagName('*');//获取所有父级元素下的元素名 5 var aResult=[]; 6 var i=0; 7 8 for(i=0;i<aEle.length;i++) 9 { 10 if(aEle[i].className==sClass)//如果类名等于你想要的那个类名,就不断的堆积 11 { 12 aResult.push(aEle[i]); 13 } 14 } 15 16 return aResult;//返回整个数组,数组里面六是你想要的全部类名 17 } 18 19 window.onload=function () 20 { 21 var oUl=document.getElementById('ul1'); 22 var aBox=getByClass(oUl, 'box'); 23 var i=0; 24 25 for(i=0;i<aBox.length;i++) 26 { 27 aBox[i].style.background='yellow'; 28 } 29 } 30 </script>
创建元素createElement()
下面是一个通过点击“单击创建li”这个按钮来创建li,并且在文本框内输入内容的时候,就会创建相应名称的li,但是程序不能执行,大家帮忙找找哪里写错了。程序应该没问题的,firebug也没有提示错误。下面是具体的代码:
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 5 <title>创建Li</title> 6 <script> 7 window.onload=function(){ 8 var otxt=document.getElementById('txt1'); 9 var obtn=document.getElementById('btn'); 10 var oul=document.getElementById('ul1'); 11 12 obtn.onclick=function(){ 13 var oli=document.createElement('li'); 14 oli.innerHTML=otxt.value; 15 oul.appendChild('oli'); 16 17 }; 18 }; 19 20 21 </script> 22 </head> 23 <body> 24 <input id="txt1" type="text" /> 25 <input id="btn" type="button" value="单击创建li" /> 26 <ul id="ul1"> 27 <li>123</li> 28 </ul> 29 </body> 30 </html>
添加元素appendChild()
他是在父元素的子节点的后面添加新元素。
插入元素insertBefore()
他是在父元素的子节点的前面添加新元素,他的名字也很好记,翻译过来就是“插入前面”。具体的例子可以看下面的代码,其中有一个判断语句,如果长度为零,就使用appendChild来添加新的元素,注意,这里不能使用insertBefore,因为如果一个元素也没有,insertBefore不起作用,而是用appendChild从元素后面插入元素,即使元素的个数为零,还是可以在零的基础上添加第一个元素。
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <style> 5 </style> 6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 7 <title>无标题文档</title> 8 <script type="text/javascript"> 9 //父.insertBefore(子节点, 谁之前) 10 11 window.onload=function () 12 { 13 var oBtn=document.getElementById('btn1'); 14 var oTxt=document.getElementById('txt1'); 15 var oUl=document.getElementById('ul1'); 16 17 oBtn.onclick=function () 18 { 19 var oLi=document.createElement('li'); 20 var aLi=oUl.getElementsByTagName('li'); 21 22 oLi.innerHTML=oTxt.value; 23 24 if(aLi.length==0) 25 { 26 oUl.appendChild(oLi); 27 } 28 else 29 { 30 oUl.insertBefore(oLi, aLi[0]); 31 } 32 } 33 } 34 </script> 35 </head> 36 37 <body> 38 <input id="txt1" type="text" /> 39 <input id="btn1" type="button" value="创建Li"/> 40 <ul id="ul1"> 41 </ul> 42 </body> 43 </html>
删除元素removeChild()
看下面的小实例,当单机链接时,就删除一个li,运用了this获取你即将点击的链接,其次,使用parentNode来获取父元素,当然了,还是要通过removeChild方法来删除相应的元素。(对了,我发现了一个文本编辑器的BUG,文本的颜色有时候改不过来,要转换两次颜色才可以变灰黑色==!)
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <style> 5 </style> 6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 7 <title>无标题文档</title> 8 <script type="text/javascript"> 9 window.onload=function () 10 { 11 var aA=document.getElementsByTagName('a'); 12 var oUl=document.getElementById('ul1'); 13 var i=0; 14 15 for(i=0;i<aA.length;i++) 16 { 17 aA[i].onclick=function () 18 { 19 oUl.removeChild(this.parentNode); 20 } 21 } 22 } 23 </script> 24 </head> 25 26 <body> 27 <ul id="ul1"> 28 <li>sdfsdf <a href="javascript:;">删除</a></li> 29 <li>3432 <a href="javascript:;">删除</a></li> 30 <li>tttt <a href="javascript:;">删除</a></li> 31 <li>ww <a href="javascript:;">删除</a></li> 32 </ul> 33 </body> 34 </html>
文档碎片Fragment
文档碎片可以优化性能,亲们,可以使用下面提供的两种不同方法在同一款浏览器下测试,有新兴趣的测试一下哦。我在chrome下测试结果卡死了,不知道什么情况,虽然循环了10万次也不至于卡死吧。文档碎片可以打包创建元素,而一般的方法是一个一个的创建元素,如此循环下去知道循环完毕。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <style> 5 </style> 6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 7 <title>无标题文档</title> 8 <script type="text/javascript"> 9 window.onload=function () 10 { 11 var oBtn=document.getElementById('btn1'); 12 var oUl=document.getElementById('ul1'); 13 14 oBtn.onclick=function () 15 { 16 var iStart=new Date().getTime(); 17 var oFrag=document.createDocumentFragment(); 18 var i=0; 19 20 for(i=0;i<100000;i++) 21 { 22 var oLi=document.createElement('li'); 23 24 oFrag.appendChild(oLi); 25 } 26 27 oUl.appendChild(oFrag); 28 29 alert(new Date().getTime()-iStart); 30 } 31 } 32 </script> 33 </head> 34 35 <body> 36 <input id="btn1" type="button" value="碎片"/> 37 <ul id="ul1"> 38 </ul> 39 </body> 40 </html>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <style> 5 </style> 6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 7 <title>无标题文档</title> 8 <script type="text/javascript"> 9 window.onload=function () 10 { 11 var oBtn=document.getElementById('btn1'); 12 var oUl=document.getElementById('ul1'); 13 14 oBtn.onclick=function () 15 { 16 var iStart=new Date().getTime(); 17 var i=0; 18 19 for(i=0;i<100000;i++) 20 { 21 var oLi=document.createElement('li'); 22 23 oUl.appendChild(oLi); 24 } 25 26 alert(new Date().getTime()-iStart); 27 } 28 } 29 </script> 30 </head> 31 32 <body> 33 <input id="btn1" type="button" value="普通"/> 34 <ul id="ul1"> 35 </ul> 36 </body> 37 </html>