15 DOM拓展

131 阅读4分钟

对前面的DOMapi进行补充(其实就是对document、Element增加了属性)目前已得到主流浏览器支持

1.Selectors API

根据选择器来匹配DOM元素

1.1.querySelector()

接受css选择符参数,返回匹配该模式的第一个后代元素,没有则为null

1.2.querySelectorAll()

接受css选择符参数,返回匹配该模式的所有后代元素组成的NodeList(静态),没有则返回空的NodeList

1.3.matches()

接受css选择符参数,如果调用元素匹配该选择符则返回true

2.元素遍历

由于Element节点的子元素可能包含Text、Comment类型,但是实际上的DOM操作更多是对后代Element元素进行操作,故此多了此部分标准

  • children:HTMLCollection对象,只保存子树中的Element元素,如果子树中全是Element元素,则和childNodes相同
  • childElementCount:返回子元素数量
  • firstElementChild/lastElementChild:指向第一/最后一个子元素
  • previousElementSibling/nextElementSibling:指向调用元素的前一个/后一个Element类型的同胞元素
  • contains():如果传入的元素位于调用元素的后代,则返回true

3.HTML5

之前的HTML只是一个纯标记语言,但是HTML5包含了与标记相关的大量JavascriptAPI定义,当然这只是其中一个区别

3.1.CSS类拓展

1.getElementsByClassName()

传入一个一个或多个类名字符串,返回包含相应类的元素的NodeList(静态),如果是多个,类名顺序无关紧要,但是必须包含所有类

<div class="username">name</div>
<div class="current username">currentUsername</div>
<script>
    let currentUsernameElements = document.getElementsByClassName('username current');//顺序不会影响
    console.log(currentUsernameElements.length); //1
</script>

2.classList属性

html元素可以通过空格分割多个类名字符串来一次性设置多个类,classList的出现就是为了方便添加、删除某个类,属性classList值是DOMTokenList实例

属性

length:返回元素个数

方法

item():按索引获得元素,可以使用[]代替 add/remove(类名字符串):添加删除类 contains(类名字符串):判断给定类名是否存在 toggle(类名字符串):切换,如果类存在则删除,不存在则添加

3.2 焦点管理

document.activeElement保存着当前有有焦点的DOM元素,可以输入tab键或使用元素.focus()来设置其值并使得元素获得焦点

3.3 HTMLDocument拓展

由于document对象继承自HTMLDocument,所以是对document对象属性进行添加

  • readyState属性:complete时为文档加载完成,loading表示正在加载
  • compatMode属性:指示当前处于什么渲染模式,不重要
  • head属性:指向head标签
  • characterSet属性:文档编码方式

3.4自定义数据属性

按照标准,自定义属性开头为data-名字,此命名的自定义属性能在对应节点的属性dataset中找到,这样就可以不需要像之前那样setAttribute()来设置自定义属性

<div class="current username" data-id="123" data-name-user="juejin">currentUsername</div>
<script>
    let currentUsernameElements = document.getElementsByClassName('username current');
    console.log(currentUsernameElements[0].dataset); //{id: '123', nameUser: 'juejin'}
</script>
  • 注意data-之后的属性名,在dataset中是有变化的,比如上面的data-name-user,在dataset中是用驼峰命名nameUser替代的,所以访问的时候也需要变化

3.5插入标记

1.innerHTML属性

  • 读取:返回调用元素后代的HTML字符串,包括元素、注释和文本节点
  • 写入:根据提供的字符串值以新的DOM子树替换原本的所有节点,注意提供的任何值都会被解析成DOM树,如果值不包含任何HTML标签,则直接生成一个文本节点,如果写入的是script脚本,就可能导致攻击

2.innerText属性

  • 读取:按照深度优先将子树的所有文本节点的值拼接起来
  • 写入:将子树替换为包含该值的文本节点

3.outerHTML/outerText属性

比inner就是将调用元素本身也包含进内

4.insertAdjacentHTML()/insertAdjacentText()

接受位置字符串和要插入的HTML或文本,作用时将要插入的文本插入;到调用元素标签的不同位置

位置字符
  • beforebegin:插入的文本在开始标签之前
  • afterbegin:在开始标签之后
  • beforeend:在结束标签之前
  • afterend:在结束标签之后

其中的begin和end代表调用元素的标签,begin为开始标签,end为结束标签

5.内存与性能

因为插入之后都是要直接删掉原本的子树,所以与原本的子树中的元素相关的处理程序和js对象需要手动释放,不然可能造成内存泄漏

3.6 scrollIntoView()

将视口移动到调用此方法的元素所在位置,和锚效果差不多

接受参数

  • alignToTop:ture代表滚动后元素的顶部与视口顶部对齐,false则是底部与视口顶部对齐,默认true
  • scrollIntoViewOption:是一个选项对象
    • behavior:可取值:smooth和auto,默认auto
    • block:垂直方向对齐方式:start、center、end和nearest,默认start
    • inline:水平,和上面一样,默认nearest