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


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 相关文章推荐
防止文件缓存的js代码
Jan 10 Javascript
jQuery阻止事件冒泡具体实现
Oct 11 Javascript
jQuery使用之处理页面元素用法实例
Jan 19 Javascript
理解Javascript文件动态加载
Jan 29 Javascript
JS简单实现DIV相对于浏览器固定位置不变的方法
Jun 17 Javascript
Three.js快速入门教程
Sep 09 Javascript
详解AngularJS controller调用factory
May 19 Javascript
React Native第三方平台分享的实例(Android,IOS双平台)
Aug 04 Javascript
Vee-Validate的使用方法详解
Sep 22 Javascript
JavaScript错误处理操作实例详解
Jan 04 Javascript
mpvue全局引入sass文件的方法步骤
Mar 06 Javascript
JavaScript this指向相关原理及实例解析
Jul 10 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
php创建多级目录代码
2008/06/05 PHP
php循环创建目录示例分享(php创建多级目录)
2014/03/04 PHP
PHP错误Parse error: syntax error, unexpected end of file in test.php on line 12解决方法
2014/06/23 PHP
初识laravel5
2015/03/02 PHP
php自定义函数转换html标签示例
2016/09/29 PHP
Gambit vs CL BO3 第二场 2.13
2021/03/10 DOTA
web开发人员学习jQuery的6大理由及jQuery的优势介绍
2013/01/03 Javascript
angularJS 入门基础
2015/02/09 Javascript
js给table赋值的实例代码
2016/10/13 Javascript
ThinkPHP+jquery实现“加载更多”功能代码
2017/03/11 Javascript
js随机生成一个验证码
2017/06/01 Javascript
js 显示日期时间的实例(时间过一秒加1)
2017/10/25 Javascript
推荐10款扩展Web表单的JS插件
2017/12/25 Javascript
ExtJs整合Echarts的示例代码
2018/02/27 Javascript
Vue组件全局注册实现警告框的实例详解
2018/06/11 Javascript
微信小程序实现炫酷的弹出式菜单特效
2019/01/28 Javascript
[00:32]2018DOTA2亚洲邀请赛Mineski出场
2018/04/04 DOTA
python获得一个月有多少天的方法
2015/06/04 Python
windows10系统中安装python3.x+scrapy教程
2016/11/08 Python
Python如何快速实现分布式任务
2017/07/06 Python
numpy中loadtxt 的用法详解
2018/08/03 Python
利用python numpy+matplotlib绘制股票k线图的方法
2019/06/26 Python
python实现京东订单推送到测试环境,提供便利操作示例
2019/08/09 Python
win10环境下配置vscode python开发环境的教程详解
2019/10/16 Python
使用Python和OpenCV检测图像中的物体并将物体裁剪下来
2019/10/30 Python
Python包资源下载路径报404解决方案
2020/11/05 Python
马来西亚航空官方网站:Malaysia Airlines
2017/07/28 全球购物
汇科协同Java笔试题
2012/03/31 面试题
QA工程师岗位职责
2013/11/20 职场文书
党的群众路线教育实践活动制度建设计划
2014/11/03 职场文书
学校元旦晚会开场白
2014/12/14 职场文书
MySQL主从复制断开的常用修复方法
2021/04/07 MySQL
详解Python中__new__方法的作用
2022/03/31 Python
Python3使用Qt5来实现简易的五子棋小游戏
2022/05/02 Python
Redis实现主从复制方式(Master&Slave)
2022/06/21 Redis
flex布局中使用flex-wrap实现换行的项目实践
2022/06/21 HTML / CSS