chrome扩展:尽管运行了at:documentidle,js脚本还是过早启动
chrome extension: the js script fires too early despite run_at: document_idle
理论上,如果我设置run_at,我用来在页面上选择元素的.js应该在页面完全加载后激发。但事实并非如此。
在我的content.js中,我有
"content_scripts": [
{
"js": ["extensions/jquery-2.2.2.min.js", "content.js"],
"run_at": "document_idle"
}
]
在我的content.js中,我只需要:
alert("alert");
console.log("hello");
var fullname2 = $('#topcard').find('.profile-info').find('h1').text();
console.log(fullname2);
警报和第一个console.log都有效。第二个控制台日志没有记录任何内容,因为选择器无法选择任何内容。我知道这一点,因为如果我为content.js代码块添加setTimeout,并等待2秒,第二个控制台日志将正确显示fullname2。
你知道为什么content.js在页面完全加载之前就启动了,以至于选择器找不到任何东西吗?
run_at: "document_idle"
保证在DOMContentLoaded
事件之后执行脚本,该事件表示所有静态DOM内容都已解析并可用。
如果一个元素还不存在,这意味着它稍后将由页面自己的代码动态添加。
显然,Chrome无法预测页面何时(如果有的话)处于"完成"状态。您需要设置自己的标准(如"当#topcard
出现时")
话虽如此,你的策略应该如下:
-
检查元素是否已存在。如果是,处理它,你就完了。
-
为文档中的更改设置侦听器。这是通过
MutationObserver
s完成的,为了简单起见,我强烈推荐使用mutation-summary
库。
相关文章:
- chrome扩展:尽管运行了at:documentidle,js脚本还是过早启动
- JQuery添加元素需要在我的js之前再次添加JQuery脚本
- 当脚本由system.js加载时,如何要求('electron')
- 如何在运行时在angular 2中加载外部js脚本
- 使用JS在服务器上运行PHP脚本
- 将脚本缓存到本地存储的basket.js概念仍然是一个好主意吗
- 如何将模板中的标记脚本移动到.js文件中
- 通过浏览器加载页面时触发加载脚本(js或jQuery)'s”;返回“;作用
- 按顺序加载脚本.js和使用.js
- 在节点中运行 python 脚本.js语法错误
- 未捕获的类型错误:无法读取未定义的属性“indexOf”(观察者脚本.js)
- PHP 无法调用 shell 脚本 (js -> php -> sh)
- 未调用脚本 JS
- D3中的脚本.js使Chrome崩溃
- “不允许加载本地资源”的咖啡脚本.js在Chrome中
- 我可以使用内容脚本js文件以编程方式注入CSS文件吗
- 加载后自动登录网站-用户脚本(JS)
- 自动更新脚本js/svg
- 我如何传递一个变量到我的脚本.js文件
- 如何从aspx文件中的脚本将值设置为脚本(.js)文件中的变量