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


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 相关文章推荐
jquery1.83 之前所有与异步列队相关的模块详细介绍
Nov 13 Javascript
基于jquery实现一张图片点击鼠标放大再点缩小
Sep 29 Javascript
js实现页面跳转重定向的几种方式
May 29 Javascript
js判断当前浏览器类型,判断IE浏览器方法
Jun 02 Javascript
node.js中的fs.link方法使用说明
Dec 15 Javascript
JS交换变量的方法
Jan 21 Javascript
jQuery插件echarts去掉垂直网格线用法示例
Mar 03 Javascript
Javascript es7中比较实用的两个方法示例
Jul 21 Javascript
react-router4 嵌套路由的使用方法
Jul 24 Javascript
详解vue-cli 快速搭建单页应用之遇到的问题及解决办法
Mar 01 Javascript
通过实例解析js可枚举属性与不可枚举属性
Dec 02 Javascript
vue使用echarts实现折线图
Mar 21 Vue.js
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函数
2006/10/09 PHP
利用static实现表格的颜色隔行显示
2006/10/09 PHP
PHP中使用localhost连接Mysql不成功的解决方法
2014/08/20 PHP
ThinkPHP中的三大自动简介
2014/08/22 PHP
PHP输入流php://input实例讲解
2015/12/22 PHP
PHP MVC框架中类的自动加载机制实例分析
2019/09/18 PHP
js prototype 格式化数字 By shawl.qiu
2007/04/02 Javascript
JavaScript高级程序设计阅读笔记(十六) javascript检测浏览器和操作系统-detect.js
2012/08/14 Javascript
防止登录页面出现在frame中js代码
2014/07/22 Javascript
Easyui 之 Treegrid 笔记
2016/04/29 Javascript
原生JS查找元素的方法(推荐)
2016/11/22 Javascript
JS键盘版计算器的制作方法
2016/12/03 Javascript
详谈ES6中的迭代器(Iterator)和生成器(Generator)
2017/07/31 Javascript
Angular中支持SCSS的方法
2017/11/18 Javascript
jQuery实现动态控制页面元素的方法分析
2017/12/20 jQuery
写gulp遇到的ES6问题详解
2018/12/03 Javascript
videocapture库制作python视频高速传输程序
2013/12/23 Python
轻松理解Python 中的 descriptor
2017/09/15 Python
Python Numpy 数组的初始化和基本操作
2018/03/13 Python
Python使用min、max函数查找二维数据矩阵中最小、最大值的方法
2018/05/15 Python
Python Numpy库安装与基本操作示例
2019/01/08 Python
将python文件打包成EXE应用程序的方法
2019/05/22 Python
python之mock模块基本使用方法详解
2019/06/27 Python
Python进度条的制作代码实例
2019/08/31 Python
python爬虫搭配起Bilibili唧唧的流程分析
2020/12/01 Python
Python实现区域填充的示例代码
2021/02/03 Python
canvas之万花筒效果的简单实现(推荐)
2016/08/16 HTML / CSS
尤妮佳moony海外旗舰店:日本殿堂级纸尿裤品牌
2018/02/23 全球购物
安全教育感言
2014/03/04 职场文书
小学课外活动总结
2014/07/09 职场文书
2015年司机年终工作总结
2015/05/14 职场文书
2015年中学图书馆工作总结
2015/07/22 职场文书
企业法律事务工作总结
2015/08/11 职场文书
小学英语课教学反思
2016/02/15 职场文书
优秀新员工事迹材料
2019/05/13 职场文书
Django数据库(SQlite)基本入门使用教程
2022/07/07 Python