Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript chrome扩展内容脚本无法按类获取元素_Javascript_Class_Google Chrome Extension_Google Chrome App - Fatal编程技术网

Javascript chrome扩展内容脚本无法按类获取元素

Javascript chrome扩展内容脚本无法按类获取元素,javascript,class,google-chrome-extension,google-chrome-app,Javascript,Class,Google Chrome Extension,Google Chrome App,请看屏幕截图: Iframe已最小化,因此您无法看到其任何子对象 目标div显示为iframe的子级,即使我们知道事实1 扩展的内容脚本 console.log( targetDiv ) // output: undefined 谷歌浏览器控制台 console.log( targetDiv ) // output: targetDiv 这怎么可能? 在这两种情况下,其他“正常”元素都会打印出来。 你能给我解释一下这个神奇的半子元素吗 更新:此div动态创建的setInterval

请看屏幕截图:

  • Iframe已最小化,因此您无法看到其任何子对象
  • 目标div显示为iframe的子级,即使我们知道事实1 扩展的内容脚本

    console.log( targetDiv )   // output: undefined
    
    谷歌浏览器控制台

    console.log( targetDiv )   // output: targetDiv
    
    这怎么可能? 在这两种情况下,其他“正常”元素都会打印出来。 你能给我解释一下这个神奇的半子元素吗


    更新:此div动态创建的setInterval修复了问题

    您需要确保在DOM中的元素之后加载脚本。尝试调试它,在
    控制台.log(targetDiv)
    上设置断点,并手动调查DOM。例如,此元素渲染可能会因某些内部脚本而延迟。在这种情况下,您可以实施一种轮询过程来及时检测此元素:

    const timer = setInterval(() => {
      const myElement = document.getElementById('my-element');
      if(myElement) {
        clearTimeout(timer);
        processMyElement(myElement);
      }
    }, 150);
    
    而不仅仅是

    const myElement = document.getElementById('my-element');
    processMyElement(myElement);
    

    一个简单的解决方案是在页面完全加载后运行脚本。比如:

    window.onload = function() {
       // run script
    };
    
    应该行得通


    但是,请注意,脚本将在所有图像和css完全加载和解析后运行。

    您的内容脚本仅在主页中运行,而控制台“上下文”选择器设置为iframe。如果iframe的contentDocument的来源相同,或者您需要在manifest.json中为内容脚本设置
    “all_frames”:true
    ,则需要手动访问iframe的contentDocument。我已经将all_frames设置为true。正如我在文章中所说,“其他元素在两种情况下都会打印出来。”内容scirpt也在iframe中打印出来,但没有定义。该div还用作ad的重定向。这就是为什么我要检测并删除它好吧,我不得不猜测,因为您没有提供URL来复制行为,所以我的另一个猜测是元素是动态添加的,您需要稍后使用MutationObserver或setInterval/setTimeout访问它。谢谢!设置间隔工作。。。嗯,这很愚蠢,因为我已经尝试使用setTimeout延迟2秒,但它不起作用。现在无法删除这些div,我可以手动删除,它们会在下次重新加载时消失,但从代码中我不能。有什么想法吗?@Lopol2010你什么意思
    myElement.style.display='none'
    在呈现元素后应该可以工作,例如,您也可以将其从DOM中完全删除。谢谢您的帮助。又是我的错。。。我试着删除这个元素,但我只能从那个里打印出来。所以我只需放置setInterval 100ms,并将元素完全移除。