0. 事件流以及事件委托机制
在如图这样一段html结构中,我们点击button,同时也是点击了div、body、以及窗口,此时需要规定事件触发的顺序。
如果直观地认为是点击了button则应该直接触发button的事件,外层div和body我们是无感知的,那么这时的事件流就是冒泡,从里向外。反之就是捕获事件流,无论点击的是什么,都先从最外层触发事件。
前者符合直觉,后者符合html结构逻辑,所以w3c规定了两者可以同时存在。
假设一段DOM结构如下:
<ul>
<li> 1 </li>
<li> 2 </li>
<li> 3 </li>
</ul>
js中对body注册点击事件(也可以对ul注册点击事件)
document.body.addEventListener('click', e => {
console.log('捕获阶段');
}, true)
document.body.addEventListener('click', e => {
console.log('冒泡阶段');
}, false)
true表示捕获阶段触发,false表示冒泡阶段触发
如果我们为每个li赋予点击事件,会注册多个方法,但是在ul(外层父层)中只需要注册一次,利用捕获冒泡的原理,相当于每个li都能触发事件,这就是事件委托机制。
其中可通过e.target来判断和执行不同的点击结果。
1. 事件类型
并不是所有事件都会冒泡。如注册scroll事件,就不会触发冒泡。
mouseover & mouseenter 的区别就是后者不会冒泡,假设给ul设置了mouseover事件,在鼠标经过ul时理论应该触发一次事件,但是因为ul中还有li元素,鼠标每经过一个li元素就会冒泡到ul上的mouseover,造成多次触发,所以需要在li中多处理阻止冒泡,而mouseenter就不会出现这种问题。
2. css对事件的影响
- 我们经常会碰到类似设置半透明遮罩的需求,通常是绝对定位一个div盖在元素上方,这时遮罩div会覆盖住当前元素使得元素无法进行交互行为,通过一行css代码即可解决:
{ pointer-events: none; }
- 指定某个给定的区域是否允许用户操作,以及如何响应用户操作(比如浏览器自带的划动、缩放等)
{ touch-action: .... }
3. Ajax基本实现四步
function majax() {
var xhr = new XMLHttpRequest()
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
...
}
}
}
xhr.open('post', '/xxx', true)
xhr.setRequestHeader('Content-type', 'application/json;charset=UTF-8')
var params = { ... }
xhr.send(params)
}
4. GET与POST的区别
GET
- 没有请求体,参数大小有限制
- 传参局限于URL编码
- 参数不变时,因为浏览器协调缓存原因,可能会出现304问题(解决方法请求url带随机参数)
- 常用于做数据拉取
POST
- 有请求体,需要设置content-type,参数大小无限制
- 支持多种编码格式
- 常用于做数据提交保存
5. 常见问题
什么是事件传播?
- 事件发生时会在元素节点与根节点之间按照特定的顺序传播
什么是事件冒泡?
- 事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发。
什么是事件捕获?
- 事件按照从最不特定的事件目标到最特定的事件目标(document对象)的顺序。
stopPropagation() 和 stopImmediatePropagation() 之间有什么区别?
- 均为阻止事件的冒泡或捕获。前者用于阻止事件传播,在事件传播的任何阶段都可以调用它。后者为阻止默认事件(如a标签submit表单等)。
如何知道是否在元素中使用了event.preventDefault()方法?
- event.defaultpreventing 返回Boolean值来判断。
Event对象中,target和currentTarget的区别?
- e.target 指向触发事件监听的对象,e.currentTarget 指向添加监听事件的对象。
什么是跨域,工作中如何处理跨域问题
什么情况下会自动发起options请求
使用了PUT/DELETE/CONNECT/OPTIONS/TRACE/PATCH任意一种请求类型,Content-type不属于下列之一 application/x-www-form-urlencoded、multipart/form-data、text/plain
常见的请求格式(content-type)有哪些
application/x-www-form-urlencoded 原生Form表单,提交数据会序列化转码
multipart/form-data 常见的POST数据提交的方式
application/json 序列化后的JSON字符串
text/xml 灵活轻巧xml类型
binary 二进制文件类型