在没有参考的情况下获取由脚本创建的元素

Posted

技术标签:

【中文标题】在没有参考的情况下获取由脚本创建的元素【英文标题】:Get an element created by a script in react without ref 【发布时间】:2022-01-21 00:55:42 【问题描述】:

我有一个由脚本创建的聊天按钮(zendesk 聊天)。它会在页面中生成一个 ID 为“launcher”的 iframe。 我正在使用 Nextjs 并尝试获取此元素,但由于没有代码,因此无法附加参考。 我正在网上挖掘解决方案,我已经尝试过类似的方法(在页脚组件中,因为它在所有页面上,我能够弄清楚我在哪个页面上):

React.useLayoutEffect(() => 
    function checkElExist() 
      if (typeof document !== 'undefined') 
        const el = document.querySelector('#launcher');
        if (!isSingleVehiclePage) 
          console.log('NOT VEHICLE', el);
          if (el) 
            el.classList.remove('inVehicle');
            el.classList.add('notInVehiclePage');
          
         else 
          console.log('IN VEHICLE', el);
          if (el) 
            el.classList.remove('notInVehiclePage');
            el.classList.add('inVehicle');
          
        
      
    
    window.addEventListener('load', checkElExist);
    return () => window.removeEventListener('load', checkElExist);
  , [isSingleVehiclePage]);

我不知道是否是正确的解决方案。它有点工作,但有时该元素为空,特别是当我从外部链接进入该特定页面时(而不是在我浏览网站时)。 有没有可能得到这个元素?我的目标是根据特定页面添加/删除一个类。

谢谢

编辑:我不知道它是否相关,但在 html 中,iframe 不在我的“__next”div 中。在下图中,我圈出了 __next div、footer div(执行我的 useLayoutEffect 代码的地方)和我想要获取的 iframe。

【问题讨论】:

【参考方案1】:

已解决: 我使用一个每 1000 毫秒递归运行一次的函数。如果在 9000 毫秒内找不到元素,则停止。

React.useEffect(() => 
    waitForElementToDisplay(
      '#launcher',
      function (el: any) 
        checkElExist(el);
      ,
      1000,
      9000
    );
    function checkElExist(el: any) 
      if (!isSingleVehiclePage) 
        console.log('NOT VEHICLE', el);
        el.classList.remove('inVehicle');
        el.classList.add('notInVehiclePage');
       else 
        console.log('IN VEHICLE', el);
        el.classList.remove('notInVehiclePage');
        el.classList.add('inVehicle');
      
    
  , [isSingleVehiclePage]);

function waitForElementToDisplay(
    selector: string,
    callback: any,
    checkFrequencyInMs: number,
    timeoutInMs: number
  ) 
    const startTimeInMs = Date.now();
    (function loopSearch() 
      if (document && document.querySelector(selector) != null) 
        console.log('found');
        const element = document.querySelector(selector);
        callback(element);
        return;
       else 
        setTimeout(function () 
          if (timeoutInMs && Date.now() - startTimeInMs > timeoutInMs) return;
          loopSearch();
        , checkFrequencyInMs);
      
    )();
  

【讨论】:

以上是关于在没有参考的情况下获取由脚本创建的元素的主要内容,如果未能解决你的问题,请参考以下文章

Dart - 如何在没有元素的情况下获取 Iterable 元素的`runtimeType`?

JAXB XML;如何在不需要创建元素的 pojo 的情况下获取元素的属性?

在没有很多 jQuery 请求的情况下获取传递的元素属性和属性

如何在脚本中获取进程ID

如何使用 BigQuery 在没有每个元素的情况下获取所有总和值?

在没有 getBoundingClientRect 的情况下获取相对于文档的元素偏移量(Webkit 错误)