【问题标题】:Chrome extension, how to delay script until page is fully loadedChrome扩展,如何延迟脚本直到页面完全加载
【发布时间】:2018-06-06 23:16:39
【问题描述】:

我试图在选项卡中打开新网站地址后按类名获取 DOM 元素。问题是我不知道如何让它等到页面完全加载。我尝试了闹钟、setTimeOut、setTimeDelay,但没有任何效果。

chrome.runtime.onMessage.addListener(message);

function message(msg) {
  chrome.tabs.update({url: 'https://www.website.com/'});
  chrome.tabs.executeScript({code:"var theBtn = document.getElementsByClassName('btn1');theBtn[0].click();"});
}

我在弹出窗口中使用 chrome.runtime.sendMessage,因为我想从输入中发送网址,然后我按下一个按钮并触发上面的代码。我简化了这一点,因为其他一切都有效。 (msg) 只是一个网站地址

【问题讨论】:

标签: javascript html google-chrome dom google-chrome-extension


【解决方案1】:

更新:

那行不通,因为executeScript 没有要执行的选项卡,因为您刚刚杀死(更新)了它。您必须将其拆分为背景和内容脚本:

  1. 后台运行chrome.tabs.update
  2. 后台向内容发送准确的目标 URL
  3. 内容会监听每个 URL,但会忽略所有 URL,除非它只是从后台获取了这个确切的 URL
  4. 如果是这样,Content 会运行脚本(或告诉后台运行 executeScript,但这似乎很愚蠢),忘记 URL,然后返回空闲状态

也许 2-3 中的通信必须采用另一种方式:内容在每次页面加载时都向后台询问是否应该作用于该 URL。

非常有趣的用例! I made a Proof of concept because it's X-mas!

原文:

未经测试!两种选择:

2。在脚本中添加 load 监听器包装器:

chrome.tabs.executeScript({
  code:"window.addEventListener('load', function() { var theBtn = document.getElementsByClassName('btn1');theBtn[0].click(); });"
});

这是您的代码,包含在 window.addEventListener('load', function() { ... }); 中。添加事件监听器会立即执行,但里面的代码只有在页面加载时才会执行。

1。使用executeScriptrunAt 选项。我想你想要document_endSee docs

实际上看起来默认的(document_idle)更适合:“浏览器在“document_end”和window.onload之后立即选择一个时间”(from here

【讨论】:

  • window.addEventLisnter 中包裹的函数代码从不运行,executeScript 中的 runAt 也不起作用,我也在清单文件中尝试了 runAt,但没有成功。嗯,我的 js 文件设置为在后台运行的事实会是问题吗?
  • chrome.tabs.executeScript 必须由后台脚本运行。没有代码运行,或者只是没有加载?必须在执行之前添加监听器(duh),所以你必须告诉executeScript 更快(document_end 应该这样做)。
  • 我认为 executeScript 运行速度太快,甚至在选项卡开始加载之前。您必须拆分操作:后台脚本中的chrome.tabs.update,以及用于侦听每个页面加载的内容脚本,以及它们之间的消息以了解哪个页面加载是来自后台脚本的页面。 - gist.github.com/rudiedirkx/1e739b4ed65c5a879710461c92e674bf 有效,因为没有页面加载。
  • 请注意,如果没有 tabId 则默认为焦点标签
  • 我明白了。我在您的最小代码中没有看到任何选项卡上下文。 browserAction.onClicked?我做了一个 POC,看答案。
【解决方案2】:

有三种方法可以做到这一点 1.在Manifest.json中使用run_at="document_end"(理想的开发者应该尽可能使用这个) 2. using document is ready 事件使用 java-script 或 jquery 3.使用executeScript

【讨论】:

    猜你喜欢
    • 2023-03-05
    • 2020-08-20
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多