【问题标题】:Message passing: Background script to closing tab消息传递:关闭选项卡的后台脚本
【发布时间】:2012-04-19 21:12:35
【问题描述】:

我是一个 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();
        }
    });
}

我在后台脚本控制台中没有看到内容脚本的响应。由于我正在关闭选项卡,因此我无法查看内容脚本控制台。消息哪里出错了?有没有更好的方法来调试这个?内容脚本在其标签关闭时是否可以通过其他方式进行侦听?

【问题讨论】:

  • 您可以尝试使用Port 进行通信-也许您将能够检测到指定的选项卡/页面是否已关闭。

标签: javascript google-chrome-extension message


【解决方案1】:

我相信背景上的 onRemoved 发生在选项卡已经关闭时,因此可能没有足够的时间让上下文接收您的消息并重播到后台脚本。

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

【讨论】:

  • 谢谢,古斯塔沃。我的第一个问题是send_closed_message() 使用的是chrome.tabs.getSelected 而不是chrome.tabs.get。一旦我解决了这个问题,你的答案是正确的:看起来标签在收到消息之前就被删除了。我重新安排了一些事情以使用最后发送的值。
猜你喜欢
  • 2015-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多