js如何监听元素事件是否被移除_JavaScript 监听元素是否进入/移出可视区域

JavaScript 监听元素是否进入/移出可视区域

常规操作

防抖节流

IntersectionObserver

兼容的代码

常规操作

通常的做法是,监听srcoll事件,根据元素的offset来判断。

window.addEventListener('scroll', this.scrollHandle, true);

使用getBoundingClientRec()来获取元素的位置。

scrollHandle () {

const offset = this.$el.getBoundingClientRect(); // vue中,使用this.$el获取当前组件的根元素

const offsetTop = offset.top;

const offsetBottom = offset.bottom;

const offsetHeight = offset.height;

// 进入可视区域

if (offsetTop <= window.innerHeight && offsetBottom >= 0) {

console.log('进入可视区域');

// do something...

} else {

console.log('移出可视区域');

// do something...

}

}

记得在适当的时候移除事件监听

window.removeEventListener('scroll', this.scrollHandle, true);

但是这种操作,使得我们的开销变得很大,所以可以考虑防抖和节流。

防抖节流

关于防抖和节流,看过不一样的理解,有的人认为防抖和节流是一个意思,在这里,按照我的理解,给防抖和节流的定义如下:

防抖:在停止触发一段时间后再调用方法;

节流:再一段时间内至少调用一次方法;

具体的原理就不讲了,直接上代码,iselapsed参数表示是否等待上一次,也就是iselapsed为true,则为节流。

/**

* 防抖节流

* @param {*} action 回调

* @param {*} delay 等待的时间

* @param {*} context this指针

* @param {Boolean} iselapsed 是否等待上一次

* @returns {Function}

*/

function throttle (action, delay, context, iselapsed) {

let timeout = null;

let lastRun = 0;

return function () {

if (timeout) {

if (iselapsed) {

return;

} else {

clearTimeout(timeout);

timeout = null;

}

}

let elapsed = Date.now() - lastRun;

let args = arguments;

if (iselapsed && elapsed >= delay) {

runCallback();

} else {

timeout = setTimeout(runCallback, delay);

}

/**

* 执行回调

*/

function runCallback() {

lastRun = Date.now();

timeout = false;

action.apply(context, args);

}

};

}

在这里,我希望方法在一段时间内至少执行一次,所以我用节流

window.addEventListener('scroll', this.scrollHandle, true);

this.scrollHandle = throttle(this.scrollThrottle, 200, this, true)

scrollThrottle () {

const offset = this.$el.getBoundingClientRect();

const offsetTop = offset.top;

const offsetBottom = offset.bottom;

const offsetHeight = offset.height;

// 进入可视区域

if (offsetTop <= window.innerHeight && offsetBottom >= 0) {

console.log('进入可视区域');

// do something...

} else {

console.log('移出可视区域');

this.enabledPause = false;

// do something...

}

}

IntersectionObserver

安卓设备和部分浏览器支持IntersectionObserver来通知我们元素进入/移出可视区域。

判断是否支持IntersectionObserver:

if ('IntersectionObserver' in window &&

'IntersectionObserverEntry' in window &&

'intersectionRatio' in window.IntersectionObserverEntry.prototype) {

// do something

}

创建IntersectionObserver,并传入回调,指定进入/移出可视区域时的操作。还可以传入一个对象({threshold, root}),用来配置IntersectionObserver。

threshold属性决定了什么时候触发回调函数。它是一个数组,每个成员都是一个门槛值,例如[0, 0.25, 0.5, 0.75, 1]。默认为[0],即交叉比例(intersectionRatio)达到0时触发回调函数。

root属性用来指定根元素。

callback函数的参数entries是一个数组,每个成员都是一个IntersectionObserverEntry对象,其中的intersectionRatio属性表示监听的元素与根元素的交叉的比例,>0则表示此时进入可视区域。

this.observer = new IntersectionObserver(entries => {

if (entries[0].intersectionRatio > 0) {

console.log('进入可视区域');

// do something

} else {

console.log('移出可视区域');

// do something

}

});

开始监听

this.observer.observe(this.$el);

取消监听

this.observer.disconnect();

兼容的代码

因为iOS不支持IntersectionObserver,所以我们要在不支持的时候继续监听scroll事件。

贴上完整的代码

import throttle from '../throttle.js';

