浅谈微信小程序列表埋点曝光指南


Posted in Javascript onOctober 15, 2019

背景

最近项目中,开发一个小程序列表页,PM大大给我提了一个埋点需求,列表中的每一项,出现在屏幕中的时候,需要上报一条记录。

目标

浅谈微信小程序列表埋点曝光指南

如图中操作,要依次上报 item 1 - item7,但是上滑的时候,不再重复上报

怎么做

接到需求的第一感觉是,我难道要监听页面滚动,然后通过offsetTop 去算吗!!!??? 这样显然不是最高效的。于是我去翻了一下微信的开发文档,发现有一个IntersectionObserver 的API,正好满足我的需求。

首先我们需要创建一个 IntersectionObserver wx.createIntersectionObserver(Object component, Object options)

IntersectionObserver 一共有四个方法

  • IntersectionObserver.relativeTo 使用选择器指定一个节点,作为参照区域之一。
  • IntersectionObserver.relativeToViewport(Object margins) 指定页面显示区域作为参照区域之一
  • IntersectionObserver.observeCallback callback) 指定目标节点并开始监听相交状态变化情况
  • IntersectionObserver.disconnect()
  • 停止监听。回调函数将不再触发

我们这里的参照物是屏幕,所以我们使用 IntersectionObserver.relativeToViewport 来制定我们的参照物,并制定相较规则

Page({
 data: {
 list: [
  { value: 1, hadReport: false }, 
  { value: 2, hadReport: false },
  { value: 3, hadReport: false },
  { value: 4, hadReport: false },
  { value: 5, hadReport: false },
  { value: 6, hadReport: false },
  { value: 7, hadReport: false },
  { value: 8, hadReport: false },
  { value: 9, hadReport: false },
 ]
 },
 onLoad() {
 this._observer = this.createIntersectionObserver({ observeAll: true })
 this._observer.relativeToViewport({ bottom: 0 })
  .observe('.item', (res) => {
  const { index } = res.dataset;
  if (!this.data.list[index].hadReport) {
   console.log(`report ${index}`) 
   this.data.list[index].hadReport = true;
   this.setData({ list: [].concat(this.data.list)})
  }
  
  })
 },
 onUnload() {
 if (this._observer) this._observer.disconnect()
 }
})

最后实现的效果如下

浅谈微信小程序列表埋点曝光指南 

结论

  1. 类似这样的埋点,我们以后可以采用监听dom的方式去做,而不是一昧的只想着监听滚动计算位置。
  2. 除了可以做埋点上报,这种监听的方式,还是很适合去做一些图片懒加载等一系列操作。

 联想

上述的所有操作,都是基于微信小程序去做的,那么浏览器有没有相应的API呢?

浏览器是有相应的API的, Intersection Observer API ,具体的用法与上述的用法类似。

var options = {
 rootMargin: '0px',
 threshold: 1.0
 }

 var observer = new IntersectionObserver((...args) => {
 console.log(args);
 }, options);
 observer.observe(document.querySelector('.item'));

注意这个会监测dom元素的可见性变化,也就是说当dom出现在视窗的时候会触发回调,消失在视窗的时候也会触发回调

但是浏览器的 IntersectionObserver 属性兼容性一般,如果想要在浏览器做曝光或者懒加载可以考虑采用原始的方法,监听浏览器滚动,并计算dom的offsetTop,可以参考笔者很久前写的 图片延时 加载原理 及应用

浅谈微信小程序列表埋点曝光指南 

参考文档

谈谈IntersectionObserver懒加载

