搬运自: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事件的更多相关文章

  1. vue学习笔记(一)关于事件冒泡和键盘事件 以及与Angular的区别

    一.事件冒泡 方法一.使用event.cancelBubble = true来组织冒泡 <div @click="show2()"> <input type=&q ...

  2. Vue父组件与子组件传递事件/调用事件

    1.Vue父组件向子组件传递事件/调用事件 <div id="app"> <hello list="list" ref="child ...

  3. 深入理解Vue父子组件通讯的属性和事件

    在html中使用元素,会有一些属性,如class,id,还可以绑定事件,自定义组件也是可以的.当在一个组件中,使用了其他自定义组件时,就会利用子组件的属性和事件来和父组件进行数据交流. 父子组件之间的 ...

  4. HTML5全局属性和事件

    全局属性和事件能够应用到所有标签元素上,在HTML4中有许多全局属性,比如id,class等.HTML5中又新增了一些特殊功能的全局属性和事件.   属性:   HTML5属性能够赋给标签元素含义和语 ...

  5. ExtJS要利用观察者模式 去实现自定义的事件

    // 要利用观察者模式 去实现自定义的事件 //1:由于浏览器他自己能定义内置的事件(click/blur...) // 我们也应该有一个类似于浏览器这样的类,这个类 自己去内部定义一些事件(自定义事 ...

  6. Asp.net mvc 自定义全局的错误事件HandleErrorAttribute无效

    Asp.net mvc 自定义全局的错误事件HandleErrorAttribute,结果无效, 原因: 1.没有在RegisterGlobalFilters 里面添加或者你要的位置添加. 2.你把这 ...

  7. Vue 局部组件和全局组件的使用

    <template> <div id="app"> <!--<img alt="Vue logo" src="./ ...

  8. vue教程3-03 vue组件,定义全局、局部组件,配合模板,动态组件

    vue教程3-03 vue组件,定义全局.局部组件,配合模板,动态组件 一.定义一个组件 定义一个组件: 1. 全局组件 var Aaa=Vue.extend({ template:'<h3&g ...

  9. Vue源码探究-全局API

    Vue源码探究-全局API 本篇代码位于vue/src/core/global-api/ Vue暴露了一些全局API来强化功能开发,API的使用示例官网上都有说明,无需多言.这里主要来看一下全局API ...

随机推荐

  1. Java中的线程Thread方法之---join()

    上一篇我们说到了Thread中的stop方法,这一篇我们再来看一下方法join的使用,那么方法Join是干啥用的? 简单回答,同步,如何同步? 怎么实现的? 下面将逐个回答. join方法从字面上的意 ...

  2. Funcation:Object

    ylbtech-Funcation:Object 1.返回顶部 1. public object GetMyRelation() { var list = new List<object> ...

  3. CentOS7开放防火墙端口

    ~~~~~~~~~~~~开放某个端口~~~~~~~~~~~~firewall-cmd --zone=public --add-port=6669/tcp --permanentfirewall-cmd ...

  4. 【Wikioi】P1401 逆序统计 代码

    题目链接:http://wikioi.com/solution/list/1401/ 题解链接:http://user.qzone.qq.com/619943612/blog/1377265690 代 ...

  5. netty UnpooledHeapByteBuf 源码分析

    UnpooledHeapByteBuf 是基于堆内存进行内存分配的字节缓冲区,没有基于对象池技术实现,这意味着每次I/O的读写都会创建一个新的UnpooledHeapByteBuf,频繁进行大块内存的 ...

  6. iOS开发系列-Runtime运用场景

    概述 Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的. 调用runtimeAPI需要导入都文件#impor ...

  7. vue使用axios提交formdata格式的数据

    参考: https://www.cnblogs.com/qwert1/p/8909455.html https://blog.csdn.net/qq_42984640/article/details/ ...

  8. 用多线程发送邮箱(一次给一个用户发送N封邮件)

    前台不用写,后台执行方法就可以了. namespace SendMail { public partial class SendMail_Page : System.Web.UI.Page { pro ...

  9. PHP算法之猜数字

    小A 和 小B 在玩猜数字.小B 每次从 1, 2, 3 中随机选择一个,小A 每次也从 1, 2, 3 中选择一个猜.他们一共进行三次这个游戏,请返回 小A 猜对了几次? 输入的guess数组为 小 ...

  10. truncate、delete、drop

    相同点: 1.三者共同点: truncate.不带where字句的delete.drop都会删除表内的数据 2.drop.truncate的共同点: drop.truncate都得DDL语句(数据库定 ...