消息传递:后台脚本到关闭选项卡

时间:2012-04-19 21:12:35

标签: javascript google-chrome-extension message

我是一个javascript新手,写了我的第一个Chrome扩展程序,并且我坚持传递消息。我的扩展程序包括后台脚本,浏览器操作图标和内容脚本。内容脚本(测量选项卡中花费的第二个秒数的计时器)需要更新后台脚本并在选项卡关闭时更改图标,但由于内容脚本无法访问选项卡onRemove事件,因此需要从后台脚本中收听消息。

以下是我如何设置后台脚本侦听器以侦听已关闭的标签:

// Listen for closed tabs.
chrome.tabs.onRemoved.addListener(function(tab) {
    send_closed_message();
}); 

function send_closed_message () {
    chrome.tabs.getSelected(null, function(tab) {
        console.log("sending tab_closed to tab " + tab.id);
        chrome.tabs.sendRequest(tab.id, {close: true}, 
                                        function(response) {
            console.log(response.timer_stop); }); 
    });
}  

此处是内容脚本中侦听此消息的函数。

function main () {
    console.log("main()");
    timer = new Timer();
    timer.start();

    // Listen for window focus
    window.addEventListener('focus', function() { timer.start(); } );

    // Listen for window blur
    window.addEventListener('blur', function() { timer.stop(); } );

    // Listen for tab close
    chrome.extension.onRequest.addListener(
    function(request, sender, sendResponse) {
        console.log(sender.tab ? 
                    "from a content script:" + sender.tab.url:
                    "from the extension");

        if (request.close === true) {
           sendResponse({timer_stop: "stopped"});
           timer.stop();
        }
    });
}

我没有在后台脚本控制台中看到内容脚本的响应。由于我关闭了标签页,因此无法查看内容脚本控制台。消息哪里出错了?有没有更好的方法来调试它?内容脚本在其标签关闭时是否有另一种方式可以监听?

1 个答案:

答案 0 :(得分:1)

我相信onRmoved on background会在标签已被关闭时发生,因此上下文可能没有足够的时间接收您的消息并重播回后台脚本。

对于上下文来说,使用其计数值每秒保持向后台发送消息可能是一个好主意。当后台收到onRemoved事件时,它只使用最后收到的值作为该页面的实时时间。