44. JavaScript之BOM、DOM
1. BOM
1.1 概念
Browser Object Model是指浏览器对象模型,它使 JavaScript 能与浏览器进行交互。
BOM是浏览器提供的API集合,主要用于处理与浏览器环境相关的任务,如窗口管理、导航、cookie、location等。
1.2 window对象
[1]open()
第一个参数是目标网址,第二个参数可以为空,第三个参数为窗口的大小
window.open("https://www.baidu.com","","width=500px,height=500px")
window.open("https://www.baidu.com","_blank","width=500px,height=500px")
[2]close()
关闭窗口
[3]setTimeout()
定时器:指定的时间延迟后运行代码
function showInfo() {
alert("帅年轻有为")
}
setTimeout(showInfo, 3000) //3秒后运行
[4]setInterval()
以固定的时间间隔运行代码
<script>
function showInfo() {
alert("帅年轻有为")
}
setInterval(showInfo, 3000) //间隔3秒一直运行
</script>
[5]清除定时器
(1)clearTimeout
var timer = setTimeout(function() {
// 在延迟后执行的操作
}, 5000); // 延迟5秒后执行
// 如果需要取消定时器
clearTimeout(timer);
(2)clearInterval
var timer = setInterval(function() {
// 每隔一段时间执行的操作
}, 2000); // 每2秒钟执行一次
// 如果需要取消定时器
clearInterval(timer);
在调用clearTimeout或clearInterval函数时,需要将原先保存的计时器标识符作为参数传递给这两个函数,以确保取消正确的定时器。
function func2() {
alert("123")
}
function show() {
let t = setInterval(func2, 3000); // 每隔3s触发一次
function inner() {
clearInterval(t) // 清除定时器
}
setTimeout(inner, 9000) // 9s后触发
}
show()
show 函数设置了一个定时器,每3秒调用一次 func2 函数,但在9秒后,该定时器被清除,阻止了 func2 函数的进一步执行。
[6]alert()
显示一个带有指定消息和一个确认按钮的警告框。
window.alert("少冲浪!")

[7]confirm()
显示一个带有指定消息和两个按钮(确认和取消)的对话框。
点击“确定”返回true,点击“取消”返回false

[8]prompt()
显示一个带有指定消息和一个文本输入框的对话框。
第二个参数为默认展示的内容(可选)

[9]innerHeight
返回浏览器窗口的内部高度(即视口的高度),以像素为单位,不包括浏览器的工具栏、滚动条等元素。
window.innerHeight
[10]innerWidth
返回浏览器窗口的内部宽度(即视口的宽度),以像素为单位,不包括浏览器的工具栏、滚动条等元素。
window.innerWidth
1.3 window子对象
[1]前提
window子对象代码中window可以不写
[2]window.location
此子对象包含有关当前页面 URL 的信息,并提供了一些与页面导航相关的方法。
通过 window.location,可以获取当前页面的 URL、查询字符串参数、路径等信息

[3]window.location.href
获取当前页面的完整 URL(包括协议、域名、路径等)。

[4]window.location.reload()
重新加载页面
[5]window.history.back()
加载上一个历史记录。相当于用户点击浏览器的后退按钮。
[6]window.history.forward()
加载下一个历史记录。相当于用户点击浏览器的前进按钮。
[7]window.navigator
有关浏览器环境和设备的信息,包括用户代理字符串、浏览器版本、操作系统等。

2. DOM
2.1 概念
文档对象模型(DOM)是一个编程接口,它以树状结构来表示 HTML 或 XML 文档。
在 DOM 中,每个HTML元素、属性、文本节点等都被视为一个对象,通过JavaScript可以创建、查询、修改和删除这些对象。
但是HTML页面上有很多相同的标签 所以我们在操作HTML标签之前还要先学会如何查找标签(JavaScript查找标签)
HTML DOM模型被构造为对象的树。

DOM标准规定HTML文档中的每个成分都是一个节点(node):
文档节点(document对象):代表整个文档
元素节点(element对象):代表一个元素(标签)
文本节点(text对象):代表元素(标签)中的文本
属性节点(attribute对象):代表一个属性,元素(标签)才有属性
注释是注释节点(comment对象)
2.2 查找标签
[1]直接查找标签getElement
(1)准备数据
<body>
<div>div1</div>
<div id="d1">div2</div>
<div class="c1">div3</div>
</body>
(2)getElementsByTagName
通过标签名查找标签(结果为数组)

