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

浏览器是一个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() // 返回表单格式内容
})

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

专业科普:什么是单片机?

一、什么是单片机 单片机诞生于20世纪70年代末&#xff0c;它是指一个集成在一块芯片上的完整计算机系统。单片机具有一个完整计算机所需要的大部分部件&#xff1a;CPU、内存、内部和外部总线系统&#xff0c;目前大部分还会具有外存。同时集成诸如通讯接口、定时器&#xff…

Edge浏览器可以多开吗?

问答链接&#xff1a;Edge浏览器可以多开吗&#xff1f; 可以。 如果你的edge浏览器是默认路径安装的&#xff0c;那么打开命令提示符窗口输入以下两条命令即可启动一个数据完全隔离的edge浏览器。 mkdir C:\logs001 "C:\Program Files (x86)\Microsoft\Edge\Applicati…

【宝塔服务器】宝塔通过composer安装TP依赖

屡屡碰壁&#xff0c;安装一个项目&#xff0c;发现没有依赖&#xff0c;需要使用composer安装&#xff0c;没接触过&#xff0c;找了网上也没攻略&#xff0c;自己弄了后有以下问题&#xff0c;经过调整解决了&#xff1a; 报错1:没有安装fileinfo扩展 Loading composer rep…

Linux下RPM软件包管理

目录 1、软件包管理介绍1.1、软件包分类1.2、源码包1.3、RPM包 2、RPM包管理-包命名和依赖性2.1、RPM命名规则2.2、RPM包依赖性 3、RPM包管理-安装升级和与卸载3.1、包全名与包名3.2、RPM安装3.3、RPM包升级3.4、卸载 4、RPM包管理-查询4.1、查询是否安装4.2、查询软件包详细信…

Java集合相关问题

java集合框架体系 数据结构 算法复杂度分析 时间复杂度分析&#xff1a;对代码运行时间所消耗时间多少进行分析空间复杂度分析&#xff1a;对代码运行所占用的内存的大小进行分析 时间复杂度 时间复杂度分析&#xff1a;来评估代码的执行耗时 假如执行每行代码的执行耗时一…

阿里云服务器ping不通如何解决?

阿里云服务器ping不通&#xff1f;什么原因&#xff1f;在安全组中允许【全部 ICMP(IPv4)】&#xff0c;当然阿里云服务器禁ping也是通过配置安全组的ICMP规则来实现的&#xff0c;阿里云服务器网来详细说下安全组开通ping功能教程&#xff1a; 目录 阿里云服务器ping不通的解…

微服务: sleuth和zipkin的用处与zipkin安装使用(下)

目录 0. 上篇传送门: 1. 前言简介 mq安装传送门: 微服务: 01-rabbitmq的应用场景及安装(docker) 1.1 Sleuth是一款分布式跟踪解决方案。 1.2 Zipkin是一个开源的分布式跟踪系统。 2. zipkin安装方式 2.1 windows下安装zipkin: 2.1.0 下载jar包位置 2.1.1 下载后,找…

华为防火墙之NAT技术

1.源NAT 源NAT技术对IP报文的源地址进行转换&#xff0c;将私网IP地址转换成公网IP地址&#xff0c;使大量私网用户可以利用少量公网IP地址访问Internet&#xff0c;大大减少了对公网IP地址的消耗。 源NAT转换的过程如下图所示&#xff0c;当私网用户访问Internet的报文到达防…

银河麒麟系统安装mysql数据库[mysql-5.7.28-linux-glibc2.12-x86_64]

银河麒麟系统安装mysql数据库 1.1 准备材料 mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz MySQL5.7下载地址 https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz 1.1 安装前准备工作 1、检查是否已经安装MySQL [rootlocalhost ~]# rpm …

redismariadb + keepalived 高可用

目录 机器准备 安装后服务 redis 安装redis mariadb 安装mariadb 启动和配置 互为主从同步配置 keepalived keepalived安装 修改主从 keepalived的配置 主从配置-mariadb监控 主从配置-redis监控 查看和使用 Keepalived Mariadb redis 机器准备 两台机器&…

