03 Web全栈 浏览器内置对象/事件/ajax

news2024/11/23 10:58:36

浏览器是一个JS的运行时环境,它基于JS解析器的同时,增加了许多环境相关的内容,用一张图表示各个运行环境和JS解析器的关系如下:

在这里插入图片描述
我们把常见的,能够用JS这门语言控制的内容称为一个JS的运行环境,常见的运行环境又Nodejs,浏览器,小程序,一些物联网设备等等,所有运行环境都必须有一个JS的解释器,在解释器层面符合ECMAScript规范,定义了JS本身语言层面的东西如关键字,语法等等。

在每个环境中,也会基于JS开发一些当前环境的特性,例如Nodejs中的global对象,process对象,浏览器环境中的window对象,document对象等等,这些属性属于运行环境在JS基础上的内容。

这也就解释了为什么在Nodejs和浏览器中都能使用数组、函数,但是只能在nodejs中使用require加载模块,而不能在浏览器端使用,因为require是nodejs特有的运行环境中的内容。

内置对象属性

window
window是在浏览器中代表全局作用域,所有在全局作用域下声明的变量和内容最终都会变成window对象下的属性。例:

var num = 123
console.log(window.num) // 123

访问未声明的变量时,如果直接访问则会报错,而如果使用window进行访问,就像通过对象访问那样,会返回undefined

var name = oldName // 报错
var name2 = window.oldName // undefined

setTimeout 和 setInterval
setTimeout 和 setInterval他们都可以接受两个参数,第一个参数是回调函数,第二个参数是等待执行的时间,在等待时间结束之后,就会将回调函数放到event loop中进行执行,他们都返回一个id,传入clearTimeout和clearInterval都能够清除这次的定时操作。

var id = setTimeout(function () {
	console.log("hello")
}, 1000)
clearTimeout(id)

可视化工具网站: http://latentflip.com/loupe

alert,confirm,prompt 等交互api
这里使用了这类API后,会导致页面JS停止执行

Location
属性:

  • hash:返回URL的锚部分
  • host:返回一个URL的主机名和端口
  • hostname:返回一个URL的主机名
  • href:当前url
  • pathname:返回URL的路径名
  • port:返回URL服务器使用的端口号
  • protocol:返回一个URL的协议
  • search:返回URL的查询部分

方法:

  • reload:重新载入当前页面
  • replace:用新的页面替换当前页面

Document

方法:选择器
getElementById、getElementByClassName等API

方法:创建元素
createElement

属性:

  1. title:可以设置或返回当前页面标题
  2. domain:展示当前网站的域名
  3. url:当前网站的链接
  4. anchors:返回所有锚点,带name属性的a标签
  5. forms:返回所有form标签集合
  6. images:返回所有img标签集合
  7. links:返回所有带href属性的a标签

Element
Element元素的nodeType均为1,大多数变迁都是一个Element实例

属性:
tagName:返回当前元素的标签名

方法:
setAttribute:获取当前节点属性的结果
setAttrbute:设置当前节点属性

Text类型
Text类型包括所有村文本内容,它不支持子节点,同时他的nodeType为3

History
History对象包含用户访问过的URL,在HTML5中,history还与客户端路由息息相关

属性:
length:返回历史历史列表中的网址数

方法:
back:加载history列表中的前一个URL
forward:加载history列表中的下一个URL
go:加载history列表中的某个具体页面
pushState:替换地址栏地址,并且加入history列表,但并不会刷新页面
replaceState:替换地址栏地址,替换当前页面在history列表中的记录,并不刷新页面

总结

  • 全局定义的变量均可通过window来进行访问,使用setInterval需要注意,有可能并不是以相同间隔执行,使用alert等api需要注意js代码可能会被阻塞
  • location对象需要明确对于URL来说每个类型代表的具体值是什么
  • document对象主要衔接js和DOM元素,需要注意这里很多结果是array-like类数组元素,以及使用createFragment代码片断等优化,来防止浏览器多次重排造成的性能问题
  • Element和Text是两个我们常见且易考的DOM对象,熟悉常见的方法和debug方式
  • history因为和路由息息相关,我们需要熟悉新增的pushState和replaceState方法

事件

定义事件
我们可以通过多种方式对DOM元素定义一个事件

<p>点击后弹出alert</p>

第一种方式直接在dom元素中添加,这种方式不推荐

