Intersection Observer API 提供了一种异步检测目标元素与祖先元素或 viewport 相交情况变化的方法。 过去,要检测一个元素是否可见或者两个元素是否相交并不容易,很多解决办法不可靠或性能很差。然而,随着互联网的发展,这种需求却与日俱增,比如,下面这些情况都需要用到相交检测:

    • 图片懒加载——当图片滚动到可见时才进行加载
    • 内容无限滚动——也就是用户滚动到接近内容底部时直接加载更多,而无需用户操作翻页,给用户一种网页可以无限滚动的错觉
    • 检测广告的曝光情况——为了计算广告收益,需要知道广告元素的曝光情况
    • 在用户看见某个区域时执行任务或播放动画
    1. function exposeHomeZpt(){
    2. var zptList = $('#home_zpt li')
    3. if(IntersectionObserver){
    4. var io = new IntersectionObserver((entries) =>{
    5. for(var k = 0; k < entries.length;k++){
    6. if(entries[k].intersectionRatio >= 0.5){
    7. reportLog({
    8. "resource_type":"zpt",
    9. "resource_id":entries[k].target.getAttribute('data-zptid'),
    10. "event_type":"display",
    11. "event_extend":{
    12. "request_id": entries[k].target.getAttribute('data-requestid'),
    13. "from": "首页-推荐"
    14. }
    15. })
    16. io.unobserve(entries[k].target)
    17. }
    18. }
    19. }, {
    20. threshold: 0.5,
    21. })
    22. zptList.each(function(){
    23. io.observe(this)
    24. })
    25. }
    26. }
    27. function reportLog(data){
    28. $.ajax({
    29. url: AppOrigin + "/log",
    30. type: 'POST',
    31. cache: false,
    32. data: JSON.stringify(data),
    33. contentType: 'application/json; charset=utf-8',
    34. processData: false
    35. })
    36. }