将变量传递给新创建的选项卡

Dra*_*vuk 3 javascript google-chrome google-chrome-extension

所以我有一个内容脚本,其中包含一个事件触发消息到"启动"脚本,我用它来创建一个带有本地html文件的选项卡,并将相同的消息/变量传递给该选项卡.然后,选项卡应根据变量加载指定的数据.它在大约50%的时间内按预期工作,使我相信它是一个同步性问题.我可能不会以正确的方式解决这个问题,但这是我能够自己解决的最好方法.

内容脚本(script.js):

function openHistory(event) {
    var account = $(/*selector*/).html();
    chrome.runtime.sendMessage(account);
}
Run Code Online (Sandbox Code Playgroud)

启动脚本(launch.js):

chrome.runtime.onMessage.addListener(function(account) {
    chrome.tabs.create({url: 'background.html'}, function(tab) {
        chrome.tabs.sendMessage(tab.id, account);
    });
});
Run Code Online (Sandbox Code Playgroud)

HTML脚本(background.js):

chrome.runtime.onMessage.addListener(function(account) {
    loadPage(account);
});

function loadPage(account) {
    chrome.storage.sync.get(account, function(data) {
        // Do stuff with DOM
    });
}
Run Code Online (Sandbox Code Playgroud)

表现:

{
    "manifest_version": 2,

    "name": "Extension",
    "version": "1.0",

    "permissions": ["storage", "tabs"],

    "background": {
        "scripts": ["launch.js"],
        "persistent": false
    },

    "content_scripts": [{
            "js": ["jquery.js", "script.js"]
    }]
}
Run Code Online (Sandbox Code Playgroud)

更新:我在launch.js中为tabs.sendMessage的回调添加了"alert(chrome.runtime.lastError.message)",每当它不起作用时,我得到"无法建立连接.接收端不存在".

Peb*_*bbl 5

我的猜测是,chrome.tabs.create当选项卡准备就绪时实际触发的回调,而不是当其内容已加载时.我无法分辨,因为此方法的文档没有说明何时触发回调.

要解决这个问题,最好让新打开的后台选项卡向其祖先发送一条消息 - 正如您知道启动脚本已经启动并运行 - 说"向我发送详细信息",此时您然后触发 chrome.tabs.sendMessage(tab.id, account);

如果这有道理?

以下内容尚未经过测试,只是猜测可行的方法.显然,仔细观察一下,MessageSender如果消息来自后台脚本,则可以使用它来计算 - 而不是使用对象属性.但是我更喜欢用我自己的代码来具体说明这些事情:

HTML脚本(background.js):

chrome.runtime.sendMessage({from: 'background'});
Run Code Online (Sandbox Code Playgroud)

启动脚本(launch.js):

chrome.runtime.onMessage.addListener(function(obj, sender) {
    if ( obj && obj.from == 'background' ) {
        chrome.tabs.sendMessage(sender.tab.id, obj);
    }
    else {
        chrome.tabs.create({url: 'background.html' });
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 你的观察是完全正确的.而不是使用`chrome.tabs.sendMessage`,我建议只使用`onMessage`事件的`sendResponse`参数,因为它实现了相同的结果,并且更容易使用. (2认同)