根据类名查找标签(结果为数组)

根据id查找标签(结果为对象本身)

[2]间接查找标签
(1)概念
parentElement 父节点标签元素
children 所有子标签
firstElementChild 第一个子标签元素
lastElementChild 最后一个子标签元素
nextElementSibling 下一个兄弟标签元素
previousElementSibling 上一个兄弟标签元素
(2)命名规范
用变量名指代标签对象时,建议写成:
xxxEle
divEle
aEle
pEle
let divEle = document.getElementsByTagName("div");
(3)数据准备
<body>
<div id="d1">div
<p id="d2">div>p1
<span>div>p1>span</span>
</p>
<div id="d3">div>div1
<p>div>div1>p</p>
</div>
<p id="d4">div>p2
<span>div>p2>span</span>
</p>
</div>
<span>div下面的第一个span</span>
<span>div下面的第二个span</span>
</body>
(4)parentElement

(5)children

(6)firstElementChild

(7)lastElementChild

(8)nextElementSibling

(9)previousElementSibling

2.3 节点操作
[1] 概念
节点操作是指在文档对象模型(DOM)中对节点进行创建、获取、修改、删除等操作
[2]创建节点
createElement(tagName): 创建一个具有指定标签名的元素节点。
[3]属性操作
element.getAttribute(attribute): 获取指定属性的值。
element.setAttribute(attribute, value): 设置指定属性的值。
element.removeAttribute(attribute): 移除指定属性。
标签既有默认属性,也能自定义属性
例如id、class等默认属性,设置时可通过点的方式

设置自定义属性时需要用到setAttribute
setAttribute()既可以设置自定义属性也可以设置默认属性
[4]文本操作
node.textContent: 获取或设置节点的文本内容。
node.innerHTML: 获取或设置节点的HTML内容。
[5]代码示例
HTML代码如下:
<body>
<div id="d1"> 块级标签
<p id="p1">块级标签里的p标签</p>
<span>块级标签里的span标签</span>
</div>
</body>
(1)通过DOM操作动态地创建a标签,并添加到页面指定位置

以上操作只是作用于当前页面,并没有对原始文件生效,刷新后就会消失相关的效果

(2)通过DOM操作动态地创建img标签

[6]innerText/innerHTML

(1)innerText
innerText属性用于设置或返回指定元素中的文本内容,不包括HTML标记。
当使用innerText属性时,所有HTML标记都将被视为纯文本并被直接显示在页面上。
这意味着如果在innerText中包含HTML标记,那么标记将被作为普通文本显示而不会被解析。
此外,innerText属性是只读的,即使尝试修改该属性的值也不会有任何效果。
<div id="myElement">This is <strong>bold</strong> text.</div>
<script>
var element = document.getElementById("myElement");
console.log(element.innerText); // 输出:"This is bold text."
element.innerText = "Updated text"; // 尝试修改innerText但不会生效
</script>
(2)innerHTML
innerHTML属性用于设置或返回指定元素的HTML内容,可以包含HTML标记和文本。
与innerText不同,使用innerHTML属性时,所有HTML标记都会被解析并在页面上正确渲染。
这意味着可以通过innerHTML属性来添加、修改或删除HTML元素及其属性。
需要注意的是,innerHTML属性可以导致代码注入攻击,因此使用时需谨慎验证并过滤用户输入。
<div id="myElement">This is <strong>bold</strong> text.</div>
<script>
var element = document.getElementById("myElement");
console.log(element.innerHTML); // 输出:"This is <strong>bold</strong> text."
element.innerHTML = "Updated <em>text</em>"; // 修改innerHTML会动态更新页面中的内容
</script>
2.4 获取值操作
[1] 获取用户输入值
对于表单元素(如input、select、textarea等),可以通过获取其value属性来获取用户输入的值
<body>
<p>输入用户名:<input type="text" id="d1"></p>
<p>选择地区:
<select name="" id="d2">
<option value="New York">纽约</option>
<option value="London">伦敦</option>
<option value="Hawaii">夏威夷</option>
</select>
</p>
<p>介绍:
<textarea name="" id="d3" cols="30" rows="10"></textarea>
</p>
</body>