transformer零基础学习

声明&#xff1a;以下文章链接仅用于个人学习与备忘。 基础知识 1&#xff1a;零基础解析教程 [推荐] https://zhuanlan.zhihu.com/p/609271490 2&#xff1a;Transformer 详解 [推荐] https://wmathor.com/index.php/archives/1438/ 3&#xff1a;如何从浅入深理解transfor…

行为型模式--状态模式

目录 举例 状态模式 定义 结构 代码实现 优缺点 优点&#xff1a; 缺点&#xff1a; 使用场景 举例 【例】通过按钮来控制一个电梯的状态&#xff0c;一个电梯有开门状态&#xff0c;关门状态&#xff0c;停止状态&#xff0c;运行状态。每一 种状态改变&#xff0c;都…

STM32外设系列—BH1750

文章目录 一、BH1750简介二、BH1750原理图三、BH1750数据手册3.1 指令集3.2 IIC通信读/写 四、BH1750程序设计4.1 IIC程序4.2 BH1750初始化程序4.3 读取BH1750测量结果4.4 获取光照强度4.5 相关宏定义 五、应用实例六、拓展应用6.1 实时调节LED亮度6.2 实时调整颜色阈值 一、BH…

C++【位图/布隆过滤器—海量数据处理】

文章目录 一、位图&#xff08;1&#xff09;位图概念介绍&#xff08;2&#xff09;简单模拟实现&#xff08;3&#xff09;位图应用 二、布隆过滤器&#xff08;1&#xff09;关于布隆过滤器概念及介绍&#xff08;2&#xff09;布隆过滤器的使用场景&#xff08;3&#xff0…

【前端布局篇】浮动、定位、弹性布局,固比固、双飞翼、圣杯布局

一、布局方式介绍 布局模型是基于盒模型基础上进行的拓展&#xff0c;关于布局有流式布局&#xff08;标准的布局&#xff09;&#xff0c;浮动布局、定位布局、flex布局等。 1.1 标准流&#xff08;流动模型&#xff09; 描述&#xff1a;元素按照自己默认的元素类型在页面…

Unity3D 连接MySQL数据库

1、MySQL下载安装运行 详见&#xff1a;MySQL下载安装运行 2、使用mysql-connector-net &#xff08;1&#xff09;官方下载地址&#xff1a;https://downloads.mysql.com/archives/c-net/&#xff0c;下载后直接双击安装即可。 提示&#xff1a;不要使用版本过高的connect…

Jmeter(三) - 从入门到精通 - 测试计划(Test Plan)的元件(详解教程)

1.简介 上一篇中我已经教你如何通过JMeter来创建一个测试计划&#xff08;Test Plan&#xff09;&#xff0c;那么这一篇我们就将JMeter启动起来&#xff0c;创建一个测试计划&#xff08;Test plan&#xff09;&#xff0c;然后现在给大家介绍一下测试计划&#xff08;Test P…

C# wpf 附加属性实现任意控件拖动调整大小

摘自这里 https://blog.csdn.net/u013113678/article/details/121719278 调试效果如下 using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using Syst…

【信号】信号处理与进程通信:快速上手

目录 0. 信号概述 1. 产生信号的方式&#xff1a; 1.1 当用户按某些终端键时&#xff0c;将产生信号。 1.2 硬件异常将产生信号。 1.3 软件异常将产生信号。 1.4 调用kill函数将发送信号。 1.5 运行kill命令将发送信号。 2. 信号的默认&#xff08;缺省&#xff09;处理…

Visual C++类的继承及类中成员的访问特性——搞懂public、protected、private

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天来说说Visual C中类的继承及类中成员的访问特性&#xff0c;也就是来搞懂public、protected、private这三个东西。 很多人搞不清楚这三个东西&#xff0c;并且很容易弄错&#xff0c;其实不是学习的人的…