小程序模块曝光埋点方法
我们在处理模块曝光埋点时,需要根据页面滚动的位置判断模块是否可见(被曝光)。Web 上传统方法是增加页面 scroll 监听事件,根据滚动位置与模块位置进行对比判断,小程序上也可以使用这种方法,但现在有更便捷优雅的替代方案 —— IntersectionObserver 对象。 IntersectionObserver 对象IntersectionObserver 对象,用于推断某些节点是否可以被用户看见,下面将介绍相关的 API: (1) 创建通过
(2) 设置参考区域设置参考区域的方法有两个: (3) 监听开始监听方法:
(4) 取消监听当页面退出时记得要取消监听:io.disconnect()。 监听相交区域类我们可以设计一个类,用来处理监听相交区域的逻辑。 构造函数首先来看构造函数,代码如下: class IntersectionObserver {
constructor(options) {
this.$options = {
context: null,threshold: 0.5,initialRatio: 0,observeAll: false,selector: relativeTo: onEach: res => res.dataset,onFinal: () => delay: 200,...options,}
this.$observer = null
}
}复制代码
显然,构造函数传入了一些重要的参数,包括 最后还有 IntersectionObserver 类监听调用时需要的三个参数:
监听要想开始监听相交区域,需要先创建监听器,设置完相交区域后再开始监听,关键代码如下: _createObserver() {
const opt = this.$options
const observerOptions = {
thresholds: [opt.threshold],observeAll: opt.observeAll,initialRatio: opt.initialRatio,}
// 创建监听器
const ob = opt.context
? opt.context.createIntersectionObserver(observerOptions)
: wx.createIntersectionObserver(null,observerOptions)
// 相交区域设置
if (opt.relativeTo) ob.relativeTo(opt.relativeTo)
else ob.relativeToViewport()
// 开始监听
let finalData = []
let isCollecting = false
ob.observe(opt.selector,res => {
const { intersectionRatio } = res
const visible = intersectionRatio >= opt.threshold
if (!visible) return
const data = opt.onEach(res)
finalData.push(data)
if (isCollecting) return // 正在收集监听结果,不会调用 onFinal
isCollecting = true
// 设置延迟调用 onFinal
setTimeout(() => {
opt.onFinal.call(null,finalData)
finalData = []
isCollecting = false
},51); font-weight: 700;">opt.delay)
})
return ob
}
复制代码
对外暴露的公用方法封装对外的 connect() {
this.$observer) return this
this.$observer = this._createObserver()
this
}
复制代码
封装停止监听的方法: disconnect() {
if (!return
const ob = this.$observer
if (ob.$timer) clearTimeout(ob.$timer)
ob.disconnect()
null
}
复制代码
使用方法import IntersectionObserver from './intersection-observer.js';
const ob = new IntersectionObserver({...})
ob.connect()复制代码
详见代码片段: developers.weixin.qq.com/s/lqUakfmM7… 总结当然,曝光埋点也可以使用传统 Web 的监听 scroll 事件的方式。不过,既然小程序提供了 IntersectionObserver API 并且几乎所有客户端都已支持,那自然就用这种更方便的方式。 另外,在百度小程序和支付宝小程序上也有支持相关的API,跨端开发也不用考虑其他小程序不支持。 关于兼容性支付包小程序兼容性有待考证,百度可以使用 参考文档
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |