JavaScript web API完结篇---多案例

BOM

window对象 ==>包含docment

Browser Object Model

在这里插入图片描述
在这里插入图片描述

定时器–延时函数

之前学的是间歇函数

让代码延迟执行 仅执行一次

setTimeout(回调函数,等待毫秒数)

消除 clearTimeout(timer) ==> 用于递归时需要进行去除

JS执行机制

单线程 ==> 一个任务结束,才会执行下一个任务

导致渲染慢

如何解决?

Web Worker标准 == 允许JavaScript脚本创建多个线程

因此分出了同步异步

同步程序的执行顺序和任务的排列顺序一样
异步当一件事花费很长时间,同时还可以处理其他事情
同步任务立马就能执行,都在主线程上执行,形成一个执行栈
异步任务普通事件,资源加载,定时器等等,添加到任务队列中

[!IMPORTANT]

  • 先执行执行栈【相当于主车道】中的同步任务
  • 异步任务放入任务队列中【应急车道】
  • 一旦执行栈中的所有同步任务执行完毕,系统会按次序读取任务队列中的异步任务==> 结束等待状态,进入执行栈,执行

在这里插入图片描述

事件循环

进行多线程处理的是,浏览器[宿主环境]而不是JavaScript,


location 对象

拆分并保存了URL的各个部分

常用属性

href赋值则会跳转到网址,可配合定时器
search拿地址中’?'后面的信息(表单提交的数据等)
hash'#'后面的值

补充方法:

​ reload(布尔值) 若为true,则可以强制刷新

navigator 对象

判断用户使用设备 ==> 跳转到适配页面

在这里插入图片描述

history 对象

管理历史记录,前进后退历史页面

相当于浏览器中的前进后退的按钮

back()后踢一个页面
forward()前进一个页面
go(参数)通过参数判断前进后退到哪里

在这里插入图片描述

本地存储

本地存储数据,读取方便,刷新页面不会丢失

localStorage 永久存储在本地

  • setItem(key,value)
  • removeItem(key)
  • setItem(key,value)
  • 获取 getItem(key)

路径:

检查 ==> Application ==> Storage ==> local …

sessionStorage

不同:生命周期为关闭浏览器窗口

在这里插入图片描述

若需要存储复杂数据

转换为JSON字符串存储,转换会复杂数据类型获取

JSON.stringify(复杂数据类型)JSON.parse(key)

在这里插入图片描述
在这里插入图片描述

综合案例

学生统计表

