JS-DOM与BOM

news/2024/11/27 22:45:15/文章来源:https://www.cnblogs.com/khrushchefox/p/18573260

DOM

DOM(Document Object Model) 文档对象模型是W3C组织制定并推荐的标准, 这个标准提供了一系列操作HTML的统一API(Application Programming Interface)

核心对象是document

浏览器的工作流程

  1. 浏览器读取HTML文件
  2. 在内存中生成DOM树
  3. 调用API渲染显示

DOM树

DOM树 是将HTML文档映射成树形结构,通过节点对象对其处理,处理的结果可以加入到当前的页面

  • 文档: 一个HTML页面就是一个文档,DOM中使用document表示

  • 节点: 网页中的所有内容,在DOM树中都是一个节点(标签、属性、文本、注释等)

    • 元素节点: 网页中的所有内容, 比如h1, div都是一个元素, 也就是element Node
    • 文本节点: <h1>文本</h1>里的文本就是文本节点, 也就是text Node
    • 属性节点: <img src="1.jpg"></img>里的属性就是属性节点

获取元素

如果要操作DOM, 首先我们需要知道具体需要操作哪一个元素. 即: 获取元素

目前最常用的API

  • getElementById(兼容性好)
  • querySelector(H5新增, 功能强大)
  • querySelectorAll(H5新增)
document.querySelector('选择器')
// 元素选择器, 如: li
// id选择器, 如: #nav
// class选择器, 如: .box
<div id="time">2024-10-02</div>
<script>var div = document.getElementById('time')console.log(div)console.dir(div)
</script>
  <body><div class="box">盒子1</div><div class="box">盒子2</div><div id="nav"><ul><li>首页</li><li>产品</li></ul></div><script>// querySelector 返回指定选择器的第一个元素对象var firstBox = document.querySelector('.box')console.log(firstBox)var nav = document.querySelector('#nav')console.log(nav)var li = document.querySelector('li')console.log(li)// querySelectorAll()返回指定选择器的所有元素对象集合var allBox = document.querySelectorAll('.box')console.log(allBox)var lis = document.querySelectorAll('li')console.log(lis)</script></body>

事件驱动

步骤

  1. 获取元素
  2. 注册事件(绑定事件)处理函数
  3. 触发事件, 执行函数

鼠标事件

