【问题标题】:Chrome Extension page reloadChrome 扩展页面重新加载
【发布时间】:2015-10-15 11:46:54
【问题描述】:

我正在编写一个 chrome 扩展程序,它既有用于操作当前选项卡数据的 content.js,也有一个在执行时生成的弹出窗口。但是,我的问题是,当我对扩展进行更改时,我必须重新加载扩展并刷新页面,否则它会给我一个“错误建立连接,端口不存在”错误。这是我的 manifest.json 文件

{
    "manifest_version": 2,
    "name":    "extension",
    "version": "0.0",
    "offline_enabled": true,

    "content_scripts": [
        {
            "matches": [
                "*://mail.google.com/*"
            ],
            "css": ["css/jquery-ui.css"],
            "js":     ["js/jquery.js" , "js/jquery-ui.js" , "js/bootstrap.js" , "js/commons.js" , "js/content.js"],
            "run_at": "document_end"
        }
    ],

    "browser_action": {
        "default_title": "chrome",
        "default_popup": "html/popup.html"
    },
    "permissions": [
    "tabs",
    "https://*.*.*/"
    ]
}

【问题讨论】:

  • 您在 content.js 中是否有任何代码尝试在线连接?
  • 我有几个对站点的 API 调用是的。这是导致问题的原因吗?
  • 根据我对扩展的有限知识,我认为这是你的问题。 API 调用应移至 background.js。这是有类似问题的人:stackoverflow.com/questions/13637715/… 内容脚本应该用于与选项卡中的“当前”页面进行交互。像密码保护程序、开发/调试扩展、linter 等。 developer.chrome.com/extensions/content_scripts
  • 如果这听起来很愚蠢,请原谅我,但是如果我将 content.js 更改为 background.js 会怎样? background.js 还能抓取 DOM 吗?如果我这样做,我需要在 manifest.js 中进行哪些更改?
  • 不,这对我来说听起来并不愚蠢。但它将无法访问 DOM。我认为背景和内容之间的“桥梁”可以解决您的问题。所以你应该两者兼得。 Chrome 支持通过 chrome.runtime.sendMessage + .onMessage 在内容脚本和/或后台页面之间进行通信。但请注意,数据将被 JSON 序列化,因此您无法传输像 jQuery 这样的对象。

标签: google-chrome-extension


【解决方案1】:

这是正常行为。当您对扩展进行更改时,您必须重新加载它。但是,当您重新加载扩展程序时,所有现有的内容脚本注入都失去了与后台页面的连接。不仅如此,如果您尝试在 port.onDisconnected.addListener 上重新连接,出于安全原因,您将收到异常,因为新的后台进程将无法识别其先前的内容脚本注入。

当我遇到这个问题时,我想出了这个解决方案:

reconnect();

function reconnect() {

    var port = chrome.runtime.connect({
        name: 'injection'
    });

    port.onMessage.addListener(handleMessage);
    port.onDisconnect.addListener(function() {
        console.log('bg script disconnected');
        setTimeout(function() {
            try {
                reconnect();
            } catch (e) {
                location.href = location.href;
            }
        }, 1000);
    });
}

function handleMessage() {
}

我知道,这不仅仅是自动页面重新加载,但没有其他方法可以从以前的内容脚本注入重新连接 - 必须再次注入更新的扩展代码才能连接到后台脚本。

【讨论】:

  • 我试图用它来自动重新加载页面但是它什么也没做?
  • 如果您在控制台日志中看到“bg 脚本已断开连接”,这可能意味着启动扩展程序需要超过 1 秒的时间。您可以尝试在连接时添加 console.log 以查看实际情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-09
  • 2021-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多