vue 利用intersectionOberver实现全局appear/disappear事件
搬运自:https://juejin.im/post/5cd10959f265da03a00fe5c6
效果:

demo地址: https://codepen.io/deepkolos/pen/OYPNNv?editors=1011
vue:
<template>
<div @appear="onAppear" @disappear="onDisappear">box</div>
</template> <script>
export default {
methods: {
onAppear() { console.log('onAppear') },
onDisappear() { console.log('onDisappear') }
}
}
</script>
js:
extend(EventTarget.prototype, 'addEventListener', function(eventName) {
let node = this;
let ioContext = node.__IO__;
if (eventName === 'appear' || eventName === 'disappear') {
// 一个节点需要一个 io 即可
if (node.__IO__) {
ioContext.listenerNum++;
return;
}
let io = new IntersectionObserver(entries => {
const ioContext = node.__IO__;
const { visible: lastVisible } = ioContext;
const entry = entries[entries.length - 1];
const ratio = entry.intersectionRatio;
const visible = entry.isIntersecting && ratio >= 0;
if (lastVisible === undefined) {
ioContext.visible = visible;
} else if (visible !== lastVisible) {
ioContext.visible = visible;
node.dispatchEvent(
new CustomEvent(visible ? 'appear' : 'disappear', {
bubbles: false // appear/disappear是节点相关的事件不能冒泡
})
);
}
});
node.__IO__ = {
instance: io,
listenerNum: 1
};
io.observe(node);
}
});
extend(EventTarget.prototype, 'removeEventListener', function(eventName) {
let node = this;
let ioContext = node.__IO__;
if (eventName === 'appear' || eventName === 'disappear') {
// 当事件为没有监听器的时候就可以把 io 注销, 释放内存
if (--ioContext.listenerNum === 0) {
ioContext.instance.disconnect();
ioContext.instance = null;
node.__IO__ = null;
}
}
});
function extend(obj, fnName, cb) {
const oldFn = obj[fnName];
obj[fnName] = function wrap() {
let ret;
oldFn && (ret = oldFn.apply(this, arguments));
cb && cb.apply(this, arguments);
return ret;
};
}
vue 利用intersectionOberver实现全局appear/disappear事件的更多相关文章
- vue学习笔记(一)关于事件冒泡和键盘事件 以及与Angular的区别
一.事件冒泡 方法一.使用event.cancelBubble = true来组织冒泡 <div @click="show2()"> <input type=&q ...
- Vue父组件与子组件传递事件/调用事件
1.Vue父组件向子组件传递事件/调用事件 <div id="app"> <hello list="list" ref="child ...
- 深入理解Vue父子组件通讯的属性和事件
在html中使用元素,会有一些属性,如class,id,还可以绑定事件,自定义组件也是可以的.当在一个组件中,使用了其他自定义组件时,就会利用子组件的属性和事件来和父组件进行数据交流. 父子组件之间的 ...
- HTML5全局属性和事件
全局属性和事件能够应用到所有标签元素上,在HTML4中有许多全局属性,比如id,class等.HTML5中又新增了一些特殊功能的全局属性和事件. 属性: HTML5属性能够赋给标签元素含义和语 ...
- ExtJS要利用观察者模式 去实现自定义的事件
// 要利用观察者模式 去实现自定义的事件 //1:由于浏览器他自己能定义内置的事件(click/blur...) // 我们也应该有一个类似于浏览器这样的类,这个类 自己去内部定义一些事件(自定义事 ...
- Asp.net mvc 自定义全局的错误事件HandleErrorAttribute无效
Asp.net mvc 自定义全局的错误事件HandleErrorAttribute,结果无效, 原因: 1.没有在RegisterGlobalFilters 里面添加或者你要的位置添加. 2.你把这 ...
- Vue 局部组件和全局组件的使用
<template> <div id="app"> <!--<img alt="Vue logo" src="./ ...
- vue教程3-03 vue组件,定义全局、局部组件,配合模板,动态组件
vue教程3-03 vue组件,定义全局.局部组件,配合模板,动态组件 一.定义一个组件 定义一个组件: 1. 全局组件 var Aaa=Vue.extend({ template:'<h3&g ...
- Vue源码探究-全局API
Vue源码探究-全局API 本篇代码位于vue/src/core/global-api/ Vue暴露了一些全局API来强化功能开发,API的使用示例官网上都有说明,无需多言.这里主要来看一下全局API ...
随机推荐
- python解决迅雷下载限制的方法
一.转换迅雷下载链接 import base64 url='thunder://QUFodHRwOi8veHVubGVpLnhpYXphaS16dWlkYS5jb20vMTkwOC/JqLa+Mi5I ...
- linux下mysql权限配置
先登入mysql mysql -u root -p 然后回车键入密码! 1.2 赋予主机B操作数据库的权限 mysql> grant usage on *.* to username@192.1 ...
- bash数组总结
bash数组操作 bash支持两种数组,一种是索引数组,一种是关联数组 索引数组 数组的值类型是任意的,索引也未必一定要连续,当做列表理解更好 下面总结下索引数组,即列表: 1. 声明 declare ...
- git学习记录1(本地库管理)
学习参考地址:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 本编随笔只是自己对 ...
- 剑指offer——15剪绳子
题目描述 给你一根长度为n的绳子,请把绳子剪成m段(m.n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],...,k[m].请问k[0]xk[1]x...xk[m]可能 ...
- 解决多个window.onscroll覆盖的问题
项目中有好几处都有用到监听页面滚动window.onscroll这个函数,结果出现了后者覆盖前者的问题. 最后是通过addEventListener解决了这种共存问题. ⚠️该处代码thi ...
- solr 查询同一个core 的关联字段
实现一个core里面多个字段的关联查询: 应用场景是: 词, 句子,文章 希望通过查询实现词,句子,文章里面共同有的关键字 private static CloudSolrServer cloudSo ...
- grep 的一些常用用法
打印匹配到的上下5行 grep -C 5 'root' /etc/passwd 上下5行 grep -A 5 'root' /etc/passwd afte ...
- springcloud(十六):服务网关zuul (2)
Zuul的核心 Filter是Zuul的核心,用来实现对外服务的控制.Filter的生命周期有4个,分别是“PRE”.“ROUTING”.“POST”.“ERROR”,整个生命周期可以用下图来表示. ...
- .net 裁剪图片
private void GetImg() { ) { return; } ]; string[] imgsize = Request["imgsize"].Split('& ...