【问题标题】:closing the current tab in a chrome extention关闭 chrome 扩展中的当前选项卡
【发布时间】:2013-11-08 18:19:20
【问题描述】:

我正在编写一个 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);
    }
);

【问题讨论】:

标签: javascript google-chrome google-chrome-extension tabs


【解决方案1】:

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

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

【讨论】:

  • 非常感谢,答案写得很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-27
  • 2012-04-21
相关资源
最近更新 更多