前端都应该了解的浏览器Dom事件、Ajax、Bom

简介: 了解的浏览器Dom事件、Ajax、Bom

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

在如图这样一段html结构中,我们点击button,同时也是点击了div、body、以及窗口,此时需要规定事件触发的顺序。

如果直观地认为是点击了button则应该直接触发button的事件,外层div和body我们是无感知的,那么这时的事件流就是冒泡,从里向外。反之就是捕获事件流,无论点击的是什么,都先从最外层触发事件。

前者符合直觉,后者符合html结构逻辑,所以w3c规定了两者可以同时存在。

image.png

假设一段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对事件的影响

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

相关文章
|
1月前
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
45 5
|
2月前
|
前端开发 JavaScript
回顾前端页面发送ajax请求方式
回顾前端页面发送ajax请求方式
42 18
|
2月前
|
缓存 编解码 JavaScript
DOM 和 BOM 在项目中应用时的性能优化方法
【10月更文挑战第19天】总之,优化 DOM 和 BOM 的性能需要综合考虑多个方面,通过合理的设计和技术手段,提升项目的运行效率和用户体验。在实际开发中,要不断地进行性能优化实践,以适应不断变化的需求和技术发展。
|
2月前
|
JavaScript 安全 物联网
DOM 和 BOM 在项目中的应用
【10月更文挑战第19天】在现代网页开发和应用项目中,DOM(文档对象模型)和 BOM(浏览器对象模型)扮演着至关重要的角色。它们为开发者提供了与网页文档和浏览器环境进行交互的能力,使项目能够实现丰富的功能和用户体验。
|
2月前
|
XML 编解码 JavaScript
DOM(文档对象模型)和 BOM(浏览器对象模型)
【10月更文挑战第19天】在前端开发中,理解 DOM(文档对象模型)和 BOM(浏览器对象模型)是至关重要的。它们是 Web 开发的基础,为我们提供了与网页文档和浏览器进行交互的能力。
|
2月前
|
XML JavaScript 数据格式
XML DOM 浏览器差异
XML DOM 浏览器差异
|
2月前
|
XML JavaScript 数据格式
XML DOM 浏览器差异
XML DOM 浏览器差异
|
2月前
|
XML JavaScript 数据格式
XML DOM 浏览器差异
XML DOM 浏览器差异
|
2月前
|
JavaScript API
深入解析JS中的visibilitychange事件:监听浏览器标签间切换的利器
深入解析JS中的visibilitychange事件:监听浏览器标签间切换的利器
165 0
|
2月前
|
JavaScript 前端开发 API
深入理解jQuery:高效DOM操作与事件处理
【10月更文挑战第11天】深入理解jQuery:高效DOM操作与事件处理
27 0