2020.9.14陈悦玲BOM总结
dom语法总结
查找元素
#不需要查找可直接获得的节点:
document根节点
document.documentElement 获取html中包含的所有内容
document.head 获取head中包含的所有内容
document.body 获取body中包含的所有内容
document.forms[i] 获取页面中所有的表单元素
#按照节点间关系查找
节点树
关系:
父子关系:
1.elem.parentNode 获得当前节点的父节点
2.elem.childNodes 获得当前节点下的直接子节点的集合,返回一个类数组对象包含该父节点下所有直接子节点
3.elem.firstChild 获得当前节点下的第一个直接子节点
4.elem.lastChild 获得当前节点下的最后一个直接子节点
兄弟关系:
1.elem.previousSibling 获得当前节点的前一个平级兄弟节点
2.elem.nextSibling 获得当前节点的后一个平级兄弟节点
##解决节点树的方法(元素树)
使用元素树:什么是元素树?
仅包含元素节点的树结构,不是一棵新树,仅是节点树的子集(其实内存中只有一棵完整的节点树。而元素树只不过是在节点树的基础上,新增了一些仅指向元素节点的新属性而已。所以,元素树只是节点树中的一个子集)
什么时候用元素树?
所有的按关系查找,都用元素树,而不用节点树(只关心元素,不关心文本时)
使用 (两大类关系,六个属性)
父子
elem.parentElement
elem.children
elem.firstElementChild
elem.lastElementChild
兄弟
elem.previousElementSibling
elem.nextElementSibling
优点:不包含看不见的文本节点,不干扰查找
缺点:不包含一切文本节点,如果想获取文本可用 “ elem.innerHTML ”获取文本
实例:elem.innerHTML
兼容性问题:IE9+
##递归遍历
#按照HTML查找
##按照ID查找
var elem=document.getElementById("id")
提示:
1.只能用document调用,不能换成其他元素,使用document意为在整个网页范围内查找;
2.只能找到一个元素对象,如果找不到返回null,如果不小心两个HTML元素id名相同,则getElementById只能返回第一个找到的元素
问题:
1.按id查找一次只能找一个元素对象,无法同时找多个元素对象;
2.网页中标有id的元素并不多,因为没有那么多英文单词名字可用
按照标签名查找
var elems=parent.getElementsByTagName("标签名")
提示:
1.可在任意父元素下查找。主语是哪个父元素,就只在哪个父元素内查找符合条件的元素;
2.返回多个符合条件的元素组成的类数组对象,也是动态集合,如果找不到,返回空类数组对象:{ length:0 };
3.getElementsByTagName()不仅查找直接子元素,而是在所有后代中查找符合条件的元素
按照class
var elems=parent.getElementsByClassName("class")
提示:
1.可以在任意父元素上调用,控制查找的范围;
2.返回类数组对象,也是动态集合,如果没找到,返回空类数组对象{ length:0 };
3.不只是在直接子元素中查找,而是在所有后代子元素中查找符合条件的元素;
4.如果一个元素有多个class修饰,而查找时,只要用其中一个class,就能找到该元素
兼容性问题:IE9+
按照name查找
var elems=document.getElementsByName("name")
提示:
1.只能在document上调用;
2.返回类数组对象,也是动态集合,如果没找到,返回空类数组对象{ length:0 };
3.因为只有表单元素才会有name属性,所以,getElementsByName几乎专门用于查找指定name属性的表单元素
注意:ByTagName、ByClassName、 ByName三个函数注定返回类数组对象,即使只找到一个元素,也会放在类数组对象中返回,无法直接返回一个元素对象,所以,如果只找到一个元素对象时,应该再加[0],才能取出类数组对象中保存的惟一的这个元素对象
#按照选择器查找(Selector API)
查找一个元素
var elem=parent.querySelector("selector")
查找多个元素
var elems=parent.querySelectorAll("selector")
注意:差不到的返回null
HTML查找和选择器查找:
html返回动态集合,不实际存储所有内容,只返回本次所需内容;选择器查找返回非动态集合,可以直接存储所有数据;
修改元素
修改元素内容
elem.innerHTML
获取或设置开始标签到结束标签之间的原始的html代码片段,获取元素的HTML内容时,返回原始的HTML代码内容,修改元素的HTML内容时,先将新的HTML代码内容提交给浏览器解析后,再显示在元素内部
实例:
p.innerHTML="hello world"
elem.textContent = elem.innerText(后者都兼容性 ie8+)
获取或设置开始标签到结束标签之间的纯文本内容,获取元素的纯文本内容时,textContent会去掉内嵌标签,还会将特殊符号翻译为正文,修改元素的纯文本内容时,不会将新内容交给浏览器解析,而是直接原样显示在元素内部
实例:
p.textContent=“hello world”
elem.value
获取或修改表单元素的值
注意:获取表单元素的值不能用 “.innerHTML",因为表单元素多数是单标记,没有innerHTML,表单元素的内容都是用“.value”属性来获取或修改的
属性:
核心DOM
1.获取属性
var value=elem.getAttribute("属性名")
实例:获得a元素的href属性
a.getAttribute("href")
了解:
var attrNode=elem.attributes[ i / 属性名 ];
// var attrNode=elem.getAttributeNode("属性名");
var value=attrNode.value;
2.修改属性
elem.setAttribute("属性名",属性值)
注意:如果属性不存在,也可以使用setAttribute,此时会自动添加该属性
实例:修改a元素的title属性
a.setAttribute("title","hello world")
3.移除属性
elem.removeAttribute("属性名")
提示:只移除开始标签中的attribute,不删除内存中对象的property
实例:移除a元素的title属性
a.removeAttribute("title")
4.判断是否含有属性
var bool=elem.hasAttribute("属性名")
实例:判断a元素是否有id属性,如果含有返回true,否则返回false
a.hasAttribute("id")
HTML DOM
1.获取属性
elem.属性名
2.修改属性
elem.属性名=值
3.判断是否包含属性
elem.属性名!==""
4.移除属性
elem.属性名=""
5.特例:class属性
class属性,不能直接用 “ . ” 访问,因为class属性是ES中的关键词,所以DOM不能再使用class作为属性。如果操作页面上的class属性,只能改名为“ .className”。使用"元素“.className"属性,等效于使用<元素 class="xxx">属性,直接修改class
实例:
元素.className="xxx"
提示:元素.classList
1.元素.classList.add("class名")
2.元素.classList.remove("class名")
状态属性
样式
最好的修改样式的方法:
如果批量修改多个css属性时,首选用class,修改class属性,批量应用样式
实例:
var d1=ducment.getElementById("d1");
d1.className="disBlock";
d1.className="disNone";
优化样式修改
因为每修改一次样式,都可能导致重排重绘网页,所以,应该尽量减少修改样式的次数,使用 “ 元素.style.cssText属性 ” 代替,单独设置的 “ 元素.style.css属性 ”
实例:
元素.style.cssText="width:100px; height:100px"
注意:此时浏览器只需要一次重排重绘网页,对比单独设置:
元素.style.width="100px"
元素.style.height="100px"
单独设置导致网页在短时间内进行两次重排重绘
添加和删除元素
添加
1.创建新元素对象
var elem=document.createElement("标签名")
实例:创建一个页面元素对象
var a=document.createElement("a")
2.设置关键属性
实例:为创建好的对象添加属性
a.href="url";
a.innerHTML="文本"
问题:此时新创建的元素都没有在DOM树上。自然也就无法显示在网页中
3.将元素添加到DOM树
1.将新元素放在父元素下最后一个直接子元素后,末尾追加
实例:
parent.appendChild(child)
2.将新元素放在父元素下一个现有旧元素之前
实例:
parent.insertBefore(child,oldChild)
3.将新元素替换父元素下一个现有旧元素
实例:
parent.replaceChild(child,oldChild)
添加问题
每操作一次DOM树,都会导致重排重绘。如果数据量大,又频繁操作DOM树,会导致重排重绘不过来
解决添加问题
优化,尽量少的操作DOM树,如果同时添加父元素和子元素,应该先暂存内存中,将所有子元素添加到父元素,最后将父元素一次性添加到DOM树上,只需要重排重绘一次。如果父元素已经在DOM树上了,而要添加多个平级子元素,需要借助文档片段对象
删除
parent.removeChild(child)
评论