export default {

data () {

return {

observer: null,

scrollHandle: throttle(this.scrollThrottle, 200, this, true)

};

},

mounted () {

// 判断是否支持 IntersectionObserver

if ('IntersectionObserver' in window &&

'IntersectionObserverEntry' in window &&

'intersectionRatio' in window.IntersectionObserverEntry.prototype) {

this.observer = new IntersectionObserver(entries => {

if (entries[0].intersectionRatio > 0) {

console.log('进入可视区域');

// do something

} else {

console.log('移出可视区域');

// do something

}

});

}

},

methods: {

startObserve () {

if (this.observer) {

this.observer.observe(this.$el);

} else {

window.addEventListener('scroll', this.scrollHandle, true);

}

},

endObserve () {

if (this.observer) {

this.observer.disconnect();

} else {

window.removeEventListener('scroll', this.scrollHandle, true);

}

},

scrollThrottle () {

const offset = this.$el.getBoundingClientRect();

const offsetTop = offset.top;

const offsetBottom = offset.bottom;

const offsetHeight = offset.height;

// 进入可视区域

if (offsetTop <= window.innerHeight && offsetBottom >= 0) {

console.log('进入可视区域');

// do something

} else {

console.log('移出可视区域');

// do something

}

}

}

}

throttle.js

/**

* 回调节流

*

* @export

* @param {*} action 回调

* @param {*} delay 等待的时间

* @param {*} context this指针

* @param {Boolean} iselapsed 是否等待上一次

* @returns {Function}

*/

