首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >chrome扩展: js脚本启动得太早了,尽管有run_at: document_idle

chrome扩展: js脚本启动得太早了,尽管有run_at: document_idle
EN

Stack Overflow用户
提问于 2016-05-18 21:44:41
回答 1查看 586关注 0票数 1

理论上,如果设置了run_at,用于在页面上选择元素的.js应该会在页面完全加载之后触发。但情况似乎并非如此。

在我的content.js里

代码语言:javascript
运行
复制
    "content_scripts": [
        {
          "js": ["extensions/jquery-2.2.2.min.js", "content.js"],
          "run_at": "document_idle"
        }
      ]

在我的content.js中,我只需要:

代码语言:javascript
运行
复制
alert("alert");
console.log("hello");
var fullname2 = $('#topcard').find('.profile-info').find('h1').text();
console.log(fullname2);

警报和第一个console.log都能工作。第二个控制台日志不记录任何内容,因为选择器无法选择任何内容。我之所以知道这一点,是因为如果我为setTimeout代码块添加一个content.js,并等待2秒,那么第二个控制台日志将正确显示fullname2。

知道为什么在页面完全加载之前,content.js显然是在开火,以至于选择器找不到任何东西吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-19 09:34:20

run_at: "document_idle"保证脚本在DOMContentLoaded事件之后执行,该事件指示所有静态 DOM内容都已解析并可用。

如果一个元素还不存在,这意味着它将在稍后由页面自己的代码动态添加。

显然,Chrome无法预测什么时候(如果有的话!)页面处于“完成”状态。您需要设置自己的标准(比如“当#topcard出现时”)。

话虽如此,您的策略应该如下:

  1. 检查元素是否已经存在。如果是的话,处理它,你就完蛋了。
  2. 设置一个listener for changes in the document。这是通过MutationObserver实现的,为了简单起见,我强烈推荐使用 library
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37310596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档