20200901岳浩天
知识总结
DOM操作流程:
1.构建DOM树
2.查找触发事件的元素
3.绑定事件的处理函数
查找元素
不需要查找的元素:
document
document.documentElement 获取html中包含的所有内容
document.head
document.body
document.forms[i]
节点树查找的优缺点:
优点:网页结构完整
缺点:我们在写代码的时候为了代码格式,会添加很多空格,缩进,换行,这些都是字符。在节点树中,字符也是节点对象,称为 " #text " 。这些看不见的文本节点,会极大的妨碍正常的查找
元素树的优缺点:
优点:不包含看不见的文本节点,不干扰查找
缺点:不包含一切文本节点,如果想获取文本可用 “ elem.innerHTML ”获取文本
实例:elem.innerHTML
兼容性问题:IE9+
childNodes和children的区别
childNodes和children都返回动态集合(live collection),不实际存储数据,每次访问集合,都是重新查找DOM树
优点:首次查找返回速度快
缺点:反复访问集合,会导致反复查找DOM树
遍历:for(var i=0,len=children.length;i<len;i++)
区别:
1.childNodes是标准属性,返回指定元素的子元素集合,包括HTML节点,所有属性,文本节点。可以通过nodeType判断是哪种类型的节点;
2.children是非标准属性,返回指定元素的子元素集合。但是它只返回HTML几点,甚至不返回文本节点,虽然不是标准的DOM属性,但是却得到几乎所有浏览器的支持
递归遍历
遍历body下的所有子元素:
var body=document.body;
function getChild(parent){
// Step1:遍历parent的直接子节点
var child=parent.childNodes;
for(var i=0;i<child.length;i++){
// 输出查找到的子元素
console.log(child[i])
//Step2: 为每个子节点调用和父节点完全相同的函数
console.log(arguments);
arguments.callee(child[i]);
}
}
getChild(body)
但是递归的效率极低
解决效率低的方法:
可用循环代替递归
实例:
function getChild(parent){
// 创建迭代器对象
var iterator=document.createNodeIterator(
parent, NodeFilter.SHOW_ALL , null, false
// parent, NodeFilter.SHOW_ELEMENT , null, false
);
var node;
while((node=iterator.nextNode())!=null){
// node获得当前正在遍历的节点
console.log(node.nodeType!=3?node.nodeName:node.nodeValue);
}
}
解析:createNodeIterator // 节点原生遍历
语法:document.createNodeIterator(root,whatToShow,filter,false);
注意:createNodeIterator遍历的时候包含自身元素
可用按条件查找解决只能遍历所有,如需筛选,得自己写判断的问题
html查找和选择器查找比较:
返回值:
1.按HTML,返回动态集合,不实际存储所有内容,只返回本次所需的内容,如果重复访问集合,就需要重新查找DOM树,优点是首次查找速度快,缺点是反复访问集合,会导致反复查找DOM树(会根据页面元素的变化而变化);
2.selector API,返回非动态集合,可以直接存储所有数据,即使反复访问集合,也不需要反复查找DOM树
首次查询效率:
1.按HTML效率更高,仅返回需要的内容,不需要准备完整数据;
2.selector API低,第一次要返回完整数据
易用性:
1.按HTML繁琐;
2.selector API简单
什么时候使用:
1.如果只凭一个条件即可获得想要的元素时,首选按HTML查找;
2.如果需要多级复杂条件查找才能获得想要的元素时,用selector API
修改
elem.innerHTML 识别标签
elem.textContent 不识别标签
elem.innerText
elem.value
属性:
获取属性var value=elem.getAttribute("属性名")
修改属性elem.setAttribute("属性名",属性值)
移除属性elem.removeAttribute("属性名")
判断是否含有属性var bool=elem.hasAttribute("属性名")
HTML DOM:
获取属性elem.属性名
修改属性elem.属性名=值
判断是否包含属性elem.属性名!==""
移除属性elem.属性名=""
特例:class属性:
class属性,不能直接用 “ . ” 访问,因为class属性是ES中的关键词,所以DOM不能再使用class作为属性。如果操作页面上的class属性,只能改名为“ .className”。使用"元素“.className"属性,等效于使用<元素 class="xxx">属性,直接修改class
实例:
元素.className="xxx"
提示:元素.classList
1.元素.classList.add("class名")
2.元素.classList.remove("class名")
添加
step1:创建新元素对象
var elem=document.createElement("标签名")
实例:创建一个页面元素对象
var a=document.createElement("a")
step2:设置关键属性
实例:为创建好的对象添加属性
a.href="url";
a.innerHTML="文本"
问题:此时新创建的元素都没有在DOM树上。自然也就无法显示在网页中
step3:将元素添加到DOM树
1.将新元素放在父元素下最后一个直接子元素后,末尾追加
实例:
parent.appendChild(child)
2.将新元素放在父元素下一个现有旧元素之前
实例:
parent.insertBefore(child,oldChild)
3.将新元素替换父元素下一个现有旧元素
实例:
parent.replaceChild(child,oldChild)
文档片段:
step1:创建文档片段对象
var frag=document.createDocumentFragment();
step2:将多个平级子元素临时添加到文档片段对象中
frag.appendChild(child)
step3:将文档片段整体一次性添加到DOM树上指定父元素下
parent.appendChild(frag)
注意:frag不会成为页面元素,添加子元素后,frag自动释放
近期评论