<!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>学生就业统计表</title><link rel="stylesheet" href="./iconfont/iconfont.css"><link rel="stylesheet" href="css/index.css" />
</head><body><h1>学生就业统计表</h1><form class="info" autocomplete="off"><input type="text" class="uname" name="uname" placeholder="姓名" /><input type="text" class="age" name="age" placeholder="年龄" /><input type="text" class="salary" name="salary" placeholder="薪资" /><select name="gender" class="gender"><option value=""></option><option value=""></option></select><select name="city" class="city"><option value="北京">北京</option><option value="上海">上海</option><option value="广州">广州</option><option value="深圳">深圳</option><option value="曹县">曹县</option></select><button class="add"><i class="iconfont icon-tianjia"></i>添加</button></form><div class="title">共有数据<span>0</span></div><table><thead><tr><th>ID</th><th>姓名</th><th>年龄</th><th>性别</th><th>薪资</th><th>就业城市</th><th>录入时间</th><th>操作</th></tr></thead><tbody><!-- <tr><td>1</td><td>迪丽热巴</td><td>23</td><td>女</td><td>12000</td><td>北京</td><td>2099/9/9 08:08:08</td><td><a href="javascript:"><i class="iconfont icon-shanchu"></i>删除</a></td></tr> --></tbody></table><script>//  const obj = {// stuId: arr.length + 1,// uname: uname.value,// age: 22,// salary: salary.value,// gender: gender.value,// city: city.value,// time: new Date().toLocaleString(),//     }//获取对象const tbody = document.querySelector('tbody')const info = document.querySelector('.info')const add = document.querySelector('.add')const uname = document.querySelector('.uname')const age = document.querySelector('.age')const salary = document.querySelector('.salary')const gender = document.querySelector('.gender')const city = document.querySelector('.city')const howmany = document.querySelector('.title span')const initData = []// localStorage.setItem('data', JSON.stringify(initData))const arr = JSON.parse(localStorage.getItem('data'))render()//渲染业务function render() {//从本地数据中读取数组//更改为tr的格式const newArr = arr.map(function (ele, index) {return `<td>${ele.stuId}</td><td>${ele.uname}</td><td>${ele.age}</td><td>${ele.gender}</td><td>${ele.salary}</td><td>${ele.city}</td><td>${ele.time}</td><td><a href="javascript:" data-id="${index}"><i class="iconfont icon-shanchu"></i>删除</a></td></tr>`})console.log(newArr);//转化为字符串形式并存储到tbody的innerHTMl中tbody.innerHTML = newArr.join('')//渲染一共有几条数据howmany.innerHTML = arr.length}//新增业务function addMan() {//点击添加按钮//1.阻止表单默认提交行为info.addEventListener('submit', function (e) {e.preventDefault()})//2.判断表单中是否有内容空了,空了则返回提示信息if (!uname.value || !age.value || !salary.value) {return alert('输入内容不能为空')}//3.将表单的数据写道对象中//4.将对象追加到arr数组中去arr.push({stuId: arr.length + 1,uname: uname.value,age: 22,salary: salary.value,gender: gender.value,city: city.value,time: new Date().toLocaleString()})//4.1将arr存储到本地中localStorage.setItem('data', JSON.stringify(arr))//5.重新渲染页面render()//6.重置表单info.reset()}add.addEventListener('click', function () {addMan()})//删除业务//1.点击删除按钮 tbody 利用事件委托tbody.addEventListener('click', function (e) {//2.判断是否为aif (e.target.tagName === 'A') {//3.弹窗,询问是否删除// let input = +(prompt('是否删除,删除选1,不删除选0'))if (confirm('您是否要删除这条学生数据')) {//4.若删除,获取对应对象的dataset值//5.通过对应的id值来索引下标,删除arr中的对应元素arr.splice(+(e.target.dataset.id), 1)//5.1将本地存储数据更新localStorage.setItem('data', JSON.stringify(arr))//6.重新渲染页面render()}}})</script>
</body></html>

可实现

  • 渲染页面
  • 新增数据
  • 删除数据
  • 刷新页面不会消失数据,依旧有以前的数据

正则表达式(对象)

用于匹配字符串中字符组合的模式

use:用来查找,替换那些符合正则表达式的文本 ==> 匹配,替换,提取

语法

  1. 定义规则 /....../ ==> 字面量
  2. 查找

方法

test(字符串)返回布尔值
exec(字符串)返回数组或null

exec()返回的数组中包含的是匹配正则表达式的字符串的相关信息

元字符

具有特殊含义的字符

  1. 边界符 ^---开头 $---结尾 两个一起使用则为精准匹配
  2. 量词
  3. 字符类

在这里插入图片描述
在这里插入图片描述

修饰符

语法位置

/...../修饰符

i忽略字母大小写
g匹配所有结果

案例

用户验证案例

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>span {display: inline-block;width: 250px;height: 30px;vertical-align: middle;line-height: 30px;padding-left: 15px;}.error {color: red;background: url(./images/error1.png) no-repeat left center;}.right {color: green;background: url(./images/right.png) no-repeat left center;}</style>
</head><body><input type="text"><span></span><script>//获取对象const input = document.querySelector('input')const span = document.querySelector('span')//书写正则表达式的规则const rule = /^[a-zA-Z0-9-_]{6,16}$///绑定事件input.addEventListener('blur', function () {//判断是否符合正则表达式规则if (rule.test(this.value)) {span.className = 'right'// console.log('right');span.innerHTML = '输入正确'} else {span.className = 'error'// console.log('wrong');span.innerHTML = '请输入6-16位由英文字母,数字,下划线的字符串'}})</script>
</body></html>

综合案例

页面注册
在这里插入图片描述

