0. 事件流以及事件委托机制

image.png

假设一段DOM结构如下:

1
2
3
4
5
<ul>
<li> 1 </li>
<li> 2 </li>
<li> 3 </li>
</ul>

js中对body注册点击事件(也可以对ul注册点击事件)

1
2
3
4
5
6
7
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对事件的影响

  1. 我们经常会碰到类似设置半透明遮罩的需求,通常是绝对定位一个div盖在元素上方,这时遮罩div会覆盖住当前元素使得元素无法进行交互行为,通过一行css代码即可解决:
    1
    { pointer-events: none; }
  2. 指定某个给定的区域是否允许用户操作,以及如何响应用户操作(比如浏览器自带的划动、缩放等)
    1
    { touch-action: .... }

3. Ajax基本实现四步

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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

跨域请求会携带cookie吗?如果想携带,需要怎么做

常见的请求格式(content-type)有哪些

几种常见的Content-Type类型