首页 > 其他分享 >可观测性系统中对用户行为如何记录的一些简单介绍

可观测性系统中对用户行为如何记录的一些简单介绍

时间:2024-01-27 16:03:42浏览次数:20  
标签:记录 text 用户 element 获取 userProgrammaticAttribute 事件 var 观测

本文仅讨论核心代码的技术实现思路,以及从代码中看出来的一些内容,涉及到的内容基本包含以下四个文件

  • rumEventCollection
  • actionCollection
  • getActionNameFromElement
  • listenActionEvents
  • trackClickAction

可观测性系统中对用户行为如何记录的一些简单介绍_事件处理

以下内容,方便用户了解,我做了一些整理,包括精华代码部分。

监听

事件获取的前提第一步是监听,有关click事件,比较简单,就不在本文进行讨论:

var listeners = [ addEventListener(),]

根据监听的事件,就要考虑监听哪些事件,除了click事件,还有:

  • POINTER_DOWN
  • SELECTION_CHANGE
  • POINTER_UP
  • INPUT

可观测性系统中对用户行为如何记录的一些简单介绍_ide_02

其中addEventListener的入参有几项:

  • eventTarget,也就是dom元素
  • event,也就是事件
  • listener
  • options

其中代码逻辑如下,我们看到还是回归到了添加监听事件后的处理上,

export function addEventListener(eventTarget, event, listener, options) {
  return addEventListeners(eventTarget, [event], listener, options)
}

事件处理

其中有关addEventListeners,首先是非空验证isSelectionEmpty(),其次就是事件处理代码,分别是:

  • onPointerDown---->processPointerDown
  • userActivity.selection = true
  • onPointerUp---->startClickAction
  • userActivity.input = true

看到这里基本事件处理就结束了。

事件名称

接下来是事件名称的获取,这里也不讨论兼容性等,目前主要的方法是getActionNameFromElement。这个方法主要有以下两个内容点:

  • getActionNameFromElementProgrammatically
  • getActionNameFromElementForStrategies

这样分的考虑在于是否能直接从元素中获取actionName:第一个是能直接从元素中获取actionName,第二个是不能直接从元素中获取actionName。

直接获取actionName

因为dom元素和嵌套的方式是千奇百怪的,所以这里需要考虑元素和元素的parent。

getActionNameFromElementProgrammatically(
      element,
      DEFAULT_PROGRAMMATIC_ACTION_NAME_ATTRIBUTE
    ) ||
    (userProgrammaticAttribute &&
      getActionNameFromElementProgrammatically(
        element,
        userProgrammaticAttribute
      )) ||
    getActionNameFromElementForStrategies(
      element,
      userProgrammaticAttribute,
      priorityStrategies
    ) ||
    getActionNameFromElementForStrategies(
      element,
      userProgrammaticAttribute,
      fallbackStrategies
    ) ||
    ''
  )

有关元素中哪些属性是直接从element中获取的呢?基本都能数出来,所以这里就不赘述了。

不能直接获取actionName

function getActionNameFromElementForStrategies(
  targetElement,
  userProgrammaticAttribute,
  strategies
) {
  var element = targetElement
  var recursionCounter = 0
  while (
    recursionCounter <= MAX_PARENTS_TO_CONSIDER &&
    element &&
    element.nodeName !== 'BODY' &&
    element.nodeName !== 'HTML' &&
    element.nodeName !== 'HEAD'
  ) {
    for (var i = 0; i < strategies.length; i++) {
      var strategy = strategies[i]
      var name = strategy(element, userProgrammaticAttribute)
      if (typeof name === 'string') {
        var trimmedName = name.trim()
        if (trimmedName) {
          return truncate(normalizeWhitespace(trimmedName))
        }
      }
    }
    // Consider a FORM as a contextual limit to get the action name.  This is experimental and may
    // be reconsidered in the future.
    if (element.nodeName === 'FORM') {
      break
    }
    element = element.parentElement
    recursionCounter += 1
  }
}

其中最后一个参数 策略 ,这里有两点:

  • priorityStrategies
  • fallbackStrategies

这里只有针对的拿出几个点来说明,非button类,可能获取哪些内容:

  • alt
  • name
  • title
  • palceholder在上述策略中,兜底的是纯文本内容,该如何获取:
function getTextualContent(element, userProgrammaticAttribute) {
  if (element.isContentEditable) {
    return
  }

  if ('innerText' in element) {
    var text = element.innerText

    var removeTextFromElements = function (query) {
      var list = element.querySelectorAll(query)
      for (var index = 0; index < list.length; index += 1) {
        var _element = list[index]
        if ('innerText' in _element) {
          var textToReplace = _element.innerText
          if (textToReplace && textToReplace.trim().length > 0) {
            text = text.replace(textToReplace, '')
          }
        }
      }
    }

    if (!supportsInnerTextScriptAndStyleRemoval()) {
      // remove the inner text of SCRIPT and STYLES from the result. This is a bit dirty, but should
      // be relatively fast and work in most cases.
      removeTextFromElements('script, style')
    }

    // remove the text of elements with programmatic attribute value
    removeTextFromElements(
      '[' + DEFAULT_PROGRAMMATIC_ACTION_NAME_ATTRIBUTE + ']'
    )

    if (userProgrammaticAttribute) {
      removeTextFromElements('[' + userProgrammaticAttribute + ']')
    }

    return text
  }

  return element.textContent
}

