js如何实现元素曝光上报
更新时间:2019年08月07日 15:34:29 作者:rbin
这篇文章主要介绍了js如何实现元素曝光上报,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
进行数据上报的时候,经常会遇到列表数据曝光上报的问题,只对在当前可视范围内的数据内容进行曝光上报,而对于未在可视范围内的数据不进行曝光上报,等待用户滚动页面或者区域使元素出现在可视范围内时才进行曝光上报。
解决方案
目前针对此类问题,主要有两种解决方案。
方案一:监听页面或者区域scroll事件,通过getBoundingClientRect接口取元素的位置与可视窗口进行判断。
functionisElementInViewport(el) {
varrect = el.getBoundingClientRect();
varwidth_st = rect.width / 2,
height_st = rect.height / 2;
varinnerHeight = window.innerHeight,
innerWidth = window.innerWidth;
if( rect.top <=0 && rect.height > innerHeight
|| rect.left <= 0 && rect.width > innerWidth
) {
returnrect.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 ) )
);
}
varnodes = document.querySelectorAll(".item")
functionreport(node) {
// 上报的逻辑
}
window.onscroll = function() {
nodes.forEach(node => {
if( isElementInViewport(node) ) {
report(node)
}
})
}
优点:兼容性好
缺点:
需要关注页面或者区域的scroll事件
频繁的scroll事件,性能问题
方案二:通过 IntersectionObserver 监听元素是否处于可视范围
functionreport(node) {
// 上报的逻辑
}
varintersectionObserver = newIntersectionObserver(entries => {
entries.forEach(entry => {
if( entry.intersectionRatio > 0 ) {
report(entry.target)
}
})
})
varnodes = document.querySelectorAll(".item")
nodes.forEach(node => {
intersectionObserver.observe(node)
})
原文:js如何实现元素曝光上报_javascript技巧_脚本之家 (jb51.net)