前端都应该了解的浏览器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 二进制文件类型

相关文章
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
1105 14
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
463 5
|
前端开发 JavaScript API
前端开发的秘密花园:这些技巧让你轻松应对各种浏览器兼容性问题!
【10月更文挑战第31天】前端开发是一个充满创意与挑战的领域,追求极致用户体验的同时,浏览器兼容性问题却时常阻碍我们前进。本文将介绍几种解决浏览器兼容性的最佳实践:使用CSS前缀、Autoprefixer工具、现代JavaScript特性与Babel转译、Polyfill与Feature Detection、响应式设计以及跨域问题处理。掌握这些技巧,助你轻松应对各种兼容性难题,创建更稳定、用户友好的网页应用。
286 3
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
1816 1
|
缓存 前端开发 JavaScript
"面试通关秘籍:深度解析浏览器面试必考问题,从重绘回流到事件委托,让你一举拿下前端 Offer!"
【10月更文挑战第23天】在前端开发面试中,浏览器相关知识是必考内容。本文总结了四个常见问题:浏览器渲染机制、重绘与回流、性能优化及事件委托。通过具体示例和对比分析,帮助求职者更好地理解和准备面试。掌握这些知识点,有助于提升面试表现和实际工作能力。
267 1
|
JavaScript 前端开发 编译器
吐血整理:纯前端如何实现批量dom转图片,并下载成压缩包
【10月更文挑战第2天】吐血整理:纯前端如何实现批量dom转图片,并下载成压缩包
337 2
|
机器学习/深度学习 自然语言处理 前端开发
前端大模型入门:Transformer.js 和 Xenova-引领浏览器端的机器学习变革
除了调用API接口使用Transformer技术,你是否想过在浏览器中运行大模型?Xenova团队推出的Transformer.js,基于JavaScript,让开发者能在浏览器中本地加载和执行预训练模型,无需依赖服务器。该库利用WebAssembly和WebGPU技术,大幅提升性能,尤其适合隐私保护、离线应用和低延迟交互场景。无论是NLP任务还是实时文本生成,Transformer.js都提供了强大支持,成为构建浏览器AI应用的核心工具。
2461 1
|
JavaScript 前端开发 Java
【前端基础篇】JavaScript之BOM介绍
【前端基础篇】JavaScript之BOM介绍
241 1
|
NoSQL 前端开发 MongoDB
前端的全栈之路Meteor篇(三):运行在浏览器端的NoSQL数据库副本-MiniMongo介绍及其前后端数据实时同步示例
MiniMongo 是 Meteor 框架中的客户端数据库组件,模拟了 MongoDB 的核心功能,允许前端开发者使用类似 MongoDB 的 API 进行数据操作。通过 Meteor 的数据同步机制,MiniMongo 与服务器端的 MongoDB 实现实时数据同步,确保数据一致性,支持发布/订阅模型和响应式数据源,适用于实时聊天、项目管理和协作工具等应用场景。
377 0
|
JavaScript 前端开发 UED
【前端基础篇】JavaScript之DOM介绍2
【前端基础篇】JavaScript之DOM介绍
178 0