javascript - 当选项卡更改 URL 或重新加载时使用 chrome.tabs.executeScript

标签 javascript google-chrome browser google-chrome-extension

我正在构建一个 Chrome 扩展程序,我想将 Javascript 代码注入(inject)并运行到一个选项卡中。

例如:

chrome.tabs.query({active: true, lastFocusedWindow: true}, function(selectedTab) {
    chrome.tabs.executeScript(selectedTab[0].id, {code: code_});
});

code_ 变量为:

$('#gbqfq').val('test');
$("#gbqf").submit();

$('#rso > div.srg > li:nth-child(1) > div > h3 > a').click();

这个简单的脚本旨在在 google.com 上执行,应该键入并搜索“test”并点击第一个结果。

问题是提交请求后,选项卡更改其 URL,从而加载另一个页面。似乎当页面加载时,所有由 chrome.tabs.executeScript 注入(inject)的脚本都消失了。

有没有办法在同一个选项卡的不同页面上运行单个脚本?

我的扩展应该允许用户运行他自己的脚本,所以提前知道选项卡预计在脚本的哪个点重新加载是很复杂的(也许不可能?)(为了使用多个 chrome .tabs.executeScript 调用)。

这是我的扩展的 manifest.json,我只使用了一个弹出窗口(没有背景,没有 content_scripts):

{
    "manifest_version": 2,

    ...

    "options_page": "options.html",

    "permissions": [
        "storage",
        "unlimitedStorage",
        "tabs",
        "windows",
        "http://*/*",
        "https://*/*"
    ],

    "browser_action":
    {
        "default_popup": "popup.html"
    }
}

最佳答案

不,您不能在标签页导航离开后运行相同的脚本,因为脚本所在的 JavaScript 上下文已被拆除。

因此您需要在页面加载后再次注入(inject)脚本。 你可能想按照这些思路做一些事情:

  1. 注入(inject)您的提交脚本并保存选项卡 ID。
  2. 发起提交。
  3. chrome.tabs.onUpdated 按上面的标签 ID 和状态 “完成” 过滤。
  4. 检查 URL 是否符合您的预期,然后注入(inject)您的数据收集脚本。

关于javascript - 当选项卡更改 URL 或重新加载时使用 chrome.tabs.executeScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26057571/

相关文章:

javascript - 如果控制台错误不会引起问题,那么 JavaScript 中可以接受这些错误吗?

javascript - 用于复选框和标签的 Backbone View 事件处理程序

android - 用于 android 的 chrome 中的语音合成不加载声音

html - 使用媒体查询隐藏表格单元格会在 Chrome 中导致意外结果,但如果您重新加载页面就可以了

xslt - 不间断空格 (" ") 在 IE9 和 IE11 中进行 XSLT 转换时未正确转换

java - java中检测浏览器语言

javascript - 如何更新 Redux + React 中的嵌套对象属性?

javascript - 使用 jquery load() 加载内容后从页面获取所有链接;

css - Z-index 适用于 FF,不适用于 Chrome

javascript - 在js之前加载css文件