小程序检测元素首次出现在可视区域上报埋点遇到的问题 createIntersectionObserver

背景

有一个商品的介绍页面,按照头图+内容的样式排列,头图高度不固定,内容高度不固定,检测到用户可以看到内容部分的时候进行一次上报。

遇到的问题:

1、加了检测元素出现在可视区域的方法不生效
2、解决了不生效的问题之后,发现头图大加载慢的时候,内容部分会先加载一闪而过,用户其实没看到内容,但是检测的结果是内容出现到了可视区域
3、切换页面,卸载observer不生效

环境

使用的框架:vue2+taro3

解决办法

问题1:检测方法必须写到onReady方法里面,等页面加载完毕

问题2:加个定时器,500ms之后再加载

问题3:必须在onUnload方法里面卸载

完整代码

最后赋上代码

<script>
import Taro from '@tarojs/taro'
export default {
  data () {
    return {
      observer: null, // 监听元素是否进入可视区域
      timer: null
    }
  },
  onReady () {
  // 记录食谱内容是否曝光
    this.timer = setTimeout(() => {
      this.queryElement()
      clearTimeout(this.timer)
      this.timer = null
    }, 500)
  },
  onUnload () {
    this.disconnectObserver()
  },
  methods: {
    /**
     * @description 停止观察并销毁 observer 实例
     */
    disconnectObserver () {
      if (this.observer) {
        this.observer.disconnect()
        this.observer = null
      }
    },
    /**
     * @description 检测元素是否加载
     */
    queryElement () {
      Taro.createSelectorQuery().select('.recipe-detail-info__card').boundingClientRect().exec((res) => {
        if (res && res[0]) {
          this.setupObserver()
        } else {
          console.error('Element not found.')
        }
      })
    },
    /**
     * @description 检测元素是否出现在可视区域
     */
    setupObserver () {
      this.observer = Taro.createIntersectionObserver()
      this.observer.relativeToViewport({
        bottom: -100
      }).observe('.recipe-detail-info__card', (res) => {
        if (res.intersectionRatio > 0) {
          // 上报埋点
          this.disconnectObserver()  //这里加是因为只想首次上报,如果实时上报可以不清除
        }
      })
    }
  }
}
</script>

使用 `createIntersectionObserver` 方法可以创建一个 IntersectionObserver 对象,用于观察某个节点与其祖先节点或 viewport 的交叉状态。在 scroll-view 内获取当前可视元素的步骤如下: 1. 在 wxml 文件中,给 scroll-view 组件设置一个唯一的 id,例如: ```html <scroll-view id="my-scroll-view" scroll-y="true"> <!-- scroll-view 内容 --> </scroll-view> ``` 2. 在 js 文件中,使用 `createIntersectionObserver` 方法创建一个 IntersectionObserver 对象,并指定监听的节点为 scroll-view 组件。如下所示: ```javascript const observer = wx.createIntersectionObserver(this, { observeAll: true, // 是否同时观察所有节点 thresholds: [0.5], // 相交比例阈值 }); observer.relativeTo('#my-scroll-view'); // 相对节点为 scroll-view 组件 ``` 3. 监听节点的相交状态变化。在 `relativeTo` 方法后面,可以使用 `observe` 方法监听某个节点的相交状态变化。如下所示: ```javascript observer.observe('.my-element', (res) => { console.log(res); // res.intersectionRatio 表示节点相交比例,res.boundingClientRect 表示节点的位置和大小等信息 }); ``` 其中,`.my-element` 为需要监听的节点的 CSS 选择器,可以是任何元素。 4. 注意事项: - 由于 scroll-view 内的元素是动态加载的,因此需要在元素加载完成后再进行监听。可以使用 `wx.nextTick()` 方法或者 `setData()` 方法的回调函数来实现。 - 如果需要同时观察多个节点,可以在 `relativeTo` 方法中指定多个节点的 CSS 选择器,或者使用 `observeIntersection` 方法来监听所有节点的相交状态变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值