首页 > 解决方案 > JavaScript - getElementById 在特定页面上不起作用

问题描述

我想自动点击 Google cookie 政策的同意按钮。
(我在关闭标签后清理 cookie,我不想创建谷歌帐户,所以每次使用谷歌时都会被问到)

有一个 ID 为“introAgreeButton”的 div 元素,我正在尝试使用我的脚本访问它:

<div role="button" id="introAgreeButton" [...]></div>

但是,document.getElementById('introAgreeButton') 始终返回 null。

我的第一个想法是在我的函数执行时元素没有加载。但是如果我在 window.onload 上执行它,或者即使我在循环中运行它直到元素肯定存在,它也不起作用:

window.onload = function() {  
  var x = document.getElementById('introAgreeButton')
  console.log(x)
}

输出:
null

function loop() { 
  var x = document.getElementById('introAgreeButton')  
  if (x) {
    console.log('success')
  } else {
    loop()
  }
}

输出:
null
null
null
...

可以在https://www.google.com/search?hl=en&q=test上测试

任何人都知道这是为什么以及如何解决它?

编辑:我通过浏览器扩展 TamperMonkey 执行脚本

标签: javascripthtmlgetelementbyid

解决方案


您可以使用 setInterval 来检查元素是否在 DOM 中呈现,如下所示:

document.addEventListener('DOMContentLoaded', function () {
    var intervalID = null;

    function checkElementInDOM () {
        var element = document.getElementById('introAgreeButton');
    
        if (element) {
            clearInterval(intervalID);

            // DO YOUR STUFF HERE ...
        }
    }

    intervalID = setInterval(checkElementInDOM, 100);
});

但是,要智能地使用,以免有一个连续工作的 setInterval。也许考虑添加最大尝试次数。


推荐阅读