几个非常有意思的javascript API

作为一名前端爱好者, 笔者利用空余时间研究了几个国外网站的源码,发现不管是库,还是业务代码,都会用到了一些比较有意思的API,虽然平时在工作中部分接触过,但是经过这次的研究,觉得很有必要总结一下,毕竟已经2022年了,是时候更新一下技术储备了,本文主要通过实际案例来带大家快速了解以下几个知识点:

  • Observer 原生观察者

  • script标签事件深入 - 移除script标签后事件仍然能执行的原因

  • Proxy/Reflect

  • 自定义事件

  • fileReader API

  • Fullscreen 网页全屏

  • URL API的使用

  • Geolocation 地理位置API的使用

  • Notifications 浏览器原生消息通知

  • Battery Status 设备电量情况

我会对部分API做一些比较有意思的案例,那么开始我们的学习吧~

1. Observer API

Observer是浏览器自带的观察者,它主要提供了 Intersection ,  Mutation ,  Resize ,  Performance 这四类观察者, 这里笔者重点介绍 Intersection Observer .

1.1 Intersection Observer

IntersectionObserver 提供了一种异步观察目标元素与其祖先元素交叉状态的方法。当一个IntersectionObserver对象被创建时,其被配置为监听根中一段给定比例的可见区域,并且无法更改其配置,所以一个给定的观察者对象只能用来监听可见区域的特定变化值;然而,我们可以在同一个观察者对象中配置监听多个目标元素。

说简单点就是该api可以异步监听目标元素在根元素里的位置变动,并触发响应事件.我们可以利用它来实现更为高效的 图片懒加载 ,  无限滚动 以及 内容埋点上报 等.接下来我们通过一个例子来说明一下它的使用步骤.

// 1.定义观察者及观察回调 const intersectionObserver = new IntersectionObserver((entries, observer) => {     entries.forEach(entry => {       console.log(entry)       // ...一些操作     });    },    {     root: document.querySelector('#root'),     rootMargin: '0px',     threshold: 0.5    } ) // 2. 定义要观察的目标对象 const target = document.querySelector(“.target”); intersectionObserver.observe(target);

复制代码

以上代码就实现了一个基本的 Intersection Observer ,虽然已有代码中还体现不出什么实质性功能. 接下来介绍一下代码中使用到的参数的含义:

  • callback IntersectionObserver实例的第一个参数, 当目标元素与根元素通过阈值:banana:时就会触发该回调.回调中第一个参数是被观察对象列表,一旦被观察对象发生突变就会被移入该列表, 列表中每一项都保留有观察者的位置信息;第二个参数为observer,观察者本身.如下图控制台打印:

    其中 rootBounds 表示根元素的位置信息,  boundingClientRect 表示目标元素的位置信息, intersectionRect 表示叉部分的位置信息,  intersectionRatio 表示目标元素的可见比例.

  • 配置属性 IntersectionObserver实例的第二个参数,用来配置监听属性,具体有以下三个属性:

    • root 所监听对象的具体祖先元素(element)。如果未传入值或值为null,则默认使用顶级文档的视窗。

    • rootMargin 计算交叉时添加到根(root)边界盒bounding box的矩形偏移量, 可以有效的缩小或扩大根的判定范围从而满足计算需要

    • thresholds 一个包含阈值的列表, 按升序排列, 列表中的每个阈值都是监听对象的交叉区域与边界区域的比率。当监听对象的任何阈值被越过时,都会生成一个通知(Notification)。如果构造器未传入值, 则默认值为0。以上属性介绍字面上可能很难理解,笔者花几个草图来让大家有个直观的认知:

      当我们设置rootMargin为10px时,我们的root会增大影响范围,但目标元素移动到淡红色区域就会被监听到,当然我们还可以设置rootMargin为负值来减少影响区域.其支持的值为百分比和px,如下:

rootMargin: '10px'

rootMargin: '10%'

rootMargin:

'10px 0px 10px 10px'

复制代码

thresholds可以如下图理解:

由上图所示,当我们设置阈值为[0.25, 0.5]时, 目标元素的25%和50%进入根元素的影响范围时都会触发回调.利用这个特性我们往往可以实现位差动画,或者更根据目标元素的位置变化做不同的交互. 当然Intersection还提供了以下几个方法来控制观察对象:

  • disconnect() 使IntersectionObserver对象停止监听工作

  • takeRecords() 返回所有观察目标的IntersectionObserverEntry对象数组

  • unobserve() 使IntersectionObserver停止监听特定目标元素

了解了使用方法和api之后,我们来看看一个实际应用--实现图片懒加载:

<img src = "loading.gif" data-src = "absolute.jpg" >

<img src = "loading.gif" data-src = "relative.jpg" >

<img src = "loading.gif" data-src = 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值