【问题标题】:How can I run this script when the tab reloads (chrome extension)?重新加载选项卡(chrome 扩展)时如何运行此脚本?
【发布时间】:2013-06-01 17:40:39
【问题描述】:

所以我想在指定 URL 中重新加载选项卡时运行脚本。它几乎可以工作,但实际上 id 没有:) 这是我的清单文件:

{
"manifest_version": 2,

"name": "Sample Extension",
"description": "Sample Chrome Extension",
"version": "1.0",

"content_scripts":
[
    {
      "matches": ["http://translate.google.hu/*"],
      "js": ["run.js"]
    }
],

"permissions":
[
    "activeTab",
    "tabs"
],

"browser_action":
{
    "default_title": "Sample",
    "default_icon": "icon.png"
}
}

这是run.js:

chrome.tabs.onUpdated.addListener(
function ( tabId, changeInfo, tab )
{
    if ( changeInfo.status === "complete" )
    {
        chrome.tabs.executeScript( null, {file: "program.js"} );
    }
}
);

programs.js 只是提醒一些文本(还)。当我对 run.js 的第一行发出警报时,它会发出警报,但是当我将它放入 if 时,它不会发出警报。我找不到问题。我是不是打错字了?

【问题讨论】:

  • 您是否检查了开发控制台中的错误?我认为您需要从后台页面而不是内容脚本运行它。我相信内容脚本只能使用 chrome.extension 并且 api 中的所有其他方法都需要在 background.js 页面上调用。

标签: javascript google-chrome-extension manifest reload onupdate


【解决方案1】:

假设 http://translate.google.hu/* 页面是您希望在重新加载时注入代码的页面,您将不得不以稍微不同的方式进行处理。目前,您总是将代码注入这些页面(未经许可,不少于),然后尝试在该内容脚本中使用 chrome.tabs api,这是您无法做到的。相反,我们会将侦听器放在后台页面中,并且只在页面刷新时注入代码,就像你想要的那样。首先是清单

{
  "manifest_version": 2,
  "name": "Sample Extension",
  "description": "Sample Chrome Extension",
  "version": "1.0",
  "background": {
    "scripts": ["background.js"]
  },
  "permissions":[
    "http://translate.google.hu/*", "tabs"
  ]
}

background.js

chrome.tabs.onUpdated.addListener(function(tabId,changeInfo,tab){
  if (tab.url.indexOf("http://translate.google.hu/") > -1 && 
      changeInfo.url === undefined){
    chrome.tabs.executeScript(tabId, {file: "program.js"} );
  }
});

这将侦听onUpdated 事件,检查它是否是我们要注入的url 之一,然后检查页面是否已重新加载。最后一步是通过检查changeInfo.url 是否存在来完成的。如果是这样,那么这意味着 url 已更改,因此没有刷新。反之,如果它不存在,那么页面一定只是被刷新过。

【讨论】:

  • 谢谢,这可行,但如果顶部有另一个选项卡,我该如何运行此脚本?
  • @Geiszla 顶部的另一个标签是什么意思?
  • 所以当我重新加载选项卡时,但更改选项卡。然后脚本不运行,因为那不是那个(例如 translate.google.hu)网站。
  • 太棒了!我为我的扩展编写了相同的函数,但我不知道 onUpdate 回调参数。谢谢,这对我有很大帮助+1
  • @BeardFist,你确定这能按预期工作吗?即使changeInfo.status and etc etc 也不会发生这种情况吗?
【解决方案2】:

content_scripts 在每个页面(重新)加载时运行,因此最好只使用它们来检测它。

这样,在您的 content_script 准备好接收任何消息之前,您也不会冒险在 background 中运行任何代码。

【讨论】:

【解决方案3】:

2021

如果您想检测清单 3(也可能是 2)中 background.js 的重新加载,chrome.tabs.onUpdated 方法对我不起作用:/它被调用了太多次。

这最终对我有用!

// --- On Reloading or Entering example.com --- 
chrome.webNavigation.onCommitted.addListener((details) => {
    if (["reload", "link", "typed", "generated"].includes(details.transitionType) &&
        details.url === "http://example.com/") {

        codeAfterReload();

        // If you want to run only when the reload finished (at least the DOM was loaded)
        chrome.webNavigation.onCompleted.addListener(function onComplete() {

            codeAfterReloadAndFinishSomeLoading();

            chrome.webNavigation.onCompleted.removeListener(onComplete);
        });
    }
});

更多转场类型:https://developer.chrome.com/docs/extensions/reference/history/#transition_types

祝你好运:)

【讨论】:

  • 请记住,这些 API 需要 webNavigation 权限并显示“此扩展程序可以看到您的所有浏览”消息
猜你喜欢
  • 2012-03-14
  • 2016-08-03
  • 1970-01-01
  • 1970-01-01
  • 2016-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-07
相关资源
最近更新 更多