<p onclick="showAlert()">点击后弹出alert</p>
<script>
	function showAlert() {
		alert('hello')
	}
</script>

第二种方式,纯JS解决,获取dom元素之后通过设置其onclick属性

document.getElementByTagName('p')[0].onclick = function () {
	alert('hello')
}
// 取消事件只需要设置onclick属性为null即可
document.getElementByTagName('p')[0].onclick = null

优点:纯JS实现,视图与逻辑解耦
缺点:一个dom元素仅能设置一个onclick事件

第三种方式,纯JS解决,DOM2级规范实现新的API,addEventListener和removeEventListener两个API

var onClickFunc = function () {
	alert('hello')
}
document.getElementByTagName('p')[0].addEventListener('click', onClickFunc)
// 取消事件
document.getElementByTagName('p')[0].removeEventListener('click', onClickFunc)

优点:纯JS实现,视图与逻辑解耦,可以设置多个回调函数
缺点:removeEventListener删除事件函数必须与设置时保持相同的函数引用,所以设置事件尽量不要用匿名函数

事件捕获及冒泡
DOM是一个嵌套性的树形树状结构,在浏览器中的表现就是叠加在一起的,所以在浏览器中点击一个区域,在DOM结构中会一次遍历多个dom,自顶向下称为【事件捕获】自下而上称为【事件冒泡】

DOM2事件规范规定,一个标准事件流氛围三个阶段,首先手自上而下的【事件捕获】状态,然后是真正触发事件的元素,最后这个元素再回到顶部的事件冒泡

DOM2级事件规范新增的事件定义函数addEventListener就可以通过第三个参数来指定究竟是在捕获阶段触发还是在冒泡阶段触发,第三个参数为true则是在捕获阶段触发,第三个参数为false,则在冒泡阶段触发

事件对象
触发事件之后,浏览器会传入一个事件对象进入事件回调函数本身

document.getElementsByTagName('p')[0].onclick = function (event) {
	console.log(event)
}
document.getElementsByTagName('p')[0].addEventListener('click', function (event) {
	consolel.log(event)
})

event 对象属性如下:

  • bubbles:表明事件是否冒泡
  • cancelable:表示是否可以取消事件的默认行为
  • currentTarget:事件当前正在处理的元素
  • defaultPrevented: 为true则代表已经调用了preventDefault函数
  • detail:事件细节
  • eventPhase:事件所处阶段,1代表捕获,2代表在事件目标,3代表冒泡
  • type:事件类型(click等)

event对象方法如下:

  • preventDefault:取消事件的默认行为
  • stopImmediatePropagation:取消事件的进一步捕获或冒泡,同时组织事件处理程序调用
  • stopPropagation:取消事件进一步捕获或冒泡

事件委托

// html
<ul id="ul">
	<li>1</li>
	<li>2</li>
	<li>3</li>
	<li>4</li>
	<li>5</li>
</ul>

// js
document.getElementById("ul").onclick = function (event) {
	var target = event.target
	if (target.nodeName.toLowerCase === 'li') {
		alert(target.innerHTML)
	}
}

AJAX

2005年开始,ajax作为一项新兴的交互开始影响web的发展,ajax的核心是XMLHttpRequest对象。

var xhr = new XMLHttpRequest()
// xhr.open接受三个参数,要发送的请求类型get post 请求的url、是否异步发送的布尔值
xhr.open('get', '/url', true)
// 调用send函数发送这个请求,参数为携带的参数
xhr.send(null)

// 通过onreadystatechange事件监听当前xhr实例的阶段,通过判断xhr.readyState的阶段,来判断当前请求的状态
// 0:未调用open方法
// 1:已调用open方法 未调用send方法
// 2:已调用send方法但尚未收到返回
// 3:已收到部分响应数据
// 4:已收到所有响应数据
xhr.onreadystatechange = function () {
	if (xhr.readyState === 4) {
		console.log(xhr.responseText)
	}
}

ES6 之后的fetch API
在ES6之后,浏览器端新增了一个fetch api 有以下几个特点

  • 返回一个promise结果
  • 默认不带cookie,需要使用配置credentials: ‘include’
  • 当网络故障或请求被阻止时,才会标记为reject,否则即时返回状态码是500,也会resolve这个promise
