jquery 如何侦测元素可见性何时变更(不仅是可见,而且可见/隐藏)

7kjnsjlb  于 2022-11-22  发布在  jQuery
关注(0)|答案(1)|浏览(174)

如何检测页面中的元素何时更改可见性?
请把问题念好。

它不仅是对:visible伪选择器(与display: none匹配)的引用,而且是对visibility可见/隐藏的引用。

经过一些搜索,你可以发现有一个插件,这样做的工作.
下面是代码片段:
第一个
但是它只适用于:visible伪选择器(不适用于visibility可见/隐藏),并且如果您尝试将选择从单个元素$("#test_hidden")扩展到类$(".class")或页面$("*")中的每个元素,则它不能很好地工作。
那么,最后,如何检测页面元素何时改变可见性呢?
有一种方法可以修改它,也 checkout elem.css("visibility","hidden") == true,并为所有元素$("*")启用它,或者还有其他方法可以得到所需的结果?

kwvwclae

kwvwclae1#

下面 是 一 个 示例 , 说明 如何 监控 内联 样式 以及 内部 或 外部 样式 表 的 CSS visibility 更改 。 您 可以 注解 掉 任何 部分 ( 内联/内部/外部 ) , 以 查看 它 是否 专门 使用 该 方法 。
注意 , 并 不是 所有 的 浏览 器 都 支持 这种 方式 , 因为 IntersectionObserver 构造 函数 中 的 trackVisibility 选项 只 得到 有限 的 支持 。 而且 , 这种 方式 计算 可见 性 的 开销 更 大 ( 虽然 可能 比 window.getComputedStyle 的 轮询 开销 小 ) , Chrome 会 在 控制 台 中 提供 以下 警告 :
可见 性 的 计算 比 基本 交点 的 计算 更 昂贵 ;启用 此 选项 可能 会 对 页面 的 性能 产生 负面 影响 。 请 确保 在 启用 " trackVisibility " 选项 之前 您 * 确实 * 需要 可见 性 跟踪 。

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>SO Detect CSS visibility changes</title>
  </head>
  <style>
    #div {
      visibility: visible;
    }
  </style>
  <body>
    <div id="div">I use visibility CSS</div>
    <div>I do not use visibility CSS</div>
    <script type="module">
      const style = document.createElement('style')
      const link = document.createElement('link')
      const div = document.getElementById('div')
      const mutationObserver = new MutationObserver((mutations) => {
        const visibility = window
          .getComputedStyle(mutations[0].target)
          .getPropertyValue('visibility')

        if (visibility === 'hidden') {
          console.log('[MO]: element is hidden')
        }

        if (visibility === 'visible') {
          console.log('[MO]: element is visible')
        }
      })
      const intersectionObserver = new IntersectionObserver((entries) => {
        const isVisible = entries[0].isVisible

        if (isVisible) {
          console.log('[IO]: element is visible')
        } else {
          console.log('[IO]: element is hidden')
        }
      }, {
        // Supported in Chrome
        trackVisibility: true,
        delay: 100
      })

      // Respond to visibility changes that are handled via inline CSS
      mutationObserver.observe(div, {
        attributes: true,
        attributeFilter: ['style']
      })
      // Respond to visibility changes that are handled via internal/external CSS stylesheets
      intersectionObserver.observe(div)

      // Hide visibility
      setTimeout(() => {
        // Inline styles
        div.style.visibility = 'hidden'

        // Internal Stylesheet
        style.id = 'style'
        style.innerText = `
          #div {
            visibility: hidden;
          }
        `
        document.head.append(style)

        // External Stylesheet
        link.id = 'link'
        link.href = './styles.css'
        link.rel = 'stylesheet'
        //document.head.append(link)

        // Unhide visibility
        setTimeout(() => {
          document.getElementById('style').remove()
          //document.getElementById('link').remove()
          div.style.visibility = 'visible'
        }, 2000)
      }, 1000)
    </script>
  </body>
</html>

中 的 每 一 个
基本 上 , 这 相当于 :

  • 使用 MutationObserver 检测 对 visibility 的 内联 更改 。
  • 对于 包含 观察 目标 的 visibility 值 的 内部 和 外部 样式 表 , 请 使用 IntersectionObservertrackVisibility 选项 ( 在 支持 的 浏览 器 中 ) 。

这里 有 一 个 关于 CodeSandbox 的 例子 。

相关问题