//获取所有对象const code = document.querySelector('.code')//发送验证码模块//获取对象//绑定点击事件let flag = true //控制在倒计时内无法再次点击发送验证码 节流阀code.addEventListener('click', function () {if (flag) {flag = falselet num = 5code.innerHTML = '5秒后重新获取'let stop = setInterval(function () {num--code.innerHTML = `${num}秒后重新获取`if (num === 0) {code.innerHTML = `重新获取`clearInterval(stop)//到时间了,可以使节流阀flag打开了flag = true}}, 1000)}})//验证输入内容是否符合模块//1.用户名模块const name = document.querySelector('[name=username]')//1.1绑定事件name.addEventListener('change', verifyName)//1.2封装函数function verifyName() {// console.log(11);const tip = name.nextElementSibling//设定正则表达式const ruleName = /^[a-zA-Z0-9-_]{6,10}$/if (!ruleName.test(name.value)) {tip.innerHTML = '输入有误,请输入6-10位'return false}tip.innerHTML = ''return true}//2.手机号模块const phone = document.querySelector('[name=phone]')//1.1绑定事件phone.addEventListener('change', verifyPhone)//1.2封装函数function verifyPhone() {// console.log(11);const tip = phone.nextElementSibling//设定正则表达式const rulePhone = /^1(3\d|4[5-9]|5[0-35-9]|6[567]|7[0-8]|8\d|9[0-35-9])\d{8}$/if (!rulePhone.test(phone.value)) {tip.innerHTML = '输入有误,请输入11位手机号码'return false}tip.innerHTML = ''return true}//3.密码模块const password = document.querySelector('[name=password]')//1.1绑定事件password.addEventListener('change', verifypassword)//1.2封装函数function verifypassword() {// console.log(11);const tip = password.nextElementSibling//设定正则表达式const rulepassword = /^[a-zA-Z0-9-_]{6,20}$/if (!rulepassword.test(password.value)) {tip.innerHTML = '输入有误,请输入6-20位字母数字下划线密码'return false}tip.innerHTML = ''return true}//4.验证码模块const Code = document.querySelector('[name=code]')//1.1绑定事件Code.addEventListener('change', verifyCode)//1.2封装函数function verifyCode() {// console.log(11);const tip = Code.nextElementSibling//设定正则表达式const ruleCode = /^\d{6}$/if (!ruleCode.test(Code.value)) {tip.innerHTML = '输入有误,请输入6位数字'return false}tip.innerHTML = ''return true}//5.再次密码验证模块const confirm = document.querySelector('[name=confirm]')//1.1绑定事件confirm.addEventListener('change', verifyconfirm)//1.2封装函数function verifyconfirm() {// console.log(11);const tip = confirm.nextElementSibling//设定正则表达式const ruleconfirm = /^\d{6}$/if (!(confirm.value === password.value)) {tip.innerHTML = '与上述密码不一致'return false}tip.innerHTML = ''return true}//6.协议模块//获取对象const agree = document.querySelector('.icon-queren')//绑定点击事件agree.addEventListener('click', function () {agree.classList.toggle('icon-queren2')})//7.全部提交//获取表单对象const form = document.querySelector('form')//添加提交事件监听器form.addEventListener('submit', function (e) {//判断是否同意协议if (!agree.classList.contains('icon-queren2')) {alert('请勾选同意协议')//阻止表单默认行为e.preventDefault()}//依次判断其他模块是否输入正确内容if (!verifyName()) e.preventDefault()if (!verifyconfirm()) e.preventDefault()if (!verifyCode()) e.preventDefault()if (!verifypassword()) e.preventDefault()if (!verifyPhone()) e.preventDefault()})

补充知识点:

  • input的change事件 ==> 当内容发生变化,且失去焦点,事件触发
  • classList有新方法contains(‘类名’) 返回布尔值

登录页面
在这里插入图片描述

 //1.tab栏切换//获取对象 --  事件委托const tab_nav = document.querySelector('.tab-nav')const panel = document.querySelectorAll('.tab-pane')//绑定事件tab_nav.addEventListener('click', function (e) {if (e.target.tagName === 'A') {//取消之前的activetab_nav.querySelector('.active').classList.remove('active')//增加后来的activee.target.classList.add('active')}//更换对应盒子//先全部去除for (let i = 0; i < panel.length; i++) {panel[i].style.display = 'none'}//显示对应需要的盒子panel[e.target.dataset.id].style.display = 'block'})//点击提交事件const agree = document.querySelector('[name=agree]')const form = document.querySelector('form')const username = document.querySelector('[name=username]')const password = document.querySelector('[name=password]')//绑定提交事件form.addEventListener('submit', function (e) {//阻止提交e.preventDefault()//判断是否有同意协议if (!agree.checked) {alert('请勾选协议')}//将数据存储到本地存储中去localStorage.setItem('xtx_name', username.value)localStorage.setItem('xtx_pwd', password.value)//跳转页面location.href = 'http://127.0.0.1:5500/webAPI/%E5%85%83%E5%AD%97%E7%AC%A6%E6%A1%88%E4%BE%8B/%E7%BB%BC%E5%90%88%E6%A1%88%E4%BE%8B%E7%B4%A0%E6%9D%90/index.html'})