fetch('/ajax.json').then(function (response) {
	response.text() // 返回字符串
	response.json() // 返回json
	response.blob() // 一般指返回文件对象
	response.arrayBuffer() // 返回一个二进制文件
	response.formData() // 返回表单格式内容
})

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

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

相关文章

PDF怎么在线编辑?PDF编辑软件推荐!​

PDF怎么在线编辑&#xff1f;PDF是一种常见的文档格式&#xff0c;用于存储和共享各种类型的文档&#xff0c;如电子书、报告、表格、合同和演示文稿等。然而&#xff0c;PDF文档通常是只读的&#xff0c;无法直接进行编辑。在过去&#xff0c;要编辑PDF文档通常需要购买专业的…

JVM 常量池、即时编译与解析器、逃逸分析

一、常量池 1.1、常量池使用 的数据结构 常量池底层使用HashTable key 是字符串和长度生成的hashValue&#xff0c;然后再hash生成index, 改index就是key&#xff1b;Value是一个HashTableEntry&#xff1b; 1、key hashValue hash string(name&#xff0c; len) i…

高级DBA手把手教你解决clickhouse数据库宕机生产事故实战全网唯一

高级DBA手把手教你解决clickhouse数据库宕机生产事故实战演练 一、事故描述 生产环境clickhouse宕机&#xff0c;重启之后&#xff0c;反复重启&#xff0c;重启几秒钟又死了。甲方客户叫天&#xff0c;大老板火冒三丈&#xff0c;天下大乱。老板电话打过来&#xff0c;要求半…

webrtc源码阅读之examples/peerconnection

阅读webrtc源码&#xff0c;从examples中的peerconnection开始。版本m98。 一、 基本流程 server端只是做了一个http server&#xff0c;来转发client端的消息。也就是起到了信令服务器的作用&#xff0c;本篇文章不在研究&#xff0c;感兴趣的可以学习一下用cpp搭建http serv…

Mysql架构篇--Mysql(M-M) 主从同步

文章目录 前言一、M-M 介绍&#xff1a;二、M-M 搭建&#xff1a;1.Master1&#xff1a;1.1 my.cnf 参数配置&#xff1a;1.2 创建主从同步用户&#xff1a;1.3 开启复制&#xff1a; 2.Master2&#xff1a;2.1 my.cnf 参数配置&#xff1a;2.2 创建主从同步用户&#xff1a;2.…

飞桨携手登临解读软硬一体技术优势,共推AI产业应用落地

众所周知&#xff0c;AI应用落地面临着场景碎片化、开发成本高、算力成本高等诸多难题&#xff0c;这对AI框架与AI芯片都提出了非常高的要求&#xff0c;即既要满足端、边、云多场景的部署需求&#xff0c;还需要支持自动化压缩与高性能推理引擎深度联动。因此充分发挥软硬一体…

通过一个简单的例子理解 Python 中的多线程

关于进程和线程的概念可以看这篇文章: https://blog.csdn.net/ThinkWon/article/details/102021274 什么时候需要多线程编程&#xff1f;简单来说就是一个程序里面有比较耗时间的操作&#xff0c;你希望先让它单独跑着&#xff0c;直接开始进行下一步的操作&#xff08;Python默…

centos中部署调用matlab程序

环境&#xff1a; Java8 MATLAB2018b centos7 在本机环境上运行成功后的代码打包部署到服务器上运行会报错&#xff0c;需要在服务器上安装MATLAB的运行环境。 首先下载跟本机MATLAB环境一样的mcr文件。 打开网址 http://cn.mathworks.com/products/compiler/mcr/ 下载对…

Python调用百度地图API实现路径规划提取真实距离、时间

1.注册百度地图开放平台账号 网址&#xff1a;百度地图开放平台 | 百度地图API SDK | 地图开发 2.打开控制台&#xff0c;创建应用、获取AK 如下图所示 桥重点、敲重点、瞧重点 在使用python调用API端口时&#xff0c;我们需要申请的为服务端应用类别&#xff0c;别申请错了…

JS实现简单拼图游戏

JS实现简单拼图游戏 点击“打乱”按钮开始游戏&#xff1b;按下鼠标左键拖动一块到另一块上松开鼠标左键互换。游戏资源为一张图片 我这里名称为 2.jpg&#xff0c;将其与下面的网页文件放在同一目录中即可。 网页文件源码如下&#xff1a; <!DOCTYPE html> <html&…