export default function throttle (action, delay, context, iselapsed) {

let timeout = null;

let lastRun = 0;

return function () {

if (timeout) {

if (iselapsed) {

return;

} else {

clearTimeout(timeout);

timeout = null;

}

// return;

}

let elapsed = Date.now() - lastRun;

let args = arguments;

if (iselapsed && elapsed >= delay) {

runCallback();

} else {

timeout = setTimeout(runCallback, delay);

}

/**

* 执行回调

*/

function runCallback() {

lastRun = Date.now();

timeout = false;

action.apply(context, args);

}

};

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/333921.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人工智能领域论文常见基本概念笔记

BLEU分数: 一个比较候选文本翻译与其他一个或多个参考翻译的评价分数。 AUC: 衡量学习器优劣的一种指标&#xff0c;Roc曲线下与坐标轴围成的面积(0.5~1),越接近1&#xff0c;检测方法真实性越高。 Image Caption: 一般有几种叫法&#xff1a;图像描述&#xff0c;图像标注…

okta-spring_通过Okta的单点登录保护Spring Boot Web App的安全

okta-spring“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕&#xff1f; 尝试使用Okta API进行托管身份验证&#xff0c;授权和多因素身份验证。 您可以使用SpringBoot和Okta在不到20分钟的时间内启动具有完整用户身份和…

Mac 键盘符号整理

图标介绍⌘Command⇧Shift⇪Caps Lock⌥Option Alt⌃Control↩Enter⌫Delete⌦Fn Delete↑上箭头↓下箭头←左箭头→右箭头⇞Fn ↑ Page Up⇟Fn ↓ Page DownHomeFn ←EndFn →⇥Tab 右制表符⇤Shift Tab 左制表符⎋Esc Escape⏏电源开关键

团队的英文翻译缩写_魔兽世界各种英文/拼音/缩写的翻译/解释

大灾变缩写为CTM团队副本名称缩写&#xff1a;VOA(国服简称为宝库&#xff0c;拼音缩写为BK....)&#xff1a;Vault of Archavon 八十年代团队副本阿尔卡冯的宝库&#xff0c;台服译作亞夏梵穹殿。位于冬拥湖(台服译作冬握湖)。分10人和25人难度。没有困难模式。NAXX: Naxxrama…

机器学习常见基本概念笔记

机器学习 监督学习和非监督学习: 有监督学习的方法就是识别事物&#xff0c;识别的结果表现在给待识别数据加上了标签。因此训练样本集必须由带标签的样本组成。比如分类和回归。 而无监督学习方法只有要分析的数据集的本身&#xff0c;预先没有什么标签。如果发现数据集呈现…

adf开发_在EL表达式中引用ADF Faces组件

adf开发EL表达式通常用于在页面上指定ADF Faces组件的属性值。 有趣的是&#xff0c;我们可以使用component关键字来引用要为其评估EL表达式的组件实例。 这是略与此类似Java中。 例如&#xff0c;在以下代码段中&#xff0c;按钮的提示被评估为按钮的文本值&#xff0c;并且它…

Navicat Premium for Mac 快捷键

快捷键说明Comm R运行全部语句Shift Comm R运行当前语句Comm 1显示/隐藏左侧的导航窗格Comm 2显示/隐藏右侧的信息窗格Option Comm T隐藏工具栏Comm N创建新表Comm 添加记录Comm -删除记录Comm Y新建查询&#xff0c;这样会打开一个标签界面&#xff0c;可以在这个界…

wxpython 多线程_在wxPython中使用线程连续更新GUI的好方法?

我正在开发一个使用pythonv2.7和wxpythonv3.0的GUI应用程序。我必须不断更新我的图形用户界面&#xff0c;其中包含许多面板。每个面板包含一个wx.StaticText。我必须不断更新这些wx.StaticTexts。我想用threads。我还使用pubsub模块与GUI通信来更新这些wx.StaticTexts。每件事…

Pytorch代码函数笔记

1.torch.squeeze(): 要对数据的维度进行压缩&#xff0c;去掉维数为1的的维度&#xff0c;比如是一行或者一列这种&#xff0c;一个一行三列(1,3)的数去掉第一个维数为一的维度之后就变成&#xff08;3&#xff09;行。 2.nn.Sequential(): 一个有序的容器,神经网络模块将按…

apache poi_将HTML转换为Apache POI的RichTextString

apache poi1.概述 在本教程中&#xff0c;我们将构建一个将HTML作为输入的应用程序&#xff0c;并使用提供HTML的RichText表示形式创建Microsoft Excel工作簿。 为了生成Microsoft Excel工作簿&#xff0c;我们将使用Apache POI 。 为了分析HTML&#xff0c;我们将使用Jericho。…

Windows 下有哪些逆天的软件?

文章目录逆天软件系列1&#xff1a;Everything逆天软件系列2&#xff1a;Total Commander逆天软件系列3&#xff1a;Snipaste逆天软件系列4&#xff1a;Microsoft To-Do逆天软件系列5&#xff1a;ScreenToGIF逆天软件系列6&#xff1a;Geek Uninstaller逆天软件系列7&#xff1…

C++中绘图工具EasyX基本操作

使用头文件 #include <graphics.h>创建和关闭图形界面 initgraph(800,600); //创建图形界面&#xff0c;参数:图形宽度&#xff0c;图形高度 closegraph(); //关闭图形界面画图形形状 //画圆&#xff0c;参数&#xff1a;圆心点x坐标&#xff0c;圆心点y坐标,半径mm c…

oracle adf_Fn函数来构建Oracle ADF应用程序

oracle adf在我之前的一篇文章中&#xff0c;我描述了如何创建一个Docker容器作为ADF应用程序的构建器。 在这里&#xff0c;我将展示如何将此容器用作 在FN平台的功能 。 首先&#xff0c;让我们更新容器&#xff0c;使其符合功能要求&#xff0c;这意味着可以将其作为接受某…

Sublime Text 4.0 4102 安装插件的问题

文章目录安装包控件&#xff08;Package Control&#xff09;如何安装插件打开 Install Package 面板搜索和安装插件无法打开 Install Package 面板的问题故障排除安装包控件&#xff08;Package Control&#xff09; 要安装插件&#xff0c;必须先安装 Package Control&#…

系统制成docker镜像_docker 制作自己的镜像

查看 docker的服务状态systemctl status docker如果没有启动的话&#xff0c;要先启动 docker 服务systemctl start docker制作自己的镜像1.从远程仓库拉取一个纯净的 centos 系统镜像查询 centos 相关的镜像docker search centos下载镜像到本地docker pull 镜像名查看本地镜像…

Pytorch机器学习/深度学习代码笔记

代码步骤笔记导入模块设置参数数据预处理定义数据集1.Dataset2.ImageFolder加载数据集DataLoadertorchvision--数据预处理要使用的库torchvision.datasetstorchvision.modelstorchvision.transforms训练网络参数训练前的准备设置指定的训练设备(GPU、CPU)定义损失函数定义优化器…

maven安装教程安装教程_Maven教程之春

maven安装教程安装教程1.简介 在这篇文章中&#xff0c;我们将演示如何针对非常特定的用例对Spring使用Maven依赖项。 我们使用的所有库的最新版本都可以在Maven Central上找到。 对于一个有效的构建周期来说&#xff0c;了解Maven依赖项的工作方式以及如何对其进行管理很重要…

如何完全卸载 Sublime Text

只是在应用程序删除软件是不够&#xff0c;你还必须把下面这个目录删除掉才行&#xff1a; /Users/liaowenxiong/Library/Application Support/Sublime Text /Users/liaowenxiong/Library/Preferences/Sublime Text /Users/liaowenxiong/Library/Caches/Sublime Text不这么干&…

5位随机数重复的概率 php_PHP产生不重复随机数的5个方法总结

无论是Web应用&#xff0c;还是WAP或者移动应用&#xff0c;随机数都有其用武之地。在最近接触的几个小项目中&#xff0c;我也经常需要和随机数或者随机数组打交道&#xff0c;所以&#xff0c;对于PHP如何产生不重复随机数常用的几种方法小结一下(ps&#xff1a;方法1、4、5是…

pytorch实现图像分类代码实例

图像多标签分类例子 import os import torch import torch.nn as nn import torchvision.transforms as transforms import torchvision.datasets as datasets import torchvision.models as models import matplotlib.pyplot as plt from matplotlib.ticker import MultipleL…