核心内容:一些先进的浏览器接口
=========
更新
- V1.1 添加事件冒泡
=========
- IntersectionObserver API
- 用于异步检测目标元素与视口或特定元素的交叉状态
- 常用于实现懒加载、无限滚动等功能
- ResizeObserver API
- 用于监听元素大小的变化
- 对于响应式设计和布局很有用
- MutationObserver API
- 用于监视 DOM 树的变化
- 可以检测元素属性、子节点等的变化
- 应用
- 动态内容加载的检测
- 自定义元素的行为监控
- 第三方脚本修改 DOM 的跟踪
- 无限滚动的实现
- 表单验证的动态更新
- Performance API
- 提供了访问当前页面性能相关信息的方法
- 包括 performance.now()、performance.mark() 等方法
- PerformanceObserver
const observer = new PerformanceObserver((list) => { list.getEntries().forEach((entry) => { if (entry.entryType === 'resource') { log('Resource loaded: ' + entry.name + ' (Duration: ' + entry.duration.toFixed(2) + 'ms)'); } }); }); observer.observe({entryTypes: ['resource']});
- requestAnimationFrame
- 浏览器准备刷新之前调用
- requestIdleCallback
- 浏览器空闲时调用
- 使用方法:将任务切成小块,根据空闲时间的多少执行。
- Web Animations API
- 提供了以编程方式创建和控制动画的能力
- 可以替代或补充 CSS 动画
// 获取要进行动画的元素 const element = document.querySelector('#animatedElement'); // 定义动画关键帧 const keyframes = [ { transform: 'translateX(0px)' }, { transform: 'translateX(300px)' } ]; // 定义动画选项 const options = { duration: 1000, // 动画持续时间为1秒 iterations: Infinity, // 无限循环 direction: 'alternate', // 交替方向 easing: 'ease-in-out' // 缓动函数 }; // 创建并播放动画 const animation = element.animate(keyframes, options);
- fetch:用于发起网络请求的API
- Promise-based:基于Promise设计,支持链式调用和异步操作,使代码更加简洁和易读。
- 灵活性:可以轻松配置请求头、请求方法、请求体等。
- 支持流式响应:可以处理大型响应数据,如文件下载。
- 跨域请求:原生支持跨域资源共享(CORS)。
- 缓存控制:提供了细粒度的缓存控制选项。
- 请求中断:支持使用AbortController中断进行中的请求。
- 简单易用:相比XMLHttpRequest,API设计更加直观和易用。
- 与其他现代Web API良好集成:如Service Workers等。
- Page Visibility API
- 允许你检测页面是否对用户可见
- 用于优化后台标签页的资源使用
- Pointer Events API
- 提供了一种处理各种输入设备(如鼠标、触摸屏、笔)的统一方式
- Web Workers API
- 允许脚本在后台线程中运行,不影响用户界面性能
- Service Workers API
- 用于实现离线 Web 应用、后台同步等功能
- 事件冒泡机制
- 浏览器中的事件冒泡机制(Event Bubbling)是指当一个事件触发时,事件会从目标元素开始,沿着DOM树向上逐级冒泡到根节点(通常是document),触发沿途的父元素上绑定的相同事件。冒泡机制的特性对事件处理和控制提供了灵活性,但也需要优化,以确保页面性能。
- 在浏览器中,事件的传播分为三个阶段:
- 捕获阶段(Capturing Phase) :事件从根节点开始向目标元素传播,但此阶段默认不会触发事件处理函数。
- 目标阶段(Target Phase) :事件到达目标元素,触发目标元素上绑定的事件处理函数。
- 冒泡阶段(Bubbling Phase) :事件从目标元素沿着DOM树向上冒泡到根节点,触发沿途的父元素上绑定的相同事件处理函数。
- 可以使用 event.stopPropagation() 阻止事件在冒泡阶段进一步传播,以避免一些不必要的触发。
- 事件性能优化
- 事件委托(Event Delegation)
- 节流
- 移除不必要的事件监听
- 避免阻塞主线程
- 尽量避免在事件处理函数中进行耗时操作。可以将复杂逻辑放requestIdleCallback或setTimeout中,以防止阻塞主线程。
- 使用passive优化滚动性能
- 对于scroll等滚动事件,使用 { passive: true } 提升性能,让浏览器可以优先执行滚动渲染。
window.addEventListener('scroll', handleScroll, { passive: true });