Chapter 1: Introduction - Why Program? | Python for Everybody 讲义_Cn

文章目录 Python for Everybody课程简介适合所有人的 Python (Why Program?)为什么要学习写程序&#xff1f;创造力和动力计算机硬件架构了解编程单词和句子与 Python 对话术语&#xff1a;解释器和编译器Writing a program什么是程序&#xff1f;The building blocks of prog…

移远通信联合中国移动研究院等伙伴发布5G RedCap和车载模组白皮书

6月28日&#xff0c;在“2023年上海世界移动通信大会(MWC)”上&#xff0c;中国移动研究院联合移远通信等产业合作伙伴&#xff0c;共同发布了《5G RedCap轻量化通用模组技术要求白皮书》以及《车载模组技术发展白皮书》。 白皮书的发布为5G RedCap和车载领域技术和产业的进一步…

pdf加水印怎么加?一分钟学会!

在办公场景中&#xff0c;我们经常需要向客户或同事发送PDF格式的文件。这时就会面临一个问题&#xff1a;如何为我们的劳动成果打上个人烙印呢?答案是通过添加水印来满足我们的需求。但是&#xff0c;如何给PDF添加水印呢?难道要手动一个个添加吗?这无疑非常费力&#xff0…

整合来自多个Aurora数据库数据,亚马逊云科技为用户提供数据分析一体化融合解决方案

亚马逊云科技近日在沙利文联合头豹研究院发布的《2023年中国数据管理解决方案市场报告》中再次获评中国数据管理解决方案的领导者位置&#xff0c;并在增长指数和创新指数上获得最高评分。亚马逊云科技凭借其独特的数据服务和数据湖组合、全面的无服务器选项、打破数据传输壁垒…

ReentrantReadWriteLock源码

介绍 用一个变量如何维护多种状态 在 ReentrantLock 中&#xff0c;使用 Sync ( 实际是 AQS )的 int 类型的 state 来表示同步状态&#xff0c;表示锁被一个线程重复获取的次数。 但是&#xff0c;读写锁 ReentrantReadWriteLock 内部维护着一对读写锁&#xff0c;如果要用一…

软件自动化测试初学者忠告,错过就后悔了

目录 自动化测试进阶 自动化测试的层次 脚本 1-1 不要在实际项目中使用录制和回放 1-2 不要使用暂停 1-3 在循环中超时退出 1-4 不要将自动化测试完全等同于开发 1-5 不要写复杂的代码 1-6 验证逻辑条件的所有选项 1-7 使用编程规范 1-8 使用静态代码分析器 1-9 随…

Jmeter使用beanshell对接口加密,调用AES代码的jar包,CBC模式,有偏移量。

目录 前言&#xff1a; 这是AES加密代码 beanshell中的脚本 前言&#xff1a; 对接口进行加密是保障数据安全的重要措施之一。在JMeter中&#xff0c;你可以使用BeanShell脚本来实现对接口数据的加密处理。 工作中需要对接口进行AES加密&#xff0c;找开发要来了加密的代码…

PADS Logic的格点推荐设置

使用合适的格点大小能有效的提高我们设计的效率以及所设计文件的美观性。 第一步&#xff1a;执行菜单命令工具-选项&#xff0c;如图1所示 图1 设置选项示意图 第二步&#xff1a;在弹出的选项窗口常规栏中可以找到栅格设置&#xff0c;如图2所示&#xff0c;在设计中通常设置…

真无线蓝牙耳机排行榜10强,十款真无线蓝牙耳机盘点

为了帮助大家在这个充满选择的世界中找到最理想的蓝牙耳机&#xff0c;我们特别为您精心挑选了几款备受赞誉的产品&#xff0c;它们在音质、舒适度、功能和性价比等方面都有出色的表现。在本文中&#xff0c;我们将深入探讨这些蓝牙耳机的特点和优势&#xff0c;帮助您更好地了…

es学习知识汇总

es的索引库就相当于mysql的表 es的文档就相当于mysql的一条数据&#xff08;内容&#xff09; 用代码创建索引库到es 新增文档&#xff08;相当于mysql的一条数据&#xff08;内容&#xff09; 模拟将数据库中的到内容新增到es中 查询文档 注&#xff1a;以下 hotel为索引库名…