[2]获取文件
当用户选择一个或多个文件后,可以通过访问.files属性来获取这些文件的信息。
.files属性返回一个FileList对象,其中包含了所选文件的列表。可以通过遍历该列表来处理每个文件。
以下是一个简单的示例,演示如何使用.files属性获取用户选择的文件:
<body>
<p>文件:
<input type="file" id="fileInput">
</p>
</body>
// 获取文件选择框的DOM元素
var fileInput = document.getElementById("fileInput");
// 添加change事件监听器,以便在用户选择文件后执行操作
fileInput.addEventListener("change", function() {
// 获取选择的所有文件
var files = fileInput.files;
// 遍历文件列表,并处理每个文件
for (var i = ; i < files.length; i++) {
var file = files[i];
console.log("文件名:" + file.name);
console.log("文件类型:" + file.type);
console.log("文件大小(字节):" + file.size);
console.log("最后修改时间:" + file.lastModified);
}
});
在以上示例中,首先获取具有id="fileInput"的文件选择框的DOM元素,并为其添加了一个change事件监听器。
当用户选择文件后,change事件将被触发。
在事件处理程序中,使用.files属性获取选择的文件列表,并遍历该列表。
对于每个文件,输出了一些基本信息,如文件名、文件类型、文件大小和最后修改时间。
需要注意的是,.files属性在非IE浏览器中提供了广泛的支持
但在IE浏览器中需要使用.value属性来获取文件路径并进行相关处理。
2.5 属性操作
[1] class类操作
(1)概念
classList() 是JavaScript中用于获取HTML元素的类名列表的方法。
它返回一个DOMTokenList对象,该对象包含了元素的所有类名。
classList是只读的,不能直接赋值。
classList是一个动态的列表,会实时反映元素的当前类名状态。
可以通过遍历classList来访问每个类名,或者使用length属性获取类名数量。
标签对象.classList # 查看所有的类属性
标签对象.classList.add() # 添加类属性
标签对象.classList.remove() # 移除类属性
标签对象.classList.contains() # 判断是否含有某个类属性
标签对象.classList.toggle() # 有则移除 无则添加
(2)代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.c1 {
height: 200px;
width: 200px;
}
.bg-1 {
background-color: deepskyblue;
}
.bg-2 {
background-color: orange;
}
</style>
</head>
<body>
<div class="c1 bg-1 bg-2"></div> //class里含有多个类属性用空格隔开
</body>
</html>

通过tagName或class来获取标签对象,得到的是一个数组,需要再通过索引0才能获取真正的标签对象;通过id能直接获取到标签对象。
查看所有的类属性:

移除类属性:


添加类属性:



[2] 标签样式操作
标签对象.style.属性名
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p id="d1">帅年轻有为</p>
</body>
</html>


2.6 事件
[1] 概念
事件(Event)是指在程序运行期间发生的特定操作或状态变化。
事件可以来自用户的交互操作(如点击、鼠标移动等),也可以是其他元素或系统发出的通知(如定时器到期、网络请求完成等)。
事件触发后,程序可以运行相应的处理函数来响应事件并做出相应的操作。
[2] 分类
(1)鼠标事件:
click:鼠标点击事件。
mouseover:鼠标悬停在元素上的事件。
mouseout:鼠标离开元素的事件。
mousedown:鼠标按下事件。
mouseup:鼠标松开事件。
mousemove:鼠标移动事件。
(2)键盘事件
keydown:键盘按下事件。
keyup:键盘松开事件。
keypress:键盘按键被按下并松开事件。
(3)表单事件:
submit:表单提交事件。
change:表单值改变事件。
focus:表单元素获取焦点事件。
blur:表单元素失去焦点事件。
(4)文档加载事件:
load:页面完全加载完成事件。
unload:页面关闭或离开事件。
(5)定时器事件
setTimeout:在指定的延迟时间后触发事件。
setInterval:每隔一定时间触发事件。
(6)自定义事件:
开发者可以根据需要创建自定义事件,并使用dispatchEvent来触发事件。
[3] 绑定事件的两种方式
(1)标签属性中绑定
<body>
<p onclick="showDetail()">点击显示详细内容</p>
<script>
function showDetail() {
alert("帅年轻有为")
}
</script>
</body>