首页页面

//获取对象const li1 = document.querySelector('.xtx_navs li:first-child')const li2 = li1.nextElementSibling//封装render函数function render() {//获取本地数据const uname = localStorage.getItem('xtx_name')//判断是否有用户名数据if (uname) {li1.innerHTML = ` <a href="javascript:;">${uname}</a>`li2.innerHTML = ` <a href="javascript:;">退出登录</a>`} else {li1.innerHTML = `<a href="./login.html">请先登录</a>`li2.innerHTML = ` <a href="./register.html">免费注册</a>`}}//跳转页面后先进行一次渲染render()//绑定事件li2.addEventListener('click', function () {//删除本地数据localStorage.removeItem('xtx_name')//重新渲染render()})

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【C++笔记】类和对象的深入理解(三)

【C笔记】类和对象的深入理解(三) &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;C笔记 文章目录 【C笔记】类和对象的深入理解(三)前言一.日期类的实现1.1声明和定义分离1.2日期类整数1.3日期类整数1.4日期类-整数1.5日期类-日期1.6复用对…

Linux中安装maven

Linux中安装maven 1.下载2.安装3.配置环境变量4.maven相关配置 1.下载 下载地址&#xff1a;https://maven.apache.org/download.cgi 2.安装 指定位置上传压缩包&#xff1a; 解压&#xff1a; tar -zxvf apache-maven-3.9.5-bin.tar.gz修改解压缩后的文件名: mv apac…

Netty笔记09-网络协议设计与解析

文章目录 前言一、协议设计1. 数据格式2. 消息长度3. 编码方式4. 错误处理5. 安全性 二、协议解析1. 消息分隔2. 粘包与半包处理3. 校验机制 三、为什么需要协议&#xff1f;四、redis 协议五、HTTP 协议六、自定义协议要素编解码器&#x1f4a1; 什么时候可以加 Sharable 前言…

【论文阅读】Act3D: 3D Feature Field Transformers for Multi-Task Robotic Manipulation

Abstract 3d感知表示非常适合机器人操作&#xff0c;因为它们很容易编码遮挡并简化空间推理。许多操作任务在末端执行器姿态预测中需要较高的空间精度&#xff0c;这通常需要高分辨率的3d特征网格&#xff0c;这对于处理来说计算成本很高。因此&#xff0c;大多数操作policies…

基于密码的大模型安全治理的思考

文章目录 前言一、大模型发展现状1.1 大模型技术的发展历程1.2 大模型技术的产业发展二、大模型安全政策与标准现状2.1 国外大模型安全政策与标准2.2 我国大模型安全政策与标准前言 随着大模型技术的迅速发展和广泛应用,其安全性问题日益凸显。密码学作为网络空间安全的核心技…

Unity webgl跨域问题 unity使用nginx设置跨域 ,修改请求头

跨域 什么是跨域 跨域是指浏览器因安全策略限制&#xff0c;阻止一个域下的网页访问另一个域下的资源。 一些常见的跨域情况&#xff1a; 协议不同 从 http://example.com 请求 https://example.com。域名不同 从 http://example.com 请求 http://anotherdomain.com。端口不…

《锐捷AP 胖模式配置示例》

目录 WEB配置方式: 1. 登录 AP 管理界面 2. 配置无线服务 3. 配置射频参数 4. 配置 VLAN (如果需要) 5. 配置 IP 地址 6. 其他高级设置(根据需求) 命令行配置: 1. 进入特权模式 2. 进入全局配置模式 3. 配置管理 IP 地址 4. 创建无线 SSID 5. 配置 SSID 加密…

多线程下的共享变量访问数据竞争的问题

多线程下对共享变量的写存在数据竞问题可导致数据与预期不一致。最近在研究race conditions漏洞&#xff0c;用以下python 代码记录一下&#xff0c;以此论证&#xff0c;如下&#xff1a; from concurrent.futures import ThreadPoolExecutor globalNum 5 def test():global…

