3

我正在尝试构建一个 chrome 扩展,它将当前选项卡左侧的所有选项卡移动到新窗口。

当我执行以下代码时,它会在自己的窗口中移动每个左侧选项卡。因此,如果当前选项卡左侧有 2 个选项卡,它将创建 2 个窗口,每个窗口中有 1 个选项卡。我如何获得它以便它只将所有左侧选项卡移动到一个新窗口(即:它不会为当前选项卡左侧的每个选项卡创建一个新窗口)?

function groupTabsToTheLeft(info, tab) {
    chrome.tabs.getAllInWindow(null, function (tabs) {
        for (var i = 0; i < tabs.length; i++) {
            if (tabs[i].index < tab.index) {  
            chrome.windows.create({"tabId": tabs[i].id});           
            } else {
                break;
            }
        }
    });
}
4

2 回答 2

4

更新
基于OP的额外要求,以下解决方案具有以下规格:

  • 将活动选项卡左侧的选项卡移动到新窗口。
  • 将新窗口配置为与原始窗口具有相同的位置、大小和状态。
  • 删除默认在新窗口中创建的空选项卡。
  • 将焦点赋予原始窗口(完成后)。

你可以这样做:

  1. 从活动窗口中获取所需信息(使用chrome.windows.get)。
  2. 确定应移动哪些选项卡 ID。
  3. 创建一个空窗口(使用chrome.windows.create)。
  4. 将它们全部移动到步骤 (1) 中创建的窗口(使用chrome.tabs.move)。
  5. 控制新创建的窗口和移动选项卡的确切行为(使用chrome.windows.updatechrome.tabs.remove)。

示例background.js如下所示:

chrome.browserAction.onClicked.addListener(function(tab) {
    /* Get the `tab`'s window along with its containing tabs */
    chrome.windows.get(tab.windowId, { populate: true }, function(oldWin) {
        /* Determine which tabs should be moved
         * (i.e. are on the left of `tab` */
        var tabs = oldWin.tabs;
        var tabsToMove = [];
        for (var i = 0; i < tabs.length; i++) {
            if (tabs[i].index < tab.index) {
                tabsToMove.push(tabs[i].id);
            }
        }

        /* If there are any tabs to move... */
        if (tabsToMove.length > 0) {
            /* Create a new window with the same
             * location and size as the original */
            chrome.windows.create({
                top: oldWin.top,
                left: oldWin.left,
                width: oldWin.width,
                height: oldWin.height,
                focused: false
            }, function(newWin) {
                /* Remove the new, empty tab created by default */
                chrome.tabs.query({
                    windowId: newWin.id
                }, function(tabsToClose) {
                    /* Update the window's state (e.g. "maximized") */
                    chrome.windows.update(newWin.id, { state: oldWin.state });

                    /* Move the tabs to the newly created window */
                    chrome.tabs.move(tabsToMove, {
                        windowId: newWin.id,
                        index: -1
                    }, function() {
                        /* Close any tabs that pre-existed (i.e. 1 empty tab)
                         * [Do not do this BEFORE moving the tabs,
                         *  or the window will be empty and will close] */
                        var lastIdx = tabsToClose.length - 1;
                        tabsToClose.forEach(function(t, idx) {
                            chrome.tabs.remove(t.id);
                            if (idx === lastIdx) {
                                chrome.windows.update(oldWin.id, {
                                    focused: true
                                });
                            }
                        });
                    });
                });
            });
        }
    });
});

为了完整起见,随附的manifest.js可能如下所示:

{
    "manifest_version": 2,
    "name":    "Test Extension",
    "version": "0.0",
    "offline_enabled": true,

    "background": {
        "persistent": false,
        "scripts": ["background.js"]
    },

    "browser_action": {
        "default_title": "Test Extension"
        //"default_icon": {
        //    "19": "img/icon19.png",
        //    "38": "img/icon38.png"
        //},
    },

    "permissions": [
        "tabs"
    ]
}
于 2013-11-14T09:11:06.557 回答
0
if (tabs[i].index < tab.index) {  
        **chrome.windows.create**({"tabId": tabs[i].id});           
        } else {
            break;
        }

你的问题是每次你进入如果你创建一个新窗口。因此,您只需为第一个选项卡和必须添加到创建的窗口的其他选项卡创建一个新窗口。

于 2013-11-14T08:36:36.673 回答