亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

js如何實現元素曝光上報

2024-05-06 16:54:05
字體:
來源:轉載
供稿:網友

進行數據上報的時候,經常會遇到列表數據曝光上報的問題,只對在當前可視范圍內的數據內容進行曝光上報,而對于未在可視范圍內的數據不進行曝光上報,等待用戶滾動頁面或者區域使元素出現在可視范圍內時才進行曝光上報。

解決方案

目前針對此類問題,主要有兩種解決方案。

方案一:監聽頁面或者區域scroll事件,通過getBoundingClientRect接口取元素的位置與可視窗口進行判斷。

function isElementInViewport(el) {  var rect = el.getBoundingClientRect();  var width_st = rect.width / 2,    height_st = rect.height / 2;  var innerHeight = window.innerHeight,    innerWidth = window.innerWidth;  if (  rect.top <=0 && rect.height > innerHeight     || rect.left <= 0 && rect.width > innerWidth  ) {    return rect.left * rect.right <= 0      || rect.top * rect.bottom <= 0  }  return (      rect.height > 0     && rect.width > 0     && ( ( rect.top >= 0 && rect.top <= innerHeight - height_st )      || ( rect.bottom >= height_st && rect.bottom <= innerHeight ) )    && ( ( rect.left >= 0 && rect.left <= innerWidth - width_st )      || ( rect.right >= width_st && rect.right <= innerWidth ) )  );}var nodes = document.querySelectorAll(".item")function report(node) {  // 上報的邏輯}window.onscroll = function() {  nodes.forEach(node => {    if( isElementInViewport(node) ) {      report(node)    }  })  }

優點:兼容性好

缺點:

  • 需要關注頁面或者區域的scroll事件
  • 頻繁的scroll事件,性能問題

方案二:通過 IntersectionObserver 監聽元素是否處于可視范圍

function report(node) {  // 上報的邏輯}var intersectionObserver = new IntersectionObserver(entries => {  entries.forEach(entry => {    if( entry.intersectionRatio > 0 ) {      report(entry.target)    }  })})var nodes = document.querySelectorAll(".item")nodes.forEach(node => {  intersectionObserver.observe(node)})

優點:

  • 無須關注 scroll
  • 回調是異步觸發,不會頻繁觸發,性能好

缺點:兼容性不好?

實際上,針對兼容性問題,w3c 官方提供了對應 polyfill, 因此intersectionObserver用于生產是可行的。

總結

筆者在實際運用中,通過 IntersectionObserver 封裝了一個簡單的調用庫,應用于可視化埋點 sdk 中,用于解決元素曝光問題,如下

require('intersection-observer'); // polyfillclass Exposure {  constructor(callback) {    if (!callback || typeof callback !== 'function') {      throw new Error("need callback or selector param")      return    }    this.intersectionObserver = new IntersectionObserver((entries) => {      entries.forEach(item => {        if (item.intersectionRatio > 0) {          if (item.target) {            callback(item.target, item)            this.intersectionObserver.unobserve(item.target)          }        }      })    });  }  observe(selector, ignoreExposured) {    if (!this.intersectionObserver || !selector) {      return    }    let nodes = []    if( this.isDOM(selector) ) { // dom節點      nodes = [selector]    }else { // 選擇器      nodes = document.querySelectorAll(selector)    }    if (!nodes.length) {      return    }    nodes.forEach(node => {      if (!ignoreExposured && node.__wg__tracker__exposured__) {        return      }      node.__wg__tracker__exposured__ = true      // 開始觀察      this.intersectionObserver.observe(        node      );    })  }  disconnect() {    if (!this.intersectionObserver) {      return    }    this.intersectionObserver.disconnect()  }  isDOM(obj) {    if( !obj ) {      return false    }    if( typeof HTMLElement === 'object' ) {      return obj instanceof HTMLElement    }    if( typeof obj === 'object' && obj.nodeType === 1 && typeof obj.nodeName === 'string' ) {      return true    }    return false  }}export default Exposure

調用方法:

function report() {}var exposurer = new Exposure((node) => {  report(node)})exposurer.observe(".item)

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人美女av在线直播| 亚洲国产一区自拍| 最新国产精品拍自在线播放| 精品国产91乱高清在线观看| 亚洲天堂男人的天堂| 欧美亚洲伦理www| 亚洲男人的天堂在线| 国产精品激情自拍| 欧美性猛交xxxx免费看漫画| 国产精品一区二区性色av| 欧美日本精品在线| 亚洲视频视频在线| 2019中文字幕在线免费观看| 欧美www视频在线观看| 中文字幕欧美日韩| 一区二区欧美在线| 国产精品一区二区三区免费视频| 精品久久中文字幕久久av| 国产成人一区二区| 欧美日韩高清在线观看| 亚洲qvod图片区电影| 欧美精品videosex牲欧美| 美女久久久久久久| 丝袜美腿精品国产二区| 欧美理论电影在线观看| 国产精品免费一区| 日本道色综合久久影院| 欧美极品在线播放| 5566成人精品视频免费| 亚洲精品美女久久久| 亚洲激情在线观看视频免费| www.日韩系列| 日韩在线观看免费高清| 国产精品久久久999| 精品国产一区二区三区久久狼5月| 亚洲精品福利在线| 国产欧美日韩综合精品| 亚洲国产小视频在线观看| 成人激情黄色网| 91成人福利在线| 欧美在线影院在线视频| 国产精品久久久久999| 欧美激情乱人伦| 97久久精品人人澡人人爽缅北| 91中文精品字幕在线视频| 日韩欧美亚洲一二三区| 亚洲欧美日韩精品| 欧美亚洲视频在线看网址| 国产69精品久久久| 久久夜精品va视频免费观看| 精品久久中文字幕| 久久久久久久电影一区| 欧美精品在线免费| 日韩精品在线视频观看| 欧美成人精品影院| 亚洲国产精品成人精品| 久久99热精品| 成人免费视频xnxx.com| 91超碰中文字幕久久精品| 98视频在线噜噜噜国产| 久久久久久综合网天天| 成人精品在线观看| 日韩美女在线看| 亚洲第一男人天堂| 国产精品美女呻吟| 午夜精品国产精品大乳美女| 久久久久五月天| 亚洲2020天天堂在线观看| 伊人伊成久久人综合网小说| 欧美日韩精品在线播放| 96sao精品视频在线观看| 亚洲第一网站男人都懂| 一区二区欧美在线| 国产激情999| 精品视频中文字幕| 久久久视频免费观看| 日韩av手机在线看| 国产成人精品免费久久久久| 久久精品亚洲精品| 欧美一二三视频| 亚洲欧美制服综合另类| 欧美成人激情在线| 欧美激情精品久久久久久大尺度| 欧美另类99xxxxx| 国产精品偷伦一区二区| 国产精品久久久久aaaa九色| 川上优av一区二区线观看| 久久色在线播放| 精品视频一区在线视频| 亚洲日本中文字幕免费在线不卡| 欧美最顶级的aⅴ艳星| 亚洲精品电影网站| 国内精品模特av私拍在线观看| 97精品一区二区视频在线观看| 亚洲一区二区少妇| 欧美成人免费一级人片100| 亚洲精品国精品久久99热| 亚洲欧美日韩在线高清直播| 欧美亚洲国产成人精品| 国产精品99久久久久久久久久久久| 国产精品视频久久久久| 精品国产区一区二区三区在线观看| 日韩中文字幕在线观看| 中文字幕日韩av| 日韩久久免费电影| 日韩在线观看免费全| 日本精品视频在线观看| 日韩中文字幕av| 5252色成人免费视频| 欧美日韩亚洲网| 九色91av视频| 亚洲男子天堂网| 亚洲r级在线观看| 97超视频免费观看| xxxxxxxxx欧美| 夜夜嗨av一区二区三区四区| 欧美最猛性xxxxx(亚洲精品)| 欧美性猛交xxxx富婆弯腰| 亚洲综合中文字幕68页| 久久久久久伊人| 在线播放国产一区中文字幕剧情欧美| 91久久精品国产| 亚洲一区二区三区成人在线视频精品| 国产精品免费久久久久久| 精品国产福利在线| 欧美日产国产成人免费图片| 亚洲国产欧美一区二区丝袜黑人| 欧日韩不卡在线视频| 国产精自产拍久久久久久蜜| 久久久久一本一区二区青青蜜月| 2020久久国产精品| 久久精品国产电影| 亚洲人精选亚洲人成在线| 亚洲男女自偷自拍图片另类| 精品一区二区三区三区| 欧美成人久久久| 在线播放国产一区二区三区| 国产精品视频免费在线| 国产成人综合精品在线| 色偷偷噜噜噜亚洲男人的天堂| 国内自拍欧美激情| 亚洲欧美日本伦理| 国内精品久久久久久久久| **欧美日韩vr在线| 精品调教chinesegay| 黄色成人在线播放| 精品国内自产拍在线观看| 久久久久久久91| 亚洲肉体裸体xxxx137| 97精品在线观看| 国产亚洲精品综合一区91| 日本一区二区三区在线播放| 成人在线中文字幕| 91夜夜未满十八勿入爽爽影院| 国产视频精品免费播放| 欧美激情一区二区久久久| 亚洲色无码播放| 欧美裸体xxxx极品少妇软件| 精品久久久久久久久久ntr影视| 成人午夜在线视频一区| 成人激情视频在线| 日韩欧美在线第一页| 懂色av中文一区二区三区天美| 欧美另类极品videosbestfree|