DOM

Posted HUMILITY

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DOM相关的知识,希望对你有一定的参考价值。

DOM基础

DOM查找

document object model
DOM是W3C(万维网联盟)的标准,是中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容,结构和样式。

对网页进行增删改查的操作。

DOM标准

开发:先用简单的,再用复杂的补充————以实现效果为目的

核心DOMhtml DOM
可操作一切结构化文档的API专门操作HTML文档的简化版DOM API
包括HTML和XML仅对常用的复杂的API进行了简化
万能不是万能
繁琐简单

常用DOM操作
查找节点
读取节点信息
修改节点信息
创建新节点
删除节点

常用DOM方法
getElementById()
getElementsByTagName()
getElementsByClassName()
appendChild()
removeChild()
replaceChild()
inserBefore()
creatAttribute()
creatElement()
creatTextNode()
getAttribute()
setAttribute()

按id属性,精确查找一个元素对象

var elem=document.getElementById("id")
效率非常高
强调:getElementById只能用在document上
何时:只用于精确查找一个元素
问题:不是所有元素都有id

例子:
<ul id="myList">
        <li id="m1">首页</li>
        <li id="m2">企业介绍</li>
        <li id="m3">联系我们</li>
</ul>        
var ul=document.getElementById(\'myList\');
console.log(ul);

按标签名找

var elems=parent.getElementByTagName("tag")
查找指定parent节点下所有标签为tag的子代节点
强调:
1.可用在任意父元素上
2.不仅查直接子节点,而且查所有子代节点
3.返回一个动态集合
即使只招待一个元素,也返回集合
必须用[0],取出唯一元素
问题:不但找直接,而且找所有子代。

例子:
<ul id="myList">
        <li id="m1">首页</li>
        <li id="m2">企业介绍</li>
        <li id="m3">联系我们</li>
</ul>        
var ul=document.getElementById(\'menuList\');
var list=ul.getElementByTagName(\'li\');
console.log(list);

通过name属性查找

**document.getElementByName(\'name属性值\')
可以返回DOM树中具有指定name属性值的所有子元素集合。

例子:
<form id="registerForm">
        <input type="checkbox"name="boy"/>
        <input type="checkbox"name="boy"/>
        <input type="checkbox"name="boy"/>
</form>

var list=document.getElementByName(\'boy\');
console.log(typeof list);

通过class查找

查找父元素下指定class属性的元素
var elems=parent.getElementByClassName("class")
有兼容性问题:IE9+

例子:
<div id="news">
    <p class="mainTitle">新闻标题1</p>
    <p class="subTitle">新闻标题2</p>
    <p class="mainTitle">新闻标题3</p>
</div>

var div=document.getElementById(\'news\');
var list=div.getElementByClassName(\'mainTitle\');
console.log(list);

通过css选择器查找

元素选择器
类选择器
id选择器
后代选择器
子代选择器
群组选择器

只找一个元素:
var elem=parent.querySelector("selector")
强调:
selector支持一切css中选择器
如果选择器匹配的有多个,只返回第一个

找多个元素:
var elem=parent.querySelectorAll("selector")
强调:
selector API返回的是非动态集合

DOM修改

修改属性核心DOM:四个操作

读取属性值:2种
1.先获取属性节点对象,再获得节点对象的值
var attrNode=elem.attributes[下标/属性名]
var attrNode=elem.getAttributeNode(属性名)

attrNode.value————属性值

2.直接获得属性值
var value=elem.getAttribute("属性名");

修改属性值
elem.setAttribute("属性名",value);

var h1=document.getElementById("a1");
h1.setAttributeNode("name",zzx);
//获取到名字修改内容

判断是否包含之中的属性:
var bool=elem.hasAttribute("属性名") //ture或false

document.getElementById(\'bt1\').hasAttribute(\'onclick\'); //获取id为bt1的元素判断有无onclick属性

移除属性:
elem.removeAttribute(\'属性名\')

<a id="alink"class="slink"href="javascript:void(0)"onclick="jump()">百度搜索</a>
var a=document.getElementById(\'alink\');
a.removeAttribute(\'class\');

修改样式
内联样式:elem.style.属性名
强调:属性名:去横线,变驼峰
比如:
css:
background-color
变为
backgroundColor

list-style-type
变为
listStyleType

DOM添加

添加元素的步骤:
1.创建空元素
2.设置关键属性
3.将元素添加到DOM树

创建空元素

var elem=document.creatElement("元素名")
如:
var table=document.creatElement(\'table\');
var tr=document.creatElement(\'tr\');
var td=document.creatElement(\'td\');
var td=document.creatElement(\'td\');

console.log(table);

设置关键属性

关键属性
a.innerHTML="go to tmooc"
a.href="http://tmooc";
go to mooc;
关键样式
a.style.opacity="1";
a.style.cssText="width:100px;height:100px"; //可写多个属性

将元素添加到DOM树

parentNode.appendChild(childNode)
可用于将一个父元素追加最后一个子节点

var div = document.creatElement(\'div\');
var txt = document.creatTextNode(\'版权声明\');

div.appendChild(txt);  //将txt放在div里
document.body.appendChild(div);  //将div放在body里面

parentNode.insertBefore(newChild,existingChild)
用于在父元素中指定子节点之前添加一个新得子节点

<ul id="menu">
    <li>首页</li>
    <li>联系我们</li>
</ul>

var ul=document.getElementById(\'Menu\');
var newLi=document.creatElement(\'li\');

ul.insertBefore(newLi,ul.lastChild);

添加元素优化

尽量少的操作DOM树
为什么:每次修改DOM树,都导致重新layout
1.如果同时创建父元素和子元素时,建议在内存中先将子元素添加到父元素,再将父元素一次性挂到页面
2.如果只添加多个平级子元素时,就要将所有子元素,临时添加到文档片段中,再将文档片段整体添加到页面
文档片段:内存中,临时保存多个平级子元素的虚拟父元素,用法和普通父元素完全一样
如何:
1.创建片段:
var frag=document.creatDocumentFragment();
2.将子元素临时追加到frag中
frag.appendChild(child);
3.将frag追加到页面
parent.appendChild(frag);
强调:append之后,frag自动释放,不会占用元素

以上是关于DOM的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript单行代码,也就是代码片段

实用代码片段将json数据绑定到html元素 (转)

深入理解DOM节点类型第四篇——文档片段节点DocumentFragment

JavaScript 将片段附加到DOM而不是每个节点。

前端开发常用js代码片段

将片段附加到DOM而不是每个节点。