前端监控sdk开发(五)白屏检测

引言

在前端开发中,监控用户体验是非常重要的一项工作。其中,检测页面是否白屏是一个关键的指标,它可以帮助我们及时发现页面加载问题,提升用户体验。本文将介绍前端监控SDK中如何检测页面是否白屏的方式。

具体实现

基于DOM元素检测:通过判断页面中是否存在指定的DOM元素来确定页面是否白屏。可以选择一个常见的元素,如<html>或者<body>,然后在页面加载完成后检查该元素是否存在。如果不存在,则说明页面可能出现了白屏问题。

js 复制代码
export function blankScreen() {
  // 定义需要检查的包裹元素
  let wrapperElements = ['html', 'body', '#container', '.content']
  // 记录空白点数
  let emptyPoints = 0

  // 获取元素的选择器
  function getSelector(element) {
    if (element?.id) {
      return '#' + id
    } else if (element?.className) {
      return (
        '.' +
        element.className
          .split(' ')
          .filter((item) => !!item)
          .join('.')
      )
    } else {
      return element?.nodeName.toLowerCase()
    }
  }

  // 判断元素是否为包裹元素
  function isWrapper(element) {
    let selector = getSelector(element)
    if (wrapperElements.indexOf(selector) !== -1) {
      emptyPoints++
    }
  }

  onload(function () {
    // 检查屏幕的点,分别为横向和纵向的点
    for (let i = 1; i <= 9; i++) {
      let xElements = document.elementsFromPoint(
        (window.innerWidth * i) / 10,
        window.innerHeight / 2
      )
      let yElements = document.elementsFromPoint(
        window.innerWidth / 2,
        (window.innerHeight * i) / 10
      )

      isWrapper(xElements[0])
      isWrapper(yElements[0])
    }

    // 如果空白点数超过16个,表示屏幕为空白
    if (emptyPoints > 16) {
      let centerElements = document.elementsFromPoint(
        window.innerWidth / 2,
        window.innerHeight / 2
      )
      tracker.send({
        kind: 'stability',
        type: 'blank',
        emptyPoints,
        screen: window.screen.width + '*' + window.screen.height,
        viewPoint: window.innerWidth + '*' + window.innerHeight,
        selector: getSelector(centerElements[0])
      })
    }
  })
}
  1. 定义需要检查的包裹元素:通过定义一个数组 wrapperElements,包含需要检查的元素选择器,如 htmlbody#container.content 等。

  2. 记录空白点数:定义一个变量 emptyPoints,用于记录空白点数。

  3. 获取元素的选择器:定义一个函数 getSelector(element),用于根据元素的属性(id、className)获取其选择器。

  4. 判断元素是否为包裹元素:定义一个函数 isWrapper(element),用于判断传入的元素是否为包裹元素。如果是,则将空白点数加一。

  5. 页面加载完成后执行操作:使用 onload 函数,在页面加载完成后执行以下操作。

  6. 检查屏幕的点:通过循环遍历横向和纵向的点,使用 document.elementsFromPoint() 方法获取该点上最上层的元素。

  7. 判断获取到的元素是否为包裹元素:调用 isWrapper() 函数判断获取到的横向和纵向元素是否为包裹元素。

  8. 如果空白点数超过16个,表示屏幕为空白:如果空白点数超过16个,则表示屏幕为空白。此时,使用 document.elementsFromPoint() 方法获取屏幕中心点上最上层的元素,并将相关信息发送给追踪器(tracker)进行记录。

这种实现方式通过检查屏幕上的点来判断页面是否为空白。通过定义需要检查的包裹元素、记录空白点数、获取元素的选择器以及判断元素是否为包裹元素等步骤,可以有效地检测页面是否为空白,并进行相应的追踪和记录。

onload.js

一个用于在页面加载完成后执行回调函数的函数。它通过检查 document.readyState 属性来确定页面是否已经完全加载。

js 复制代码
export default function (callback) {
  if (document.readyState === 'complete') {
    callback()
  } else {
    window.addEventListener('load', callback)
  }
}

通过判断 document.readyState 是否等于 'complete' 来确定页面是否已经完全加载。

  • 如果页面已经完全加载,则直接执行回调函数。
  • 如果页面还未完全加载,则使用 window.addEventListener 方法监听 'load' 事件,并在事件触发时执行回调函数。 这样,无论是在页面已经完全加载时还是在页面加载完成后,都能确保回调函数被执行。

总结

通过前端监控SDK实现对白屏的监控和优化是前端开发中的重要工作之一。基于DOM元素检测简单直观,但可能存在误判的情况。

还有其他的白屏检测的方式:

  1. 基于性能指标检测:通过监控性能指标来判断页面是否白屏。可以使用Performance API来获取关键性能指标,如首次渲染时间、首次可交互时间等。如果这些指标超过了预设的阈值,则说明页面可能出现了白屏问题。

  2. 基于截图比对检测:通过对比当前页面的截图和预设的空白页面截图来判断页面是否白屏。可以使用HTML5的Canvas API来实现页面截图功能,并使用图像处理算法进行比对。如果两张截图相似度超过了预设的阈值,则说明页面可能出现了白屏问题。

相关推荐
tedcloud1232 小时前
UI-TARS-desktop部署教程:构建AI桌面自动化系统
服务器·前端·人工智能·ui·自动化·github
UXbot5 小时前
AI原型设计工具如何支持团队协作与快速迭代
前端·交互·个人开发·ai编程·原型模式
ZC跨境爬虫5 小时前
跟着MDN学HTML_day_48:(Node接口)
前端·javascript·ui·html·音视频
PieroPc7 小时前
CAMWATCH — 局域网摄像头监控系统 Fastapi + html
前端·python·html·fastapi·监控
巴巴博一8 小时前
2026 最新:Trae / Cursor 一键接入 taste-skill 完整教程(让 AI 前端告别“AI 味”)
前端·ai·ai编程
kyriewen8 小时前
半夜三点线上崩了,AI替我背了锅——用AI排错,五分钟定位三年老bug
前端·javascript·ai编程
kyriewen8 小时前
我让 AI 当了 24 小时全年无休的“毒舌考官”
前端·ci/cd·ai编程
hexu_blog9 小时前
vue+java实现图片批量压缩
java·前端·vue.js
IT_陈寒9 小时前
为什么你应该学习JavaScript?
前端·人工智能·后端
lifejump9 小时前
Empire(帝国)CMS 7.5 XSS注入
前端·安全·xss