2012-04-19 54 views
3

我是一名JavaScript新手,撰写我的第一个Chrome扩展,并且被阻止在消息传递上。我的扩展包括后台脚本,浏览器操作图标和内容脚本。内容脚本(一个计时器,用于测量制表符中的秒数)需要更新后台脚本并在关闭标签时更改图标,但由于内容脚本无法访问事件选项卡,因此需要监听来自后台脚本的消息。消息传递:关闭选项卡的背景脚本

下面是我设置了后台脚本监听器监听关闭的标签:

// 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(); 
     } 
    }); 
} 

我在背景脚本控制台中看不到内容脚本的响应。由于我正在关闭该选项卡,因此我无法查看内容脚本控制台。信息在哪里出错?有没有更好的方法来调试呢?内容脚本在选项卡关闭时可以采用其他方式进行监听吗?

+0

你可以尝试使用'端口'进行通信 - 也许那么你将能够检测到指定的标签/页面是否已关闭。 – hamczu 2012-04-20 00:47:13

回答

1

我相信背景上的onRemoved发生在标签已经关闭时,所以可能没有足够的时间让上下文接收你的消息并重放回后台脚本。

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

+0

谢谢,古斯塔沃。我的第一个问题是'send_closed_message()'使用'chrome.tabs.getSelected'而不是'chrome.tabs.get'。一旦我解决了这个问题,你的回答是正确的:它看起来像标签被删除之前,他们得到的消息。我重新安排了使用最后发送的值的东西。 – ecmendenhall 2012-04-20 14:29:06