javascript - 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 执行脚本
解决方案
您可以使用 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。也许考虑添加最大尝试次数。
推荐阅读
- php - 使用 PHP 获取访客 IP 地址不起作用
- vba - VBA - 迷你图 - 单步执行和运行代码时的不同结果
- algorithm - 二叉搜索树,我应该如何旋转这棵树来平衡
- bash - 使用 Curl 数据二进制选项,内存不足
- android - 使用文件浏览器对话窗口访问资产文件夹文件
- typescript - 一种更清洁的方式,如何重构异步调用
- vue.js - 如何在动态加载的数据下动态地在 Vue.js 中进行计算
- python-2.7 - 如何从 purchase.order 中获取产品描述的值
- swift - swift - 在变量名中使用整数 for 循环
- amazon-ec2 - www 和 http 在 AWS 中有效,但不是 https