(2)获取标签对象进行绑定
<body>
<p>点击显示详细内容</p>
<script>
var pEle = document.getElementsByTagName("p")[0]
pEle.onclick = function (){
alert(this) //事件中的this指代当前被操作的标签对象本身
alert('帅年轻有为')
}
</script>
</body>

[4] 事件代码案例
(1) 数据校验
获取输入的用户名密码,校验是否为某个值,如果是则给出相应提示
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p>用户名:
<input type="text" id="d1">
<span style="color: deepskyblue" id="d2"></span> <!--span标签为行内标签,文本内容多大就占多大,没有文本内容则不展示-->
</p>
<p>密码:
<input type="text" id="d3">
<span style="color: deepskyblue" id="d4"></span>
</p>
<input type="button" value="校验" id="d5">
<script>
let btnELe = document.getElementById("d5") // 1.获取按钮标签
btnELe.onclick = function (){ // 2.绑定点击事件
let userName = document.getElementById("d1").value // 3.获取用户名密码
let passWord = document.getElementById("d3").value
if (userName === "avril"){ // 4.给用户名的span标签设置文本内容
let userSpanEle = document.getElementById("d2")
userSpanEle.innerText = "用户名不能是avril"
}
if (passWord === "123"){ // 5.给密码的span标签设置文本内容
let pwdSpanEle = document.getElementById("d4")
pwdSpanEle.innerText = "密码不能是123"
}
}
</script>
</body>
</html>

(2)搜索框案例
框内默认展示某个内容,点击框时清空内容,点击后从框移出时展示另外内容
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<input type="text" id="d1" value="默认搜索的内容">
<script>
let findEle = document.getElementById("d1") // 1.获取input标签
findEle.onfocus = function (){ // 2.绑定聚焦事件
this.value = "" // 3.清空value值
}
findEle.onblur = function (){ // 4.绑定失焦事件
this.value = "显示器" // 5.添加一个新的value值
}
</script>
</body>
</html>
默认展示的内容

鼠标点击搜索框展示的内容

从搜索框移出展示的内容

(3)选择国家自动显示对应城市
onchange 是一个 HTML 事件属性,它用于在表单元素的内容发生变化时触发一个事件。这个属性可以被添加到 <input>、<select>、<textarea> 等表单元素上。当这些元素的值发生变化时,比如用户输入文本、选择一个选项或改变复选框的状态,onchange 事件就会被触发。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p>国家:
<select name="" id="country"></select>
</p>
<p>城市:
<select name="" id="city"></select>
</p>
<script>
let countryEle = document.getElementById("country")
let cityEle = document.getElementById("city")
let data = { // 1.自定义数据
"美国": ["纽约", "旧金山"],
"澳大利亚": ["黄金海岸", "阿德莱德"],
"阿联酋": ["迪拜", "阿布扎比"]
}
// 2.获取自定义对象中所有的key并添加到国家下拉框中
for (let countryVal in data) {
let optionEle = document.createElement("option") //3.创建option标签
optionEle.innerText = countryVal // 4.给option标签添加属性
optionEle.value = countryVal
countryEle.append(optionEle) // 5.将每一个设置了属性的option标签添加到select标签下
}
countryEle.onchange = function () { // 6.添加onchange事件
cityEle.innerHTML = "" // 10.每次触发onchange时将cityEle的数据清空,否则会造成数据堆积
let nowCountry = this.value
let cityArray = data[nowCountry]
for (let valIndex in cityArray) { // 7.循环获取城市数据,JavaScript每次遍历得到的不是值,而是索引
let optionEle = document.createElement("option") // 8.创建option标签
optionEle.innerText = cityArray[valIndex]
optionEle.value = cityArray[valIndex]
cityEle.append(optionEle) // 9.将每一个设置了属性的option标签添加到select标签下
}
}
</script>
</body>
</html>



浙公网安备 33010602011771号