【问题标题】:chrome.runtime.onMessage undefined in background script (chrome extension)chrome.runtime.onMessage 在后台脚本中未定义(chrome 扩展)
【发布时间】:2016-04-15 11:13:17
【问题描述】:

我正在尝试创建一个 chrome 扩展,但由于某些原因,有时 chrome.runtime 对象似乎不完整,并且缺少很多方法(包括我想要的 onMessage)。

似乎有时有效,有时无效。我认为这可能是与时间相关的问题,但我不明白为什么我不能简单地在后台创建消息监听器?

我的后台脚本:

setTimeout(function () {
    console.log("gogo!");
    chrome.runtime.onMessage.addListener(
        function(request, sender, sendResponse) {
            console.log(sender.tab ?
                        "from a content script:" + sender.tab.url :
                        "from the extension");
            if (request.type == "tab") {
                console.log("tab!");
                sendResponse({status: "ok"});
            }
        }),
    2
});

其中“chrome.runtime.onMessage”未定义。

谢谢!

Edit2:我构建了一个简单得多的原型,但它又失败了。现在我真的很困惑。这是我所拥有的:

$tree
.
├── manifest.json
├── src
│   ├── background.html
│   ├── background.js
│   └── test.js
└── vendor
    └── jquery.js

2 directories, 5 files

manifest.json 文件:

{
    "manifest_version": 2,

    "name": "test",
    "description": "test",
    "version": "1.0",
    "author": "test",

    "homepage_url": "http://www.test.com",

    "content_scripts": [
        {
            "run_at" : "document_idle",
            "matches": ["https://www.google*"],
            "js": ["vendor/jquery.js", "src/test.js"]
        }
    ],

    "background": {
        "page": "src/background.html",
        "persistent": false
    },

    "permissions": [
        "tabs",
        "https://www.google*"
    ]
}

background.html 文件:

<script src="../vendor/jquery.js"></script>
<script src="background.js"></script>

background.js 文件:

function run () {
    console.log("gogo!");
    chrome.runtime.onMessage.addListener(
        function(request, sender, sendResponse) {
            console.log(sender.tab ?
                        "from a content script:" + sender.tab.url :
                        "from the extension");
            if (request.type == "tab") {
                console.log("tab!");
                sendResponse({status: "ok"});
            }
        });
}

run();

test.js 文件:

'use strict';

run();

function run() {
    var url = window.location.href;

    // Error if no URI
    if (!url) {
        return 1;
    }

    var uriRe = /https:\/\/www\.google.*/;
    var reParse = uriRe.exec(url);
    if (!reParse) {
        return 2;
    }

    chrome.runtime.sendMessage({type: "tab"}, function(response) {
        console.log(response);
    });
}

我在 OSX 上使用 Chrome 49.0.2623.112(64 位)。

编辑:这是失败时发生的屏幕截图:

我想再次准确地说它不会一直失败(可能有 50% 的时间?),这让它变得更加奇怪,让我相信在我不存在的地方存在某种“竞争”情况知道。

【问题讨论】:

  • 你为什么要把它包装在一个超时时间里?
  • 您的背景页面是活动页面吗? ("persistent": false set) 如果是这样,你不应该调用 setTimeout。如果是活动页面,请查看docs,因为有些事情需要注意。
  • @DanielHerr 这只是一个测试,因为我怀疑与时间相关的问题。似乎超时后效果更好,但我完全不确定。
  • @MichaelUpdike 感谢您的建议。我试图设置 "persistent": false 并且问题仍然是一样的。我尝试设置 "persistent": true 进行测试,结果还是一样。
  • 您是否有任何 devtools 扩展正在运行?我知道扩展运行时页面被错误分类为非扩展页面的错误,该错误已在 Chrome 51(当前为 Chrome Beta)中修复 - crbug.com/544182

标签: javascript google-chrome google-chrome-extension background


【解决方案1】:

问题已解决:我必须禁用,然后重新启用所有其他扩展。似乎是 Chrome 的一个错误。

【讨论】:

  • 如果这确实是由crbug.com/544182 引起的,那么问题可以通过禁用所有devtools 扩展,打开devtools,然后再次启用扩展(如果需要)来解决。只是禁用+重新启用,然后打开后台的devtools并不能解决问题。
  • 这仍然是个问题吗?我今天收到了
【解决方案2】:

点击顶部并在扩展环境中设置控制台

enter image description here

后台只运行一次。您应该运行更多以检查结果

这是我运行良好的代码:

chrome.tabs.onUpdated.addListener(
	function(tabId,info,tab){
		if(info.status=="complete")
			console.log("complete")
		chrome.tabs.sendMessage(tabId, {greeting: "inupdate"}, function(response) {
			console.log(response);
		});
	}
)

【讨论】:

    【解决方案3】:

    我认为这与您使用的超时功能有关,Google 已经有一个叫做警报的东西,它有助于安排代码定期或在指定时间运行。

    https://developer.chrome.com/apps/alarms

    试试这个而不是超时

    【讨论】:

    • 谢谢,但似乎超时只是一个测试,我实际上并不需要它,因为我想做的是一个事件监听器。
    猜你喜欢
    • 1970-01-01
    • 2018-04-11
    • 2013-07-04
    • 2016-10-28
    • 1970-01-01
    • 2020-09-12
    • 2021-06-28
    • 1970-01-01
    • 2013-08-28
    相关资源
    最近更新 更多