DOM常见操作

查找DOM节点

  • getElementById()
  • getElementsByTagName()
  • getElementsByName()
  • getElementsByClassName()
  • querySelector()
  • querySelectorAll()

前四种需要对应的参数,后两种可以使用任意CSS选择器作为参数。

前四种和后两种的主要区别:

  • 返回的对象不同

举例说明:
假设HTML代码如下:

<ul id="div-ul">
    <li>a</li>
    <li>a</li>
    <li>a</li>
</ul>

js代码如下:

let ulDiv = document.getElementsByTagName('li');
console.log(ulDiv); // HTMLCollection对象,HTMLCollection[3]0: li1: li2: lilength: 3__proto__: HTMLCollection
let aaa = document.querySelectorAll('li');
console.log(aaa); // NodeList对象,NodeList[3]0: li1: li2: lilength: 3__proto__: NodeList

HTMLCollection对象和NodeList对象:

  • 相同点:

    • 都是对象
    • 都有length属性
      console.log(ulDiv.length); // 3
      console.log(aaa.length); // 3

    • 都有item方法
      console.log(aaa.item(0)); // <li>a</li>
      console.log(ulDiv.item(0)); // <li>a</li>

    • 都可以使用方括号语法访问元素
      console.log(ulDiv[0]); // NodeList,<li>a</li>
      console.log(aaa[0]); // NodeList,<li>a</li>

    • 都可以通过转换为数组来使用数组方法,转换为数组可看类数组转换为数组

  • 不同点
    HTMLCollection对象

    nodeList对象

    • HTMLCollection对象有namedItem()方法,可以通过name访问元素,NodeList对象没有
    • nodeList对象有entries()、forEach()、keys()、values()方法
  • 前四种返回的结果是实时的,后两种不是。若动态添加元素,前四种会主动更新,后两种不会。
    HTML代码如下:

<div></div>

js代码如下:

const element1 = document.querySelectorAll('div');
const element2 = document.getElementsByTagName('div');
console.log(element1.length); // 1
console.log(element2.length); // 1
const newElement = document.createElement('div');
document.body.appendChild(newElement);
console.log(element1.length); // 1
console.log(element2.length); // 2
  • 由于前四种是实时集合,并不需要收集好所有信息,然而querySelectorAll()方法会立即收集所有信息并生成一个静态列表,这样性能没有前四种高。

节点关系操作

由于浏览器对文本节点的个数处理的不同,主要有两种节点关系操作方式。

  • 包括文本节点(除了IE9及之前版本不会返回文本节点,其他浏览器都会将文本节点计算在内)
    • childNodes, 返回nodeList对象,获取子节点
    • firstChild,获取第一个子节点
    • lastChild,获取最后一个子节点
    • previousSibling,获取兄弟节点中前一个节点,没有则为null
    • nextSibling,获取兄弟节点中后一个节点,没有则为null
    • parentNode,获取父节点
    • hasChildNodes,判断是否有子节点
  • 不包括文本节点
    • children,返回HTMLCollection对象,获取元素子节点
    • firstElementChild,获取第一个子节点
    • lastElementChild,获取最后一个子节点
    • previousElementSibling,获取兄弟节点中前一个节点,没有则为null
    • nextElementSibling,获取兄弟节点中后一个节点,没有则为null
    • childrenElementCount,获取元素节点个数

节点操作

  • createElement,创建新元素
  • createTextNode,创建新节点
  • appendChild,节点末尾插入元素。若该元素存在,相当于将该元素移动到末尾。
  • insertBefore,在某个元素前插入。
  • replaceChild,替换元素
  • removeChild,移除元素。
    • parentElement.removeChild(element); // 使用父元素删除
    • element.parentNode.removeChild(element); // 使用自身删除
  • cloneNode,复制元素。参数为true,表示深度复制,子元素也会被克隆;参数为false,表示浅层复制。
  • innerHTML,直接访问表示获取该元素内部HTML内容;设置值,则替换该元素内部全部元素
  • outerHTML,直接访问表示获取该元素(包括自身)的HTML内容;设置值,则替换该元素内容(包括该元素)
  • textContent,innerText
  • createDocumentFragment,为了减少DOM操作,改善性能,可以先使用该方法添加,最后一次添加到页面

元素属性

常见属性
  • nodeName,tagName。两者值一样,都是获取元素名称。只是后者更加语义化。
  • id
  • title
  • className
  • style,后面会详解
属性操作
  • getAttribute()
  • setAttribute()
  • removeAttribute()
    缺点:
  • 这几个方法会触发浏览器重绘。因此一般对没有相应的DOM属性的属性使用它们。
  • 使用getAttribute访问style属性时返回的是CSS文本,而通过属性访问返回的是对象。onclick这样的事件处理程序也有相似缺点。
类操作

对于类操作有classList属性。它是DOMTokenList的实例。
DOMTokenList方法

常用的方法有:
- length属性,类名个数
- item()
- add(),添加类名
- contains(),判断是否包含类名
- remove(),删除类名
- toggle(),若该类名存在则删除,若不存在,则添加

增加CSS样式

使用style属性。

  • CSSStyleDeclaration的实例。
  • 对于属性名称,js中使用驼峰表示法。
  • 只包含了直接定义在元素上的属性,不包含内联和外部样式。
  • 若要获取所有样式叠加后的属性,可以使用计算属性。
    • document.defaultView.getComputedStyle(元素,伪元素(可为null))
    • 同样返回CSSStyleDeclaration的实例

CSSStyleDeclaration:

<div style="border: 1px solid red; width: 200px; height: 300px; background-color: aqua" class="aaa bbb"></div>
  • cssText,所有CSS代码。可以一次设置多个属性。
const element = document.getElementsByTagName('div')[0];
console.log(element.style.cssText);// border: 1px solid red; width: 200px; height: 300px; background-color: aqua;
  • length,应用给CSS属性的数量
 console.log(element.style.length); // 20
  • getPropertyPriority(propertyName),如果给定属性使用!important设置,则返回“important”;否则返回空字符串。
  • getPropertyValue(propertyName),返回给定属性的字符串值
  • item(index),返回给定位置的CSS属性的名称
  • removeProperty(propertyName),删除给定属性
  • setProperty(propertyName, value, priority),priority为“important”或者空字符串

    CSSStyleDeclaration

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值