JS基础 DOM
Posted wgchen~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS基础 DOM相关的知识,希望对你有一定的参考价值。
阅读目录
基础知识
操作文档 html 的 JS 处理方式为 DOM 即 Document Object Model 文档对象模型。如果对HTML 很了解使用 DOM 并不复杂。
浏览器在加载页面是会生成 DOM 对象,以供我们使用 JS 控制页面元素。
文档渲染
浏览器会将HTML文本内容进行渲染,并生成相应的JS对象,同时会对不符规则的标签进行处理。
- 浏览器会将标签规范后渲染页面
- 目的一让页面可以正确呈现
- 目的二可以生成统一的JS可操作对象
标签修复
在html中只有内容 wgchen.blog.csdn.net 而没有任何标签时,通过浏览器的 检查 >
元素 标签查看会自动修复成以下格式的内容。
下面 H1
标签结束错误并且属性也没有引号,浏览器在渲染中会进行修复
<body>
<h1 id=wg>后盾人<h1>
</body>
处理后的结果
表格处理
表格 tabel 中不允许有内容,浏览器在渲染过程中会进行处理
<table>
wgchen.blog.csdn.net
<tr>
<td>csdn</td>
</tr>
</table>
渲染后会添加t body 标签并将 table 中的字符移出
标签移动
所有内容要写在BODY标签中,下面的SCRIPT标签写在了BODY后面,浏览器渲染后也会进行处理。
<body></body>
<script>
console.dir('wgchen.blog.csdn.net')
</script>
渲染后处理的结果
操作时机
需要保证浏览器已经渲染了内容才可以读取的节点对象,下例将无法读取到节点对象。
<script>
const node = document.getElementById('wgchen')
console.log(node) //null
</script>
<h1 id="wgchen">wgchen.blog.csdn.net</h1>
不过我们可以将脚本通过事件放在页面渲染完执行
<script>
window.onload = () =>
const node = document.getElementById('wgchen')
console.log(node)
</script>
<h1 id="wgchen">wgchen.blog.csdn.net</h1>
或使用定时器将脚本设置为异步执行
<script>
setTimeout(() =>
const node = document.getElementById('wgchen')
console.log(node)
)
</script>
<h1 id="wgchen">wgchen.blog.csdn.net</h1>
也可以放在文档加载后的事件处理函数中
<script>
window.onload = function ()
let hd = document.getElementById('wgchen')
console.log(hd)
</script>
<h1 id="wgchen">wgchen.blog.csdn.net</h1>
或将脚本设置在外部文件并使用 defer
属性加载,defer即会等到DOM解析后迟延执行
<script defer="defer" src="3.js"></script>
<div id="wgchen"></div>
节点对象
JS中操作DOM的内容称为节点对象(node),即然是对象就包括操作NODE的属性和方法
- 包括12种类型的节点对象
- 常用节点为document、标签元素节点、文本节点、注释节点
- 节点均继承自Node类型,所以拥有相同的属性或方法
- document是DOM操作的起始节点
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>wgchen</title>
<link rel="shortcut icon" href="#" />
<meta name="keywords" content="wgchen.blog.csdn.net">
</head>
<body id="wgchen">
<!-- wgchen -->
</body>
<script>
// document节点 noteType为9
console.log(document.nodeType)
// 第一个子节点为<!DOCTYPE html>,且nodetype为10
console.log(document.childNodes.item(0).nodeType)
// body 是标签节点 nodeType为1
console.log(document.body.nodeType)
// body的属性节点 nodeType 为2
console.log(document.body.attributes[0].nodeType)
// body的第一个节点为文本节点,nodeType为3
console.log(document.body.childNodes.item(0).nodeType)
// body的第二个节点为注释,nodeType类型为8
console.log(document.body.childNodes[1].nodeType)
</script>
</html>
原型链
在浏览器渲染过程中会将文档内容生成为不同的对象,我们来对下例中的 h1
标签进行讨论,其他节点情况相似。
- 不同类型节点由专有的构造函数创建对象
- 使用
console.dir
可以打印出DOM节点对象结构 - 节点也是对象所以也具有JS对象的特征
<h1 id="wgchen">wgchen.blog.csdn.net</h1>
<script>
function prototype(el)
console.dir(el.__proto__)
el.__proto__ ? prototype(el.__proto__) : ''
const node = document.getElementById('wgchen')
prototype(node)
</script>
最终得到的节点的原型链为
原型 | 说明 |
---|---|
Object | 根对象,提供hasOwnProperty等基本对象操作支持 |
EventTarget | 提供addEventListener、removeEventListener等事件支持方法 |
Node | 提供firstChild、parentNode等节点操作方法 |
Element | 提供getElementsByTagName、querySelector等方法 |
HTMLElement | 所有元素的基础类,提供childNodes、nodeType、nodeName、className、nodeName等方法 |
HTMLHeadingElement | Head标题元素类 |
我们将上面的方法优化一下,实现提取节点原型链的数组
<h2 id="h2 value">wgchen.blog.csdn.net</h2>
<input type="text" id="inputId" value="wgchen" />
<script>
function prototype(el)
const prototypes = []
prototypes.push(el.__proto__)
prototypes.push(...(el.__proto__ ? prototype(el.__proto__) : []))
return prototypes
const h2 = document.querySelector('h2')
const input = document.querySelector('input')
console.log(prototype(input))
</script>
下面为标题元素增加两个原型方法,改变颜色与隐藏元素
<h2 onclick="this.color('red')">wgchen.blog.csdn.net</h2>
<script>
const h2 = document.querySelector('h2')
HTMLHeadingElement.prototype = Object.assign(HTMLHeadingElement.prototype,
color(color)
this.style.color = color
,
hide()
this.style.display = 'none'
,
)
</script>
对象特征
即然DOM与我们其他JS创建的对象特征相仿,所以也可以为DOM对象添加属性或方法。
对于系统应用的属性,应该明确含义不应该随意使用,比如 ID
是用于标识元素唯一属性,不能用于其他目地。
- 后面会讲到其他解决方案,来自定义属性,ID属性可以直接修改但是不建议这么做
<h2 id="hd">wgchen.blog.csdn.net</h2>
<script>
let hd = document.getElementById('hd')
hd.id = 'wgchen'
console.log(hd)
</script>
title 用于显示提示文档也不应该用于其他目地
<div id="hd">wgchen.blog.csdn.net</div>
<script>
let hd = document.getElementById('hd')
hd.title = 'wgchen'
console.log(hd)
</script>
下面是为对象合并属性的示例
<div id="hd">wgchen.blog.csdn.net</div>
<script>
let hd = document.getElementById('hd')
Object.assign(hd,
//设置标签内容
innerHTML: 'wgchen',
color: 'red',
change()
this.innerHTML = 'willem'
this.style.color = this.color
,
onclick()
this.change()
,
)
</script>
使用对象特性更改样式属性
<div id="hd">wgchen.blog.csdn.net</div>
<script>
let hd = document.getElementById('hd')
Object.assign(hd.style,
color: 'white',
backgroundColor: 'red',
)
</script>
常用节点
JS 提供了访问常用节点的 api
方法 | 说明 |
---|---|
document | document是DOM操作的起始节点 |
document.documentElement | 文档节点即html标签节点 |
document.body | body标签节点 |
document.head | head标签节点 |
document.links | 超链接集合 |
document.anchors | 所有锚点集合 |
document.forms | form表单集合 |
document.images | 图片集合 |
DOCUMENT
document 是 window 对象的属性,是由 HTMLDocument 类实现的实例。
document 包含 DocumentType(唯一)或 html元素(唯一)或 comment 等元素
原型链中也包含 Node,所以可以使用有关节点操作的方法如 nodeType/NodeName
等
console.dir(document.nodeType)
console.dir(document.nodeName)
使用title获取和设置文档标题
//获取文档标题
console.log(document.title)
//设置文档标签
document.title = 'wgchen-wgchen.blog.csdn.net'
获取当前URL
console.log(document.URL)
获取域名
console.log(document.domain) // tt.cc
获取来源地址
console.log(document.referrer)
系统针对特定标签提供了快速选择的方式
ID 获取元素
下面是直接使用 ID 获取元素(这是非标准操作,对浏览器有挑剔)
<div id="app">wgchen</div>
<script>
// 直接通过 ID 获取元素(非标准操作)
console.dir(app)
</script>
links下面展示的是获取所有a标签
<div name="app">
<a href="">wgchen.blog.csdn.net</a>
<a href="">blog</a>
</div>
<script>
const nodes = document.links
console.dir(nodes)
</script>
anchors 获取锚点集合
下例是获取锚点集合后能过 锚点 name 属性获取元素
<div>
<a href="" name="n1">wgchen.blog.csdn.net</a>
<a href="" name="n2">blog</a>
</div>
<script>
// 通过锚点获取元素
console.dir(document.anchors.n2)
</script>
images 获取所有图片节点
下面是获取所有图片节点
<img src="" alt="" />
<img src="" alt="" />
<img src="" alt="" />
<script>
// 获取所有图片节点
console.dir(document.images)
</script>
节点属性
不同类型的节点拥有不同属性,下面是节点属性的说明与示例
nodeType 指以数值返回节点类型
nodeType | 说明 |
---|---|
1 | 元素节点 |
2 | 属性节点 |
3 | 文本节点 |
8 | 注释节点 |
9 | document对象 |
下面是节点 nodeType 的示例
<div id="app">
<div class="wgchen" data="hd">wgchen.blog.csdn.net</div>
<div class="willem">blog</div>
<div class="ycc"><!-- 技术博客 --></div>
</div>
<script>
const node = document.querySelector(`#app`)
console.log(node.nodeType) //1
console.log(node.firstChild.nodeType) //3
console.log(node.attributes.id.nodeType) //2
const xj = document.querySelector('.ycc')
console.log(xj.childNodes[0].nodeType) //8
</script>
下面是根据指定的 nodeType 递归获取节点元素的示例
- 可获取文本、注释、标签等节点元素
<!-- 博客 -->
博客 wgchen.blog.csdn.net
<div id="app">
<ul>
<li>
<span></span>
<span>
<!-- wgchen -->
</span>
</li>
<li><span></span><span></span></li>
<li><span></span><span></span></li>
</ul>
</div>
<script>
function all(el, nodeType = 1)
const nodes = []
Array.from(el.childNodes).map(node =>
if (node.nodeType == nodeType) nodes.push(node)
if (node.nodeType == 1) nodesJS-DOM事件