【12.0】前端基础JavaScript之DOM
【12.0】前端基础JavaScript之DOM
【一】什么是DOM/BOM
- 截至目前为止,我们虽然已经学会了js语法,但是还是没办法跟浏览器进行交互
- BOM(Browser Object Model)
- 浏览器对象模型
- js代码操作浏览器
- 浏览器对象模型
- DOM(Docunment Object Model)
- 文档对象模型
- js代码操作标签
- 文档对象模型
【二】Window对象
- Window对象是JavaScript中表示浏览器窗口的全局对象,它提供了一系列方法来操作和管理窗口。
【1】open()
:
- 打开新窗口或者获取对一个已经存在的窗口的引用。
- 第一个参数是目标网址,第二个参数可以为空,第三个参数为窗口的大小
【2】close()
:
- 关闭当前窗口。
【3】setTimeout()
:
- 在指定的时间延迟后执行一次指定的函数或者一段代码。
【4】setInterval()
:
- 以固定的时间间隔重复执行指定的函数或者一段代码。
【5】alert()
:
- 显示一个带有指定消息和一个确认按钮的警告框。
【6】confirm()
:
- 显示一个带有指定消息和两个按钮(确认和取消)的对话框。
【7】prompt()
:
- 显示一个带有指定消息和一个文本输入框的对话框。
【8】innerHeight
属性
- 返回浏览器窗口的内部高度(即视口的高度),以像素为单位,不包括浏览器的工具栏、滚动条等元素。
- 使用示例:
【9】innerWidth
属性
- 返回浏览器窗口的内部宽度(即视口的宽度),以像素为单位,不包括浏览器的工具栏、滚动条等元素。
- 使用示例:
【10】监听 resize
事件
- 需要注意的是,这两个属性返回的值会随着窗口的大小调整而改变
- 因此如果需要监控窗口大小的改变,可以通过监听
resize
事件来实现。
- 因此如果需要监控窗口大小的改变,可以通过监听
- 在使用这两个属性时,可以根据返回的数值进行相应的布局或调整操作,以适应当前窗口的尺寸。
【11】window.opener
- 是指打开当前窗口的那个窗口对象。它是 Window 对象的一个属性,用于在当前窗口中引用到打开它的父窗口或者来源窗口。
在以下情况下可以使用 window.opener
:
- 当前窗口是通过使用 JavaScript 的
window.open()
方法打开的弹出窗口时,可以使用window.opener
来引用打开它的父窗口。
- 例如,在父窗口中的 JavaScript 代码中执行以下代码:
- 然后,在弹出窗口
popup.html
中的 JavaScript 代码中,可以通过window.opener
引用到父窗口:
- 当前窗口是通过其他窗口向其发送消息(使用
postMessage()
方法)时,可以使用event.source
属性来获取消息来源窗口,并通过window.opener
来引用该来源窗口。
- 例如,在来源窗口的 JavaScript 代码中,向当前窗口发送消息:
- 然后,在当前窗口
current.html
中的 JavaScript 代码中,通过监听message
事件接收来自来源窗口的消息,并使用event.source
和window.opener
引用到来源窗口:
【三】Window子对象
如果是Window的子对象,Window可以不写
【1】window.document
:
-
此子对象表示当前窗口中的文档对象,用于对页面内容进行读取和修改操作。
-
通过
window.document
,可以使用各种方法来查询和修改当前页面的 HTML 结构、CSS 样式和 DOM 元素。 -
例如,要获取页面标题:
【2】window.location
:
-
此子对象包含有关当前页面 URL 的信息,并提供了一些与页面导航相关的方法。
-
通过
window.location
,可以获取当前页面的 URL、查询字符串参数、路径等信息,并且可以使用一些方法来导航到其他页面。 -
例如,要在新标签页中打开一个 URL:
(1)window.location.href
:*
- 获取当前页面的完整 URL(包括协议、域名、路径等)。
- 示例:
(2)window.location.protocol
:
- 获取当前页面的协议部分(例如 'http:' 或 'https:')。
- 示例:
(3)window.location.host
:
- 获取当前页面的主机(域名和端口号)部分。
- 示例:
(4)window.location.hostname
:
- 获取当前页面的主机名部分。
- 示例:
(5)window.location.port
:
- 获取当前页面的端口号部分。
- 示例:
(6)window.location.pathname
:
- 获取当前页面的路径部分。
- 示例:
(7)window.location.search
:
- 获取当前页面的查询参数部分(即 URL 中问号后面的内容)。
- 示例:
(8)window.location.hash
:
- 获取当前页面的片段标识部分(即 URL 中井号后面的内容)。
- 示例:
(9)window.location.assign()
:
- 将当前页面重定向到指定的 URL。
- 示例:
(10)window.location.reload()
:*
- 重新加载当前页面。
- 示例:
【3】window.history
:
- 此子对象用于操作浏览器的历史记录,包括向前和向后导航。
- 通过
window.history
,可以使用一些方法来在历史记录中向前或向后导航,以及获取当前历史记录的状态数量。
- 通过
- 例如,要后退到上一个页面:
(1)window.history.length
:
- 返回当前会话的历史记录条目数。
- 示例:
(2)window.history.back()
:*
- 加载上一个历史记录。相当于用户点击浏览器的后退按钮。
- 示例:
(3)window.history.forward()
:*
- 加载下一个历史记录。相当于用户点击浏览器的前进按钮。
- 示例:
(4)window.history.go()
:
- 根据传入的整数参数,加载相对于当前历史记录的某个条目。负数表示后退,正数表示前进, 表示重新加载当前页。
- 示例:
(5)window.history.pushState()
:
- 向浏览器历史记录中添加新的状态,并且不会触发页面的重新加载。它接受三个参数:state、title 和 URL。
- 示例:
(6)window.history.replaceState()
:
- 替换当前的历史记录状态,不会触发页面的重新加载。它接受三个参数:state、title 和 URL。
- 示例:
【4】window.navigator
:
- 此子对象提供有关浏览器环境和设备的信息,包括用户代理字符串、浏览器版本、操作系统等。
- 例如,要获取用户代理字符串:
(1)window.navigator.userAgent
:*
- 返回浏览器的用户代理字符串,该字符串包含了有关浏览器厂商、版本号以及操作系统等信息。
该方法可以用来校验反爬程序
- 示例:
(2)window.navigator.platform
:*
- 返回操作系统平台,如 "Win32"、"MacIntel" 等。
- 示例:
(3)window.navigator.vendor
:
- 返回浏览器的厂商或供应商名称。
- 示例:
(4)window.navigator.language
:
- 返回浏览器的首选语言,通常是用户操作系统的默认语言。
- 示例:
(5)window.navigator.cookieEnabled
:
- 返回一个布尔值,表示浏览器是否启用了 cookie。
- 示例:
(6)window.navigator.plugins
:
- 返回一个包含浏览器插件列表的 PluginArray 对象。
- 示例:
【四】弹出框
- 弹出框是网页开发中常用的交互组件,用于显示警告、确认或提示信息,并与用户进行互动。常见的弹出框类型包括警告框、确认框和提示框。下面对这三种弹出框进行详细介绍:
【1】警告框(alert):
- 警告框用于向用户显示一条重要的警告信息,通常包含一个确定按钮用于关闭弹出框。
- 示例代码:
【2】确认框(confirm):
- 确认框用于向用户询问一个问题或确认某个操作,通常包含一个确定按钮和一个取消按钮。
- 示例代码:
【3】提示框(prompt):
- 提示框用于向用户展示一条信息,并等待用户输入数据,通常包含一个输入框和确定/取消按钮。
- 示例代码:
【五】计时器相关
既可以放在 body 内 又可以放在 head 内
毫秒为单位
- 计时器在网页开发中经常用于实现定时触发某些操作的功能。根据需求,可以使用不同的方法来触发定时器。
【1】过一段时间触发(setTimeout):
- 如果需要在经过一定的时间后触发某个操作
- 可以使用setTimeout函数来设置定时器。
- 示例代码:
- 上述代码将在5秒钟后执行指定的函数。可以根据实际需要调整延迟的时间。
【2】每隔一段时间触发一次(setInterval):
- 如果需要每隔一定的时间重复触发某个操作
- 可以使用setInterval函数来设置定时器。
- 示例代码:
- 上述代码将每隔2秒钟执行一次指定的函数。同样,可以根据实际需要调整时间间隔。
【3】清除定时器(clearTimeout/clearInterval)
(1)clearTimeout:
- clearTimeout函数用于取消使用setTimeout函数设置的定时器。
- 通过传递setTimeout函数返回的计时器标识符作为参数,可以停止相应的定时器。
- 如果没有及时调用clearTimeout取消定时器,定时器会按照预定的时间触发,造成不必要的操作。
- 示例代码:
(2)clearInterval:
- clearInterval函数用于取消使用setInterval函数设置的定时器。
- 通过传递setInterval函数返回的计时器标识符作为参数,可以停止相应的定时器。
- 类似地,未及时调用clearInterval会导致定时器一直重复执行。
- 示例代码:
注意,在调用clearTimeout或clearInterval函数时
需要将原先保存的计时器标识符作为参数传递给这两个函数,以确保取消正确的定时器。
【4】案例:
-
给定的代码是用JavaScript编写的,定义了两个函数:
func2
和show
。
-
func2
函数简单地显示一个带有消息 "123" 的弹窗。 -
show
函数稍微复杂一些。- 它首先定义一个变量
t
,并将其赋值为setInterval
函数的返回值。 setInterval
函数设置了一个每300毫秒(或3秒)调用一次func2
函数的定时器。
- 它首先定义一个变量
-
接下来,
show
函数定义了一个名为inner
的内部函数。- 这个内部函数用于使用
clearInterval
函数清除之前定义的定时器。 clearInterval
函数停止了func2
函数的重复调用。
- 这个内部函数用于使用
-
最后,
show
函数使用setTimeout
函数计划在900毫秒(或9秒)之后执行inner
函数。- 这意味着,在9秒后,
inner
函数将被调用,并通过清除定时器来停止func2
函数的重复执行。
- 这意味着,在9秒后,
-
总结一下,
show
函数设置了一个定时器,每3秒调用一次func2
函数,但在9秒后,该定时器被清除,阻止了func2
函数的进一步执行。
【5】注意:
-
确保清除定时器:
- 如果不再需要定时器,应当及时清除,以避免资源浪费。
- 可以使用clearTimeout或clearInterval函数来取消定时器。
-
考虑浏览器兼容性:
- 在使用定时器时,应注意不同浏览器对定时器的支持可能存在差异,可以使用各种前端框架或库提供的方法来处理兼容性问题。
-
注意定时器的性能影响:
- 频繁的定时器操作可能会对网页性能产生一定影响,特别是在移动设备上,所以应慎重使用大量的定时器。
【六】查找标签
直接查找标签和间接查找标签是在Web开发中常用的两种方式。
操作页面的时候要使用document对象
【1】直接查找标签getElement
:
(1)getElementById:
- 根据元素的ID属性直接获取到对应的HTML元素。
拿到对象本身
(2)getElementsByTagName:
- 根据标签名称获取匹配的所有元素。
拿到数组(容器)
(3)getElementsByClassName:
- 根据类名获取匹配的所有元素。
拿到数组(容器)
(4)小结
当我们在用变量名指代标签对象时,一般都建议写成
xxxEle
divEle
aEle
pEle
-
这些方法可以根据不同的需求和条件进行标签查找。
-
使用getElementById适合于查找单个具有唯一ID的元素
-
getElementsByTagName和getElementsByClassName适合于查找多个相同标签名称或类名的元素。
-
需要注意的是,以上方法返回的是一个HTML元素或HTML元素列表(NodeList)
【2】半间接查找标签query
:
(1)querySelector
document.querySelector
方法返回第一个匹配选择器的元素
(2)querySelectorAll
document.querySelectorAll
方法返回所有匹配选择器的元素列表。
(3)小结
- 选择器可以是标签名称、类名、ID、属性等,更复杂的选择器甚至可以选择嵌套结构。
- 通过选择器查询,您可以更灵活地查找和操作HTML元素。
【3】间接查找标签
(1)parentElement:
- parentElement属性返回指定元素的父元素。
- 它可以在DOM(文档对象模型)层次结构中向上导航。
- 例如,如果有一个元素
<div id="parent">
,element.parentElement
将返回<div>
元素。
(2)children:
- children属性返回指定元素的所有子元素组成的集合。
- 这个集合中不包括文本节点和其他非元素节点。
- 通过使用索引或循环,您可以对单个子元素进行访问和操作。
- 例如,
element.children[]
将返回指定元素的第一个子元素。
(3)firstElementChild:
- firstElementChild属性指向指定元素的第一个子元素。
- 它类似于children属性,但它只返回第一个子元素,忽略在它之前存在的任何非元素节点。
- 例如,
element.firstElementChild
将返回指定元素的第一个子元素。
(4)lastElementChild:
- 类似于firstElementChild,lastElementChild属性指向指定元素的最后一个子元素。
- 它仅包括最后一个元素作为其子节点,忽略在它之后的任何非元素节点。
- 例如,
element.lastElementChild
将返回指定元素的最后一个子元素。
(5)nextElementSibling:
- nextElementSibling属性返回紧跟在指定元素后面的下一个兄弟元素。
- 它允许您在DOM中导航并访问特定元素的下一个兄弟元素。
- 例如,如果在父容器中有多个元素,
element.nextElementSibling
将返回指定元素的下一个兄弟元素。
(6)previousElementSibling:
- previousElementSibling属性类似于nextElementSibling,但它返回在指定元素之前出现的前一个兄弟元素。
- 它使您能够访问DOM层次结构中指定元素的前一个兄弟元素。
- 例如,
element.previousElementSibling
将返回指定元素的前一个兄弟元素。
【案例】
(1)直接查找
(2)用变量存储标签
当我们在用变量名指代标签对象时,一般都建议写成
xxxEle
divEle
aEle
pEle
(2)间接查找
- 查找父标签
- 查找子标签
【七】节点操作
- 节点操作是指在文档对象模型(DOM)中对节点进行创建、获取、修改、删除等操作。
- 以下是几种常见的节点操作:
【1】创建节点:
- createElement(tagName): 创建一个具有指定标签名的元素节点。
- createTextNode(text): 创建一个包含指定文本内容的文本节点。
- createDocumentFragment(): 创建一个空的文档片段节点,可用于高效地插入多个节点。
【2】获取节点:
- getElementById(id): 根据元素的id属性获取对应的元素节点。
- getElementsByTagName(tagName): 根据元素的标签名获取一组元素节点。
- getElementsByClassName(className): 根据元素的类名获取一组元素节点。
- querySelector(selector): 使用CSS选择器获取匹配的第一个元素节点。
- querySelectorAll(selector): 使用CSS选择器获取匹配的所有元素节点。
【3】修改节点:
- node.appendChild(childNode): 将一个节点作为父节点的最后一个子节点添加到指定节点。
- parent.removeChild(childNode): 从父节点中移除指定子节点。
- node.replaceChild(newNode, oldNode): 使用新节点替换旧节点。
- node.insertBefore(newNode, referenceNode): 在参考节点之前插入新节点。
【4】属性操作:
- element.getAttribute(attribute): 获取指定属性的值。
- element.setAttribute(attribute, value): 设置指定属性的值。
- element.removeAttribute(attribute): 移除指定属性。
【5】文本操作:
- node.textContent: 获取或设置节点的文本内容。
- node.innerHTML: 获取或设置节点的HTML内容。
【案例】
(1)通过DOM操作动态的创建img标签
- 并且给标签加属性
- 最后将标签添加到文本中
这个操作只是作用域当前页面,并没有对原始文件生效
刷新后就会消失相关的效果
- createElement
- setAttribute
- appendChild
(2)创建a标签
- 设置属性
- 设置文本
- 添加到标签内部
- 添加到指定标签的上面
- innerText
- insertBefore
【6】补充innerText/innerHTML
innerText和innerHTML是用于在网页中更新文本内容的两种方法。
它们都可以用于修改HTML元素中的文本,但有一些关键的区别。
innerText:
-
innerText属性用于设置或返回指定元素中的文本内容,不包括HTML标记。
-
当使用innerText属性时,所有HTML标记都将被视为纯文本并被直接显示在页面上。
-
这意味着如果在innerText中包含HTML标记,那么标记将被作为普通文本显示而不会被解析。
-
此外,innerText属性是只读的,即使尝试修改该属性的值也不会有任何效果。
使用示例:
innerHTML:
- innerHTML属性用于设置或返回指定元素的HTML内容,可以包含HTML标记和文本。
- 与innerText不同,使用innerHTML属性时,所有HTML标记都会被解析并在页面上正确渲染。
- 这意味着可以通过innerHTML属性来添加、修改或删除HTML元素及其属性。
- 需要注意的是,innerHTML属性可以导致代码注入攻击,因此使用时需谨慎验证并过滤用户输入。
使用示例:
总结:
- innerText用于操作元素中的纯文本内容,不解析HTML标记,且是只读属性。
- innerHTML用于操作元素中的HTML内容,可以包含HTML标记
【八】获取值操作
【1】获取属性值:
可以使用
getAttribute()
方法来获取HTML元素的属性值。该方法需要传入属性名作为参数,并返回属性对应的值。
【2】获取文本内容:
可以使用
innerText
、innerHTML
或textContent
属性来获取一个元素的文本内容。这些属性会返回元素内包含的文本,但存在一些差异:
innerText
:返回元素的纯文本内容,不包括HTML标记。innerHTML
:返回元素的HTML内容,包括HTML标记。textContent
:返回元素及其所有子元素的文本内容,包括隐藏元素和注释等。
【3】获取用户输入值:
对于表单元素(如input、select、textarea等)
可以通过获取其
value
属性来获取用户输入的值。
【4】获取文件
- 当用户选择一个或多个文件后
- 可以通过访问
.files
属性来获取这些文件的信息。
- 可以通过访问
.files
属性返回一个FileList对象- 其中包含了所选文件的列表。
- 可以通过遍历该列表来处理每个文件。
- 以下是一个简单的示例,演示如何使用
.files
属性获取用户选择的文件:
- 在以上示例中,我们首先获取具有
id="fileInput"
的文件选择框的DOM元素,并为其添加了一个change事件监听器。- 当用户选择文件后,change事件将被触发。
- 在事件处理程序中,我们使用
.files
属性获取选择的文件列表,并遍历该列表。- 对于每个文件,我们输出了一些基本信息,如文件名、文件类型、文件大小和最后修改时间。
需要注意的是,
.files
属性在非IE浏览器中提供了广泛的支持但在IE浏览器中需要使用
.value
属性来获取文件路径并进行相关处理。
【九】属性操作
【1】class属性操作
介绍
.classList() 是JavaScript中用于获取HTML元素的类名列表的方法。
它返回一个DOMTokenList对象,该对象包含了元素的所有类名。
使用示例:
注意事项:
classList
是只读的,不能直接赋值。classList
是一个动态的列表,会实时反映元素的当前类名状态。- 可以通过遍历
classList
来访问每个类名,或者使用length
属性获取类名数量。 classList
方法在大多数现代浏览器中都得到了支持。- 如果需要兼容旧版浏览器,可以考虑使用polyfill库来模拟
classList
功能。
【2】标签样式
- 看案例
【案例】
- 类属性操作
- 标签样式
【十】事件
- 在计算机编程中
- 事件(Event)是指在程序执行期间发生的特定操作或状态变化。
- 事件可以来自用户的交互操作(如点击、鼠标移动等),也可以是其他元素或系统发出的通知(如定时器到期、网络请求完成等)。
- 事件触发后,程序可以执行相应的处理函数来响应事件并做出相应的操作。
【1】鼠标事件:
- click:鼠标点击事件。
- mouseover:鼠标悬停在元素上的事件。
- mouseout:鼠标离开元素的事件。
- mousedown:鼠标按下事件。
- mouseup:鼠标松开事件。
- mousemove:鼠标移动事件。
【2】键盘事件:
- keydown:键盘按下事件。
- keyup:键盘松开事件。
- keypress:键盘按键被按下并松开事件。
【3】表单事件:
- submit:表单提交事件。
- change:表单值改变事件。
- focus:表单元素获取焦点事件。
- blur:表单元素失去焦点事件。
【4】文档加载事件:
- load:页面完全加载完成事件。
- unload:页面关闭或离开事件。
【5】定时器事件:
- setTimeout:在指定的延迟时间后触发事件。
- setInterval:每隔一定时间触发事件。
【6】自定义事件:
- 开发者可以根据需要创建自定义事件,并使用dispatchEvent来触发事件。
【7】示例代码:
- 以上示例代码中,当id为"myButton"的按钮被点击时,会触发点击事件,并弹出一个提示框。
【十一】绑定事件的两种方式
传统的事件属性绑定:
- 这种方式是通过在HTML标签中直接添加事件属性来实现事件绑定。
- 例如,我们可以在一个按钮的
onclick
属性中指定一个JavaScript函数,当按钮被点击时,该函数会被调用。
- 例如,我们可以在一个按钮的
- 示例代码:
-
在上述示例中,当按钮被点击时,会调用名为
myFunction
的JavaScript函数,并弹出一个提示框。 -
这种方式简单直观,适用于简单的事件绑定需求,但对于复杂的交互场景,建议使用下面介绍的现代事件监听绑定方式。
现代的事件监听绑定:
- 这种方式是通过JavaScript代码动态地选择元素,并以编程方式绑定事件监听器。
- HTML和JavaScript代码会分离,提高了代码的可读性和可维护性。
- 示例代码:
- 在上述示例中,通过
getElementById
方法获取id为"myButton"的按钮元素,然后使用addEventListener
方法绑定了一个点击事件监听器。- 当按钮被点击时,会执行回调函数,并弹出一个提示框。
- 使用现代的事件监听绑定方式,可以更灵活地添加、移除或修改事件监听器,同时也可以实现多个事件监听器同时响应一个事件的目的。
无论选择哪种事件绑定方式,都应根据具体情况来确定使用哪种方法。
传统的事件属性绑定简单易用,适合简单的事件绑定场景;
现代的事件监听绑定更加灵活和可控,适用于复杂的交互需求。
__EOF__

本文链接:https://www.cnblogs.com/dream-ze/p/17529366.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文来自博客园,作者:Chimengmeng,转载请注明原文链接:https://www.cnblogs.com/dream-ze/p/17529366.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具