到这里基本核心代码都覆盖到了,仅仅有一些小点,比如事件报错、元素判断,因为篇幅,就不在本文介绍,不过相关代码还是可以看看的,比如

判断事件

function isValidPointerEvent(event) {
  return (
    event.target instanceof Element &&
    // Only consider 'primary' pointer events for now. Multi-touch support could be implemented in
    // the future.
    event.isPrimary !== false
  )
}

获取事件名称中,循环遍历父亲节点时的终止条件:

while (
    recursionCounter <= MAX_PARENTS_TO_CONSIDER &&
    element &&
    element.nodeName !== 'BODY' &&
    element.nodeName !== 'HTML' &&
    element.nodeName !== 'HEAD'
  )

当然,本文没有讲到自定义事件的收集,这部分比较简单,我把代码粘贴出来,就不做讨论了。

addAction: function (name, context) {
      addActionStrategy({
        name: name,
        context: deepClone(context),
        startClocks: clocksNow(),
        type: ActionType.CUSTOM
      })
    },

标签:记录,text,用户,element,获取,userProgrammaticAttribute,事件,var,观测
From: https://blog.51cto.com/u_12003135/9443881

相关文章

  • 可观测性之删库跑路后的现场还原
    数据库是公司重要资产,在此类重要资产平台上,尤其是重要操作,应该保持敬畏心。数据库被删了?可怎么证明是某某某删了数据库?或者根本都不知道谁删除了数据库,又没抓现行,该怎么办?正文第一步证据先行,有录屏有真相删库动作的录制回放录制回放让团队能清楚了解和学习用户路径和行为,其中对于......
  • 可观测性之如何识别网站文件命中了缓存?
    为了告慰良心,webdeveloper搞了可视化、组件化、工程化、微前端、低代码。网站平均加载时间依然客死在2s内。讲的是如何判断网站使用的文件是缓存,有关使用的本地存储数据(ls、ss等)不在讨论范围。说清楚范围后,说一下分类,这里的文件缓存有两类,第一类是:diskcachememorycache这里的缓......
  • 可观测性之到底卡在了哪里,2023年再撒谎网慢就说不过去了
    前言互联网下行带来灵魂追问。钱花哪去了?产出在哪里?动辄自建的遮羞布逐步显现,不过自建的成本可能还不是最大的负担,掣肘的可能是把不重要的事情当成了主业来做,比如:互联网+比如数字化转型比如研发效率和devops比如可观测性本次要“安利”的新功能叫做应用Span请求耗时分布显示,建议......
  • 扪心自问,我们在真实用户旅程的投入有多匮乏?
    做事情,“科学精准”的态度在面对是否直接吃药这个问题上,很多人画了草图,认为直接吃药。根据梅奥公开的诊断流程,针对可能新冠的儿童我们应该:根据梅奥公开的诊断流程,针对成人我们应该:写作背景15年一直再看流程图,前两天看到有关国外针对新冠的路径图,正好有小伙伴问,如何做故障的根因分......
  • 可观测性之讲解用户行为分析的推荐书单和总结
    技术文延迟了本来计划参加活动的还有一篇,应该是一篇技术翻译文,但是那篇文章太难了,看我过我以往文章的同学,应该能理解,我的文章很少有3000字数以下的,而且如果不是来自谷歌(主要因为是内容都反复被验证过,其次公开资料也不存在内容侵权),就一定会是我自己的一些想法或者吐槽,而且大多都不仅......
  • 期权一张纸-不争连纸都没有-立足当下-观测未来-33岁前端程序员年终总结
    文章基本按照时间顺序,约5千字,内容讲的是:一场意外被辞,一场说走就走的旅游,一份5年亲密陪伴,下水捞过鱼,吃了“金蝉子”,野外路过营,举办了几次技术直播,我会简单陈述一下2022,希望明年总结能有一些精彩。因为是参赛文章,所以希望您能点赞、评论、转发或者评论666离职背景程序员被忽悠,期权大......
  • 在测试过程中引入可观测性平台提升业务质量
    作者观测云产品技术专家成都办公室-刘跃兰前言随着微服务技术的发展,微服务概念已深入人心,越来越多的企业开始使用微服务架构来开发业务应用。业务应用系统的整体架构变得更加复杂,并存在各种各样的不确定性因素,从而对质量保障,以及相应的测试工作带来了巨大挑战。因此,在这样的背......
  • 新时代监控系统中必不可少的基础功能-观测云
    观测云用户体验中的基础功能(自定义tag、错误、事件)存在一些特定场景,需要通过设置不同类型的标识去定位分析一些数据,所以针对这些情况,RUMSDK提供了一些特定的API方便用户在自己的应用系统中,加入自己特定的逻辑:自定义标识用户(ID、name、email)自定义添加额外的数据TAG自定义添加A......
  • 洞察驱动增长:数字化转型中的用户行为分析与优化策略
    文末给出一个用户行为分析的案例在数字化转型中,越来越多的企业认识到对用户的实时深入洞察,以及数据资产的沉淀已成为业务增长的重要引擎。用户行为结合场景带来的用户洞察和业务增长带来新的可能,是每一个做管理、营销、运营的人都应该深入了解和探究的。分析用户行为,优化用户体验使......
  • Linux命令:userdel 删除用户账户
    userdel命令使用1.删除用户账户$sudouserdeluser12.删除用户账户,并删除用户『主目录』和『邮件』【-r/--remove】$sudouserdel-ruser19$sudouserdel--removeuser203.强制删除用户账户【-f/--force】$sudouserdel-fuser1$sudouserdel--force......