文章目录
DOM
1. DOM 介绍
DOM(Document Object Model)是一套对文档的内容进行抽象和概念化的方法。
当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model)。
HTML DOM 模型被构造为对象的树。
节点父、子和同胞
我们常用父(parent)、子(child)和同胞(sibling)等术语来描述这些关系。
父节点拥有子节点。
同级的子节点被称为同胞(兄弟或姐妹)。
在节点树中,顶端节点被称为根(root)。
每个节点都有父节点、除了根(它没有父节点)。
一个节点可拥有任意数量的子节点。
同胞是拥有相同父节点的节点。
DOM 作用
文档节点(document对象): 代表整个文档
元素节点(element 对象): 代表一个元素(标签)
文本节点(text对象): 代表元素(标签)中的文本
属性节点(attribute对象): 代表一个属性,元素(标签)才有属性
注释节点(comment对象): 代表注释
JavaScript 能够改变页面中的所有 HTML 元素
JavaScript 能够改变页面中的所有 HTML 属性
JavaScript 能够改变页面中的所有 CSS 样式
JavaScript 能够对页面中的所有事件做出反应
2. Document 对象
当浏览器载入 HTML 文档, 它就会成为 Document 对象。
Document 对象是 HTML 文档的根节点。
Document 对象使我们可以从脚本中对 HTML 页面中的所有元素进行访问。
常见 Document 方法或属性 | 说明 |
---|---|
document.getElementById | 根据 id 获取一个标签 |
document.getElementsByName() | 返回带有指定 name 的对象集合。 |
document.getElementsByClassName | 根据 class 属性获取对象集合。 |
document.getElementsByTagName | 根据标签名获取标签合集 |
document.body | 返回文档的body元素 |
document.forms | 返回对文档中所有 Form 对象引用。 |
document.images | 返回对文档中所有 Image 对象引用。 |
document.title | 返回当前文档的标题。 |
document.URL | 返回文档完整的URL |
document.write() | 向文档写 HTML 表达式 或 JavaScript 代码。 |
document.createElement() | 创建元素节点。 |
document.createTextNode() | 创建文本节点。 |
document.createAttribute() | 创建一个属性节点 |
document.createComment() | 创建一个注释节点。 |
3. element 元素对象
在 HTML DOM 中, 元素对象代表着一个 HTML 元素。
元素对象的子节点可以是元素节点,文本节点,注释节点
元素对象常用属性或方法 | 说明 |
---|---|
element.appendChild() | 为元素添加一个新的子元素 |
element.attributes | 返回一个元素的属性数组 |
element.childNodes | 返回元素的一个子节点的数组 |
element.children | 返回元素的子元素的集合 |
element.classList | 返回元素的类名,作为 DOMTokenList 对象。 |
element.className | 设置或返回元素的 class 属性名称 |
element.firstElementChild | 返回元素的第一个子元素 |
element.firstChild | 返回元素的第一个子节点 |
element.getAttribute() | 返回指定元素的属性值 |
element.getElementsByTagName() | 返回指定标签名的所有子元素集合。 |
element. getElementsByClassName() | 返回文档中所有指定类名的元素集合,作为 NodeList 对象。 |
element.hasAttribute() | 如果元素中存在指定的属性返回 true,否则返回false。 |
element.hasAttributes() | 如果元素有任何属性返回true,否则返回false。 |
element.hasChildNodes() | 返回一个元素是否具有任何子元素 |
element.id | 设置或者返回元素的 id。 |
element.innerHTML | 设置或者返回元素的内容。 |
element.innerText | 设置或者返回元素的内容。 |
element.nodeType | 返回元素的节点类型 |
element.nodeValue | 返回元素的节点值 |
element.removeAttribute() | 从元素中删除指定的属性 |
element.removeChild() | 删除一个子元素 |
element.style | 设置或返回元素的样式属性 |
element.setAttribute() | 设置或者改变指定属性并指定值。 |
element.setAttributeNode() | 设置或者改变指定属性节点。 |
element.value | 设置或获得值 |
4. 查找标签
直接查找标签
使用的方法
document.getElementById 根据ID获取一个标签
document.getElementsByClassName 根据class属性获取
document.getElementsByTagName 根据标签名获取标签合集,需要索引取值
间接查找标签
使用的方法
parentElement 父节点标签元素
children 所有子标签
firstElementChild 第一个子标签元素
lastElementChild 最后一个子标签元素
nextElementSibling 下一个兄弟标签元素
previousElementSibling 上一个兄弟标签元素
示例
document.getElementById('d1').children
查找id为d1的标签内部的所有子标签。
5. 节点操作
创建节点
如需向 HTML DOM 添加新元素,您首先必须创建该元素(元素节点),然后把它追加到已有的元素上。
使用的方法
document.createElement() 创建元素节点。
document.createTextNode() 创建文本节点。
document.createAttribute() 创建一个属性节点
document.createComment() 创建一个注释节点。
示例(代码片段)
<body>
<div id="d1"></div>
<script>
var d1Ele = document.getElementById('d1') //创建已有的元素变量
var pEle = document.createElement('p') // 创建新段落节点
var aEle = document.createElement('a') // 创建新链接节点
var cEle = document.createComment('这是新注释节点') // 创建新注释节点
var tEle = document.createTextNode('这是新文本节点') //创建新文本节点
pEle.innerHTML = '<h2>这是新段落节点</h2>' // 修改新段落节点内容
aEle.href = 'https://www.baidu.com' // 修改链接地址
aEle.innerText = '点击转向百度' // 修改链接文本
d1Ele.append(pEle) // 在已存在节点后追加新段落节点
d1Ele.append(aEle) // 在已存在节点后追加新链接节点
d1Ele.append(cEle) // 在已存在节点后追加新注释节点
d1Ele.append(tEle) // 在已存在节点后追加新文本节点
</script>
</body>
1. 执行后的结构如下图所示。
删除节点
使用的方法
element.removeChild() 删除一个子元素
示例(代码片段)
<body>
<div id="d1" ></div>
<script>
var d1Ele = document.getElementById('d1') //创建已有的元素变量
var pEle = document.createElement('p') // 创建新段落节点
var aEle = document.createElement('a') // 创建新链接节点
pEle.innerHTML = '这是新段落节点' // 修改新段落节点内容
aEle.href = 'https://www.baidu.com' // 修改
aEle.innerText = '点击转向百度'
d1Ele.append(pEle) // 在已存在节点后追加新段落节点
d1Ele.append(aEle) // 在已存在节点后追加新链接节点
d1Ele.removeChild(pEle) // 删除节点
</script>
</body>
6. 属性操作
attribute操作
使用的方法
element.getAttribute() 返回指定元素的属性值
element.hasAttribute() 如果元素中存在指定的属性返回 true,否则返回false。
element.setAttribute() 设置或者改变指定属性并指定值。
element.removeAttribute() 从元素中删除指定的属性
获取指定属性值
使用的方法
element.getAttribute() 返回指定元素的属性
element.id 设置或者返回元素的 id 属性。
element.className 设置或返回元素的 class 属性
element.href 设置或返回元素的 href 属性名称
element.target 设置或返回元素的 target属性名称
. .
. .
. .
'getAttribute 语法': element.getAttribute(attributename)
参数是指定的属性名
示例(代码片段)
<body>
<a id="a1" class="c1" href="https://www.baidu.com" target="_blank">点击跳转百度</a>
<script>
var aEle = document.getElementById('a1')
console.log(aEle.id)
console.log(aEle.className)
console.log(aEle.href)
console.log(aEle.target)
console.log(aEle.getAttribute('id'))
console.log(aEle.getAttribute('className'))
console.log(aEle.getAttribute('href'))
console.log(aEle.getAttribute('target'))
</script>
</body>
1. 使用 getAttribute 和直接点的方式结果一样,结果如下图
或者直接获取所有属性返回一个数组,使用的方法是 'element.attributes'。
由于是数组,所以需要索引取值。
修改指定属性
使用的方法
element.setAttribute() 设置或者改变指定属性并指定值。
element.id 设置或者返回元素的 id 属性。
element.className 设置或返回元素的 class 属性
element.href 设置或返回元素的 href 属性名称
element.target 设置或返回元素的 target属性名称
. .
. .
. .
'setAttribute 语法':
element.setAttribute(attributename,attributevalue)
第一个参数是属性名,第二个参数是属性值。
示例(代码片段)
<body>
<a id="a1" class="c1" href="https://www.baidu.com" target="_blank">点击跳转百度</a>
<script>
var aEle = document.getElementById('a1')
aEle.id = 'a2'
aEle.className = 'c2'
aEle.href = 'https://www.sogou.com'
aEle.target = '_self'
aEle.setAttribute('id', 'a3')
aEle.setAttribute('class', 'c3')
aEle.setAttribute('href', 'https://blog.csdn.net/m0_58987515?spm=1011.2415.3001.5343')
aEle.setAttribute('target', '_blank')
</script>
</body>
1. 用点的方式和setAttribute方式都可以修改,按照最后执行的代码为准,结果如下图所示
'注意点':
用点的方式只能修改和添加默认的属性,比如 id、class 等等,若是自定义属性需要使用方法
setAttribute,如下示例
'添加修改自定义属性值'
<body>
<input id="i1" type="text">
<script>
var iEle = document.getElementById('i1')
// iEle.username = 'user' 不会显示
iEle.setAttribute('username', 'user')
</script>
</body>
1.添加自定义属性结果如下图
删除指定属性
使用的方法
element.removeAttribute() 从元素中删除指定的属性
参数是指定的属性
示例(代码示例)
<body>
<input id="i1" type="text">
<script>
var iEle = document.getElementById('i1')
iEle.setAttribute('username', 'user')
iEle.removeAttribute('username')
</script>
</body>
Class 类操作
在前面介绍的都是对指定的类操作,这里还有一种针对 class 属性的操作方法。
使用的是element.classList
方法
使用的方法
element.classList # 查看所有的类属性
element.classList.add() # 添加类属性
element.classList.remove() # 移除类属性
element.classList.contains() # 判断是否含有某个类属性
element.classList.toggle() # 有则移除 无则添加
示例(代码片段)
<body>
<div class="c1"></div>
<script>
var dEle = document.getElementsByTagName('div')[0] //需要索引取值
console.log(dEle.classList) // 查看所有class类
console.log(dEle.classList.add('c2','c3')) // 添加俩个类
console.log(dEle.classList.remove('c3')) // 删除c3类
console.log(dEle.classList.contains('c3')) //判断c3类是否存在,此时为false
console.log(dEle.classList.toggle('c3')) //由于c3不存在,则添加c3类
</script>
</body>
因此最终div的class类如下图所示。
7. 文本操作
使用的方法
element.innerHTML 设置或者返回元素的内容。
element.innerText 设置或者返回元素的内容。
获得、修改文本
innerText 方法也可以修改元素文本,但是不能识别标签内容。
示例(代码片段)
<body>
<p id="p1">修改前文本</p>
<script>
var pEle = document.getElementById('p1')
pEle.innerHTML = '<b>innerHTML 修改后文本</b>'
pEle.innerText = '<b>innerText 修改后文本</b>'
</script>
</body>
1. 由于 innerText 不能识别标签,所以标签也会被输出,结果如下图所示
8. 获取值
获取用户输入
支持用户输入的标签我们可以通过 value 属性来获得其内容。value
操作适用于 input、select、textarea 等标签
使用的方法: element.value
示例(代码片段)
<body>
<div><input type="text"></div>
<div>
<select>
<option value="hz">杭州</option>
<option value="bj">北京</option>
<option value="sz">深圳</option>
</select>
</div>
<div><textarea></textarea></div>
<script>
var iEle = document.getElementsByTagName('input')[0] // 需要索引取值
var sEle = document.getElementsByTagName('select')[0] // 需要索引取值
var tEle = document.getElementsByTagName('textarea')[0] // 需要索引取值
</script>
</body>
演示如下图
获取文件
有时候也需要用户上传文件,我们也可以通过 file 属性获取
使用的方法: element.files
示例(代码片段)
<body>
<div><input type="file" multiple></div> // 可上传多个文件
<script>
var iEle = document.getElementsByTagName('input')[0] // 需要索引取值
</script>
</body>
演示如下图
9. 样式修改
使用DOM也可以直接修改元素的样式,使用的方法是element.style用于设置或返回元素的样式属性
示例(代码片段)
<body>
<p>你好啊</p>
<script>
var pEle = document.getElementsByTagName('p')[0]
pEle.style.color = 'green'
</script>
</body>
1. 修改文本样式,改变文本颜色。
10. 事件对象
鼠标事件
属性 | 说明 |
---|---|
onclick | 当鼠标点击某个对象时触发 |
oncontextmenu | 鼠标右键打开上下文菜单时触发 |
ondblclick | 当鼠标双击某个对象时触发 |
onmousedown | 鼠标按钮被按下时触发。 |
onmouseenter | 当鼠标指针移动到元素上时触发。 |
onmouseleave | 当鼠标指针移出元素时触发 |
onmousemove | 鼠标被移动时触发。 |
onmouseover | 鼠标移到某元素之上时触发。 |
onmouseout | 鼠标从某元素移开时触发。 |
onmouseup | 鼠标按键被松开时触发。 |
键盘事件
属性 | 说明 |
---|---|
onkeydown | 某个键盘按键被按下时触发。 |
onkeypress | 某个键盘按键被按下并松开时触发。 |
onkeyup | 某个键盘按键被松开时触发。 |
表单事件
属性 | 说明 |
---|---|
onblur | 元素失去焦点时触发 |
onchange | 该事件在表单元素的内容改变时触发( <input>, <keygen>, <select>, 和 <textarea>) |
onfocus | 元素获取焦点时触发 |
onfocusin | 元素即将获取焦点时触发 |
onfocusout | 元素即将失去焦点时触发 |
oninput | 元素获取用户输入时触发 |
onreset | 表单重置时触发 |
onsearch | 用户向搜索域输入文本时触发 ( <input=“search”>) |
onselect | 用户选取文本时触发 ( <input> 和 <textarea>) |
onsubmit | 表单提交时触发 |
绑定事件
首先肯定要创建一个函数,用于达到某个条件时执行
绑定方式一
<body>
<div>
<p onclick="f1()">点击时弹出警示框</p> <!-- onclick 绑定事件 -->
</div>
<script>
function f1(){ // 达到条件时执行的事件函数
alert('哈哈哈')
}
</script>
</body>
补充:事件函数中有一个固定的关键字 this指代当前被操作对象本身
绑定方式二
<body>
<div>
<p>点击时弹出警示框</p>
</div>
<script>
var pEle = document.getElementsByTagName('p')[0]
pEle.onclick = function f1(){ // 绑定事件
alert('哈哈哈')
}
</script>
</body>
事件案例
简易校验
示例一(代码片段)
<body>
<div>username:
<input type="text" id="username">
<span style="color: red" id="username_error"></span>
</div>
<div>password:
<input type="text" id="password">
<span style="color: red" id="password_error"></span>
</div>
<input type="button" value="提交" id="btn">
<script>
// 1.查找按钮标签
let btnEle = document.getElementById('btn');
// 2.绑定点击事件
btnEle.onclick = function () {
// 3.获取用户名和密码
let userNameVal = document.getElementById('username').value;
let passWordVal = document.getElementById('password').value;
// 4.判断
if (userNameVal === 'X') {
// 给用户名下面的span标签设置文本内容
let userSpanEle = document.getElementById('username_error')
userSpanEle.innerText = '用户名不能是X'
}
if (passWordVal === '123') {
// 给密码下面的span标签设置文本内容
let userSpanEle = document.getElementById('password_error')
userSpanEle.innerText = '密码不能是123'
}
}
</script>
</body>
搜索框
示例(代码片段)
<body>
<input type="text" id="d1" placeholder="默认搜索的内容">
<script>
// 1.查找input标签对象
var inputEle = document.getElementById('d1')
// 2.绑定一个聚焦事件
inputEle.onfocus = function () {
// 3.清空value值
this.placeholder = ''
}
// 4.绑定一个失焦事件
inputEle.onblur = function () {
// 5.添加一个全新的value值
this.placeholder = '默认搜索的内容'
}
</script>
</body>
1. 搜索框有默认值,当鼠标聚焦在搜索框时,默认值被删除。当失去鼠标焦点时将默认值重新加在搜索框上
省市联动
此示例就是选择省份的时候会自动将该省份的城市添加进下拉列表。(以后使用组件代替)
示例(代码片段)
<body>
<p>省市:
<select name="" id="pro"></select>
</p>
<p>市区:
<select name="" id="city"></select>
</p>
<script>
let proEle = document.getElementById('pro');
let cityEle = document.getElementById('city');
// 1.自定义数据(以后有现成的组件实现)
let data = {
'':[],
"河北": ["廊坊", "邯郸"],
"北京": ["朝阳区", "海淀区"],
"山东": ["威海市", "烟台市"],
"安徽": ["合肥市", "芜湖市"],
"上海": ["静安", "黄埔"],
"深圳": ["龙湖", "罗湖"]
};
// 2.获取自定义对象中所有的key并添加到省市下拉框中
for (let proVal in data) {
// 2.1.创建option标签
opEle = document.createElement('option');
opEle.innerText = proVal;
opEle.value = proVal
// 2.2.添加到第一个下拉框中
proEle.append(opEle)
}
// 3.文本域变化事件
proEle.onchange = function () {
// 3.0.先清空市区下拉框中的内容
cityEle.innerHTML = '';
let currentPro = this.value;
let currentCityList = data[currentPro];
// 3.1.循环获取市区数据
for (let i = 0; i < currentCityList.length; i++) {
// 3.2.创建option标签
opEle = document.createElement('option');
opEle.innerText = currentCityList[i];
opEle.value = currentCityList[i]
// 2.2.添加到第一个下拉框中
cityEle.append(opEle)
}
}
</script>
</body>