1

我正在编写一个 chrome 扩展程序,单击该扩展程序会在给定时间后关闭当前选项卡。
我正在发送一条带有时间的消息,从popup.jsbackground.js。但是标签不会关闭。当我取消注释时,警报会起作用,所以它似乎只是删除线。我认为这是关于tab.id.

chrome.extension.onMessage.addListener(
    function message(request, sender, callback) {
        var ctr = 0;
        ctr = parseInt(request.text, 10);
        setTimeout(function() {
            chrome.tabs.getCurrent(function(tab) {
                //window.alert("Working?");
                chrome.tabs.remove(tab.id, function(){});
            });
        }, ctr);
    }
);
4

1 回答 1

3

1.
chrome.extension没有onMessage事件。我假设您的意思是正确的chrome.runtime.onMessage

2.
您可能误解了(*) chrome.tabs.getCurrent的用途:

获取执行此脚本调用的选项卡。如果从非选项卡上下文(例如:背景页面或弹出视图)调用,则可能未定义。

由于您是从非选项卡上下文(即背景页面)调用它,因此tab将是未定义的。

(*):“误解”如“懒得阅读手册”......

3.
不清楚是要在设置定时器的那一刻关闭活动标签页,还是在它被触发的那一刻关闭。(在您的代码中,您正在尝试执行后者,尽管前者对我来说更有意义。)


正确的做法:

chrome.runtime.onMessage.addListener(function message(msg) {
    var ctr = 0;
    ctr = parseInt(msg.text, 10);
    setTimeout(function() {
        chrome.tabs.query({ active: true }, function(tabs) {
             chrome.tabs.remove(tabs[0].id);
        });
    }, ctr);
});

另外,请注意,使用 和 之类的函数setTimeout只能setInteval在持久性背景页面中可靠地工作(但不能在事件页面中)。如果可能,建议您迁移到事件页面(更“资源友好”),在这种情况下,您还必须切换到警报 API

于 2013-11-08T18:53:42.920 回答