事件名 触发条件
onclick 鼠标单点
onblur 失去焦点
onfocus 获得焦点
onmouseover 鼠标经过
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title><style>.box {position: relative;width: 70px;height: 90px;margin: 100px auto;padding-top: 4px;border: 1px solid #ccc;font-size: 12px;text-align: center;color: #ff5000;}.box img {width: 62px;margin-top: 4px;}.box .close_btn {position: absolute;top: -1px;left: -23px;width: 20px;height: 20px;border: 1px solid #ccc;font-style: normal;color: #ccc;}</style></head><body><div class="box">去领红包<img src="images/tao.png" alt="" /><i class="close_btn">x</i></div><script>// 需求. 仿淘宝的效果. 点击x号, 关闭广告// 一. 获取DOM元素var box = document.querySelector('.box')var btn = document.querySelector('.close_btn')// 二. 绑定事件, 修改属性btn.onclick = function () {// 修改属性box.style.display = 'none'}</script></body>
</html>

键盘事件

事件名 触发条件
onkeyup 按键松开时触发
onkeydown 按键按下时触发
onkeypress 按键按下时触发, 不能识别ctrl, shift等功能键, 区分大小写

事件监听

domObj.addEventListener('click', function() {// 回调函数alert(22);
})

事件对象

domObj比较常用的属性和方法

  • e.target: 触发事件的对象
<body><ul><li>1</li><li>2</li><li>3</li></ul><script>var ul = document.querySelector('ul')ul.addEventListener('click', function (e) {// 我们给ul 绑定了事件  那么this 就指向ulconsole.log(this)// 如果是li 触发了事件 会向上冒泡, e.target表示liconsole.log(e.target)})</script>
</body>
<body><script>// 键盘事件对象中的keyCode属性可以得到相应键的ASCII码值// 1. keyup 和keydown事件不区分字母大小写  a 和 A 得到的都是65// 2. keypress 事件 区分字母大小写  a  97 和 A 得到的是65document.addEventListener('keyup', function(e) {// console.log(e);console.log('up:' + e.keyCode);// 我们可以利用keycode返回的ASCII码值来判断用户按下了那个键if (e.keyCode === 65) {alert('您按下的a键');} else {alert('您没有按下a键')}})document.addEventListener('keypress', function(e) {// console.log(e);console.log('press:' + e.keyCode);})</script>
</body>
  • e.preventDafult(): 阻止默认行为
<body><a href="http://www.baidu.com">baidu</a><script>const a = document.querySelector('a')a.addEventListener('click', function (e) {// 阻止默认行为e.preventDefault()})</script>
</body>
  • e.stopPropagation(): 阻止冒泡
<body><ul><li>1</li><li>2</li><li>3</li></ul><script>const li = document.querySelector('li')const ul = document.querySelector('ul')li.addEventListener('click', function (e) {e.stopPropagation()console.log('li被点击了')})ul.addEventListener('click', function () {console.log('ul被点击了')})</script>
</body>

示例: 实现一个留言板

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta http-equiv="X-UA-Compatible" content="ie=edge" /><title>Document</title><style>* {margin: 0;padding: 0;}body {padding: 100px;}textarea {width: 200px;height: 100px;border: 1px solid skyblue;outline: none;resize: none;}ul {margin-top: 50px;}li {width: 300px;margin: 15px 0;padding: 5px;background-color: blueviolet;color: #fff;}</style></head><body><textarea name="" id=""></textarea><button>发布</button><ul></ul><script>// 1. 获取元素var btn = document.querySelector('button')var text = document.querySelector('textarea')var ul = document.querySelector('ul')// 2. 注册事件btn.onclick = function () {if (text.value == '') {alert('您没有输入内容')return false} else {// (1) 创建元素var li = document.createElement('li')// 先有li 才能赋值li.innerHTML = text.value// (2) 添加元素ul.insertBefore(li, ul.children[0])text.value = ''}}</script></body>
</html>

BOM

BOM(Browser Object Model) 浏览器对象模型

它提供了独立于内容而与浏览器窗口进行交互的对象,其核心对象是 window,

由于每个浏览器厂商实现方式不同, BOM的表现会略有差异.

BOM 由一系列相关的对象构成,并且每个对象都提供了很多方法与属性

包括:

  • location: URL相关
  • navigator: 浏览器相关
  • screen: 窗口相关
  • history: 浏览历史

定时器

  • setTimeout():
    当时间到了, 会执行函数. 只执行一次
setTimeout(function() {console.log('1s')
}, 1000)
  • setInterval():
    每隔一段时间, 执行一次函数. 会执行多次
setInterval(function() {console.log('1s')
}, 1000)
  • clearInterval():
    停止setInterval设置的定时器
var counter = 3
var id = setInterval(function () {if (counter <= 0) {clearInterval(id)console.log('时间到了')} else {console.log('还剩' + counter + '秒')counter--}
}, 1000)

对比:

<body><button onclick="stop()">停止计时</button><script>// 参数1: 回调函数, 当时间结束时调用的函数// 参数2: 计时时间, 单位是mssetTimeout(() => {console.log('一次性定时器')}, 1000)console.log('先执行')const timeId = setInterval(() => {console.log('周期性定时器, 每隔1s执行一次')}, 1000)function stop() {clearInterval(timeId)}</script>
</body>

示例 - 模拟发送验证码倒计时

<body>手机号码: <input type="text" /> <button>发送</button><script>var btn = document.querySelector('button')var timer = 3btn.addEventListener('click', function (e) {btn.disabled = truevar id = setInterval(function () {if (timer <= 0) {clearInterval(id)btn.innerHTML = '发送'btn.disabled = falsetimer = 3return}btn.innerHTML = timer + '秒后重试'timer--}, 1000)})</script>
</body>

location对象

location对象用于获取设置URL

Schema://host[:port]/path[?query-string]#anchor

  • Schema: 使用的协议类型, 如http/https/ftp等

  • host: 主机域名或IP

  • port: 端口号(可选)

  • path: 路径

  • query-string: 查询参数(可选)

  • #anchor: 锚链接

  • 常用属性

属性名 说明
location.href 获取或者设置 URL
location.pathname 返回路径部分
location.hash 返回#后面的锚链接
<body><button>登录</button><script>// 1. 获取dom对象const btn = document.querySelector('button')// 2. 监听点击事件btn.addEventListener('click', function () {let count = 3// 启动定时器const id = setInterval(() => {if (count <= 0) {clearInterval(id)console.log('时间到了...')// 跳转window.location.href = './home.html'} else {console.log(`剩余${count}秒`)}count--}, 1000)})</script>
</body>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/842537.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言中对文件的输入输出

在c中的文件操作 通过读的形式,打开文件用FILE打开 用FILE*类型的指针接受文件指针的首地址 并且我们可以用读或写的方式打开文件 使用r来读取文件当然也要判断是否读取文件成功,若读取成功fopen会传出指针,若失败则会传出空指针,所以要判断读取是否成功 当然,当文件不存在…

linux内核参数

1.查看所有内核参数 grubby --info=ALL2.查看内核参数应没应用,生没生效 cat /proc/cmdline3. /etc/default/grub 里 GRUB_CMDLINE_LINUX 的值

『模拟赛』NOIP2024加赛8

『模拟赛记录』NOIP2024加赛8Rank 唐A. flandre 签。 比较显然,由于 \(k\ge 0\),所以最终的序列一定为不降序列。首先将原序列升序排序,当任取一个子序列时,容易发现最后一个数越大一定越优,那么最后一个数取到最大值时,倒数第二个数一定越大越优,以此类推,最终取出的序…

manim边做边学--圆柱体

Cylinder是Manim中用于创建圆柱体对象的类。 Cylinder类在制作数学、物理或工程领域的动画时,可用于以下的场景中:演示几何概念:使用Cylinder类创建圆柱体,并通过改变其参数和方法来演示圆柱体的各种几何性质,如体积、表面积等。 模拟物理现象:使用Cylinder类来模拟圆柱体…

基于Java+SpringBoot+Mysql在线简单拍卖竞价拍卖竞拍系统功能设计与实现十一

运行环境:windows/Linux均可、jdk1.8、mysql5.7、redis3.0、idea/eclipse均可。 技术点:SpringBoot+SpringDataJPA+Mysql+Freemaker+Bootstrap+JS+CSS+HTML 部分功能:前台竞价商品信息控制器Controller(商品列表、商品详情、报名、拍价、查看报名记录等 )一、前言介绍: 免…

Docker 实战:搭建本地 Registry 私有镜像仓库及批量导入脚本

前言:在我之前的博客中,我分享了 Harbor 仓库搭建的详细操作步骤。然而,在实际的生产环境中,并非每个 Docker 环境都需要部署一个规模庞大的 Harbor 仓库。有时,一个轻量级的本地 Registry 私有镜像仓库会更为便捷。本文将介绍如何搭建一个本地 Registry 私有镜像仓库,并…

Chrome联合Opera/Vivaldi/Waterfox等成立联盟对抗Microsoft Edge

日前在欧盟有个新的行业联盟成立,这个行业联盟名为浏览器选择联盟,主要成员包括 Google Chrome、Opera、Vivaldi、Waterfox 和 Wavebox。 成立联盟的主要目的是对抗微软的 Microsoft Edge 浏览器,该联盟致力于呼吁 / 游说欧盟将 MicROSoft Edge 按照数字市场法案列为看门人…

MySQL原理简介—12.MySQL主从同步

大纲 1.异步复制为MySQL搭建一套主从复制架构 2.半同步复制为MySQL搭建一套主从复制架构 3.GTID为MySQL搭建一套主从复制架构 4.并行复制降低主从同步延迟或强制读主库1.异步复制为MySQL搭建一套主从复制架构 (1)MySQL主从复制的原理 (2)搭建主从复制架构的配置(1)MySQL主从复制…

java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)

java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)@目录说明:基础工具类MsgPageResultResponseBusinessDomainEnum(枚举)EsDocumentConstants(常量)本人其他文章链接 说明:基础工具类Msg package com.geespace.microservices.data.computing.model.…

[MYSQL] MYSQL 时间与时区

MYSQL 版本:MYSQL 5.7.38-221001-logMYSQL 时间与时区概述 GMT(格林尼治标准时间、世界时间) 与 UTC(协调世界时间)‌GMT(Greenwich Mean Time,格林威治标准时间)‌:GMT是基于地球自转和对恒星的观测来定义的时间标准,将地球划分为24个时区。它以英国伦敦郊区的格林尼治天文…

51单片机入门:数码管(3)

数码管简介数码管每段其本质就是个LED灯,只需要控制特定的LED灯亮就能显示数据。普中开发版所使用的是两个并在一起共阴极连接的“4位数码管”,可以同时显示8个数字。数码管的显示可以分成静态显示和动态显示,这里先介绍最简单的静态显示。数码管分为共阴极连接和共阳极连接…

使用java在未知表字段情况下通过sql查询信息

使用java在未知表字段情况下通过sql查询信息场景 在只知道表名,不知道表包含哪些字段情况下,查询该表信息的场景 解决方案 @Testpublic void test() {Connection connection;String DB_URL = "jdbc:mysql://192.168.20.75:9950/geespace_bd_platform_dev?characterEnco…