JS: DOM API

作者: 写代码的海怪 | 来源:发表于2019-01-27 12:24 被阅读19次

因为DOM本来是为XML设计的,而HTML也用这个API,所以很难用

分类

  1. Node API
  2. Element API -> Node API (Element.__proto__ === Node.prototype)
  3. Document API

DOM

Document Object Model

节点属性

nodeName

  • nodeName 一定返回大写
  • 只有<svg>标签是小写的nodeName,因为<svg>是外来的标签,后面才加入的
nodeName: 'HTML'

nodeType

因为以前的计算机内存太小了,所以用数字存会更省空间

  • 1 -> Node.ELEMENT_NODE
  • 3 -> Node.TEXT_NODE
  • 8 -> Node.COMMENT_NODE
  • 9 -> Node.DOCUMENT_NODE
nodeType: 'text      -> 文本
nodeType: 'element'  -> <a>...其他标签
nodeType: 'document' -> <html>
nodeType: 'comment'  -> 注释

页面中的节点 -> (构造函数) -> 对象
这样就可以对页面中的节点进行操作了

Node 的接口

Node也是一种构造函数,proto 指向Object.prototype

  • node -> 有文本
  • element -> 没有文本,只有标签

childNodes

  • 子节点,有文本
  • childNodes 返回的是一个动态的人格分裂,DOM树的改变会立刻反映在NodeList接口之中
document.body.childNodes // 只获取节点而不是元素:element, text...

children (Element API)

子标签,没有文本

document.body.children

firstElementChild(Element API)

document.body.firstElementChild

lastElementChild (Element API)

document.body.lastElementChild

nextElementSibling (Element API)

document.body.nextElementSibling

previousElementSibling (Element API)

document.body.previousElementSibling

innerText vs textContent

  • 一开始获取标签里的文本要遍历childNodes,如果是文本节点,那么就获取节点的nodeValue
  • 后面IE看不下去,推出了innerText
  • 再后来火狐又推出了textContent

不同

  • innerText 受CSS样式的影响,会去检查是否存在style代码,如果有则不会作为结果返回,但是这样性能会降低。

使用

if ('textContent' in document) {
    // 使用
}

节点方法

cloneNode()

deep 是否需要深拷贝

  • 深拷贝:一直克隆到没有子代为止
  • 浅拷贝:只克隆节点本身
var dupNode = node.cloneNode([deep]);

isEqualNode() vs isSameNode()

  • isEqualNode() 是否相同
  • isSameNode() 是否是全等,即三个等于号 === 是否是同一个

removeChild()

移除后还在内存里面,只不过是不出现在页面中

replaceChild()

我造一个儿子,将别的儿子节点替换

normalize()

将不正常的状态变成正常状态

var wrapper = document.createElement("div");

wrapper.appendChild( document.createTextNode("Part 1 ") );
wrapper.appendChild( document.createTextNode("Part 2 ") );

// At this point, wrapper.childNodes.length === 2
// wrapper.childNodes[0].textContent === "Part 1 "
// wrapper.childNodes[1].textContent === "Part 2 "

wrapper.normalize();

// Now, wrapper.childNodes.length === 1
// wrapper.childNodes[0].textContent === "Part 1 Part 2 "

添加文本

innerText

  • 副作用:会把children的也清空掉
red.innerText = 'hello world'

createTextNode

  • 直接在后面加TextNode
red.appendChild(document.createTextNode('hello world'))

Document 接口

referer(引荐)

  • 是哪个页面存在的请求
  • 如果是空开的页面去访问图片,那么就没有referer
  • 可以拒绝和其他网站发送对资源的请求

close()

  • 写 1,2 的时候 document.open(),然后开始写
  • 写完了 1,2 后,script就执行完了,会调用document.close()
  • 1秒之后,document已经关闭了,document会重新document.open(),里面的内容就会被冲掉了
document.write(1)
document.write(2)
setTimeout(() => {
  document.write(3)
})

execCommand()

写富文本的时候用到,例如
拷贝
[image:CCDB9190-42FF-4C4D-A429-C4A09E94A683-291-000116E8E6E4498B/3EF9C58B-BC9F-408C-9DBC-4396B9FC42FE.png]

querySelectorAll()

返回的是伪数组,没有原型链中没有Array.prototype
[image:3BB2A905-995D-489B-A27D-70AEB36F753B-291-0001172AC94C3481/C604188F-B589-4A9C-85CC-D35071F95302.png]

innerHTML 安全性

div.innerHTML = '<script>console.log(document.cookie)</script>'

HTMLCollections vs NodeList

  • HTMLCollections 是元素集合(属于Element接口),NodeList 是节点集合(属于Node接口)

注意:唯一要注意的是 querySelectorAll 返回的虽然是 NodeList ,但是实际上是元素集合,并且是静态的(其他接口返回的HTMLCollection和NodeList都是live的)

相关文章

  • 前端面试-vue汇总

    一、MVVM 1.背景:用js操纵html 1.1. 直接用js操纵dom节点,原生API var dom = d...

  • JS DOM API

    innerText和textContent的区别 nodeType值 cloneNode分为深拷贝和浅拷贝 isE...

  • JS: DOM API

    因为DOM本来是为XML设计的,而HTML也用这个API,所以很难用 分类 Node API Element AP...

  • insertAfter实现

    用原生JS实现在一个dom元素后插入新的节点? 在js的dom api中有insertBefore()方法 在已知...

  • 《React精髓》实践笔记 - Chapter 2

    React vs 原生JS DOM操作 运用原生JS API代码风格很重要,否则维护起来很困难,但是理解原生API...

  • DOM 的一些增删改查

    以下是JS中DOM节点中增删改查的基本API: 查 增 删 改 学习参考:原生JS中CSS相关API合集

  • 实现一个 jQuery 的 API

    想要实现一个以下功能用原生js的DOM API来实现一个类jQuery API的功能 1、首先获取DOM元素 判断...

  • javascript面试准备(一)

    interview js 基础 原型 原型链 作用域 闭包 异步 单线程 js Api dom 操作 ajax 事...

  • 调研油猴插件

    1. 介绍 方便用户往网页里注入js、dom元素。提供一些扩展api方便 js 开发,但看起来 api 也没有很强...

  • 000 VUE结构简单介绍

    1. DOM API和VUE实现同一个功能对比 1.1 DOM API是怎么做的 注意,上面的/app.js中的a...

网友评论

    本文标题:JS: DOM API

    本文链接:https://www.haomeiwen.com/subject/eqmgjqtx.html