【深度分析】OpenAI o1是最强的推理模型,却不是最强模型!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…

一般在写SQL时需要注意哪些问题,可以提高查询的效率?

很多人写SQL按照自己喜好&#xff0c;没有规则意识&#xff0c;这对于自主查询影响不大&#xff0c;你爱怎么搞就怎么搞&#xff0c;一旦涉及到提交任务或团队共享&#xff0c;就不能乱写了&#xff0c;会浪费资源影响到开发效率&#xff0c;严重的甚至会服务器瘫痪。 提几个关…

python-在PyCharm中使用PyQt5

文章目录 1. 安装 PyQt5 和QtTools2. QtDesigner 和 PyUIC 的环境配置2.1 在 PyCharm 添加 Create Tools2.2 添加 PyUIC 工具 3. 创建ui界面4. 使用python调用ui界面参考文献 1. 安装 PyQt5 和QtTools QT 是最强大的 GUI 库之一&#xff0c;PyQt5 是 Python 绑定 QT5 应用的框…

idea一个窗口打开多个仓库的代码

一、背景 最近新进了一家外包公司&#xff0c;这个项目由于是微服务的&#xff0c;且每个微服务都独立用一个仓库进行代码管理。看项目的时候&#xff0c;我们不能一个窗口&#xff0c;只打开一个仓库代码&#xff0c;那样看起来会非常麻烦&#xff0c;一开始对项目全貌的了解…

Get包中的根组件

文章目录 1. 知识回顾2. 使用方法2.1 源码分析2.2 常用属性 3. 示例代码4. 内容总结 我们在上一章回中介绍了"Get包简介"相关的内容&#xff0c;本章回中将介绍GetMaterialApp组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 知识回顾 我们在上一章回中已经…

多线程篇(Fork/Join)(持续更新迭代)

目录 知识大纲 一、简介 二、工作窃取算法 三、设计思想 步骤一&#xff1a;分割任务 步骤二&#xff1a;执行任务并合并结果 四、使用 五、异常处理 六、Fork/Join框架的实现原理 1. ForkJoinTask的fork方法实现原理 2. ForkJoinTask的join方法实现原理 七、源码剖…

Java-数据结构-二叉树-习题(三)  ̄へ ̄

文本目录&#xff1a; ❄️一、习题一(前序遍历非递归)&#xff1a; ▶ 思路&#xff1a; ▶ 代码&#xff1a; ❄️二、习题二(中序遍历非递归)&#xff1a; ▶ 思路&#xff1a; ▶ 代码&#xff1a; ❄️三、习题三(后序遍历非递归)&#xff1a; ▶ 思路&#xff1a; …

数据结构(7.3_3)——平衡二叉树的删除

平衡二叉树的删除 删除结点后&#xff0c;要保持二叉排序树的特性不变(左<中<右) 若删除结点导致不平衡&#xff0c;则需要调整平衡 平衡二叉树的删除步骤 删除结点(方法同"二叉排序树")一路向北找到最小不平衡子树&#xff0c;若没有找到&#xff0c;则不需…

【秋招笔试-支持在线评测】8.28华为秋招(已改编)-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 华为专栏传送🚪 -> 🧷华为春秋招笔试 目前今年秋招的笔…

01Frenet与Cardesian坐标系(基础知识)

1 简介 Frenet坐标系是一种在几何学和物理学中常用的坐标系&#xff0c;特别是在轨迹规划和机器人控制中。它由法国数学家Jean Frenet于1847年为了解决在求解某些几何问题时遇到的环形坐标系的问题而提出的。它依据曲线的切线和法线来定义坐标轴&#xff0c;主要用于局部地描述…

104.WEB渗透测试-信息收集-FOFA语法(4)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;103.WEB渗透测试-信息收集-FOFA语法&#xff08;3&#xff09; 打开fofa搜索引擎 搜索输…

YOLOv9改进策略【卷积层】| GnConv:一种通过门控卷积和递归设计来实现高效、可扩展、平移等变的高阶空间交互操作

一、本文介绍 本文记录的是利用GnConv优化YOLOv9的目标检测方法研究。YOLOv9在进行目标检测时&#xff0c;需要对不同层次的特征进行融合。GnConv可以考虑更高阶的空间交互&#xff0c;能够更好地捕捉特征之间的复杂关系&#xff0c;从而增强特征融合的效果&#xff0c;提高模…