微信小程序IntersectionObserver 文档

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
传递参数的标准方法(jQuery.ajax)
Nov 19 Javascript
通过正则格式化url查询字符串实现代码
Dec 28 Javascript
Extjs 3.3切换tab隐藏相应工具栏出现空白解决
Apr 02 Javascript
js采用map取到id集合组并且实现点击一行选中一行
Dec 16 Javascript
JavaScript事件类型中UI事件详解
Jan 14 Javascript
Javascript将数字转化成为货币格式字符串
Jun 22 Javascript
JQuery EasyUI学习教程之datagrid 添加、修改、删除操作
Jul 09 Javascript
js控制li的隐藏和显示实例代码
Oct 15 Javascript
Validform表单验证总结篇
Oct 31 Javascript
php输出全部gb2312编码内的汉字方法
Mar 04 Javascript
微信小程序注册60s倒计时功能 使用JS实现注册60s倒计时功能
Aug 16 Javascript
使用vue完成微信公众号网页小记(推荐)
Apr 28 Javascript
javascript网页随机点名实现过程解析
Oct 15 #Javascript
javascript随机变色实例代码
Oct 15 #Javascript
vue中axios的二次封装实例讲解
Oct 14 #Javascript
Vue项目打包部署到iis服务器的配置方法
Oct 14 #Javascript
浅析微信小程序modal弹窗关闭默认会执行cancel问题
Oct 14 #Javascript
vue实现百度语音合成的实例讲解
Oct 14 #Javascript
vue中进行微博分享的实例讲解
Oct 14 #Javascript
You might like
《APMServ 5.1.2》使用图解
2006/10/23 PHP
一步一步学习PHP(1) php开发环境配置
2010/02/15 PHP
php下统计用户在线时间的一种尝试
2010/08/26 PHP
php分页思路以及在ZF中的使用
2012/05/30 PHP
一个非常完美的读写ini格式的PHP配置类分享
2015/02/12 PHP
PC端微信扫码支付成功之后自动跳转php版代码
2017/07/07 PHP
详解no input file specified 三种解决方法
2019/11/29 PHP
[原创]保存的js无法执行的解决办法
2007/02/25 Javascript
javascript prototype,executing,context,closure
2008/12/24 Javascript
js 鼠标点击事件及其它捕获
2009/06/04 Javascript
基于JQuery的一句话搞定手风琴菜单
2012/09/14 Javascript
解析JavaScript中的不可见数据类型
2013/12/02 Javascript
jQuery简单实现隐藏以及显示特效
2015/02/26 Javascript
javascript将DOM节点添加到文档的方法实例分析
2015/08/04 Javascript
详解JavaScript模块化开发
2016/12/04 Javascript
AngularJS通过ng-route实现基本的路由功能实例详解
2016/12/13 Javascript
Vue2.x中的Render函数详解
2017/05/30 Javascript
微信小程序使用wx.request请求服务器json数据并渲染到页面操作示例
2019/03/30 Javascript
layui时间控件选择时间范围的实现方法
2019/09/28 Javascript
在vue中根据光标的显示与消失实现下拉列表
2019/09/29 Javascript
JavaScript检测浏览器是否支持CSS变量代码实例
2020/04/03 Javascript
详解Webpack4多页应用打包方案
2020/07/16 Javascript
[02:51]DOTA2 2015国际邀请赛中国区预选赛第一日战报
2015/05/27 DOTA
在Linux上安装Python的Flask框架和创建第一个app实例的教程
2015/03/30 Python
Python基于traceback模块获取异常信息
2020/07/23 Python
Python常用模块函数代码汇总解析
2020/08/31 Python
Html5 Canvas实现图片标记、缩放、移动和保存历史状态功能 (附转换公式)
2020/03/18 HTML / CSS
西班牙英格列斯百货官网:El Corte Inglés
2016/09/25 全球购物
澳大利亚波西米亚风情网上商店:Czarina
2019/03/18 全球购物
公证委托书大全
2014/04/04 职场文书
不遵守课堂纪律的检讨书
2014/09/24 职场文书
2014最新自愿离婚协议书范本
2014/11/19 职场文书
党员个人自我评价
2015/03/03 职场文书
电影红河谷观后感
2015/06/11 职场文书
解决mysql的int型主键自增问题
2021/07/15 MySQL
MySql分区类型及创建分区的方法
2022/04/13 MySQL