0

该扩展程序的设计目的是,当您单击固定选项卡时,它会将其移动到所有固定选项卡中最右边的位置。在我不断遇到问题之前它工作了几次:

tabs.move 期间出错:现在无法编辑选项卡(用户可能正在拖动选项卡)。chromeHidden.handleResponse

但是,当我使用调试器时,它每次都有效。

代码:

chrome.tabs.onActivated.addListener(function(tab) {
    chrome.windows.getAll({"populate":true}, function(windows) {
        var tabs = [];
        for (var i = 0; i < windows.length; i++) {
            var win = windows[i];
            if (win.id == tab.windowId) {
                tabs = win.tabs;
                for (var k = 0; k < tabs.length; k++) {
                    var tempTab = tabs[k];
                    if (tempTab.id == tab.tabId && tempTab.pinned == true) {
                        for (var j = k; tabs[j+1] && tabs[j+1].pinned; j++) {
                            chrome.tabs.move(tab.tabId, {"index":j+1});
                        }
                        break;
                    }
                }
            }
        }
    });
});
4

1 回答 1

2

您当前的代码有一些缺陷:

  1. 效率低下:您选择所有窗口和选项卡,而只需要当前窗口中的固定选项卡。
  2. 异步 方法的错误使用chrome.tabs.move:您通过反复向右移动选项卡将单个选项卡移动到最后一个固定选项卡之后。正如我所说,chrome.tabs.move是异步的,所以当你chrome.tabs.move再次调用时,之前的“移动请求”可能还没有完成。因此你的错误。

为了提高效率,请使用chrome.tabs.query带有相关过滤器的方法:

chrome.tabs.onActivated.addListener(function(activeInfo) {
    var tabId = activeInfo.tabId;
    chrome.tabs.query({
        currentWindow: true,
        pinned: true
    }, function(tabs) {
        // Only move the tab if at least one tab is pinned
        if (tabs.length > 0) {
            var lastTab = tabs[ tabs.length - 1 ];
            var tabIndex = lastTab.index + 1;
            for (var i=0; i<tabs.length; ++i) {
                if (tabs[i].id == tabId) {
                    // Current tab is pinned, so decrement the tabIndex by one.
                    --tabIndex;
                    break;
                }
            }
            chrome.tabs.move(tabId, {index: tabIndex});
        }
    }); // End of chrome.tabs.query
});  // End of chrome.tabs.onActivated.addListener

如果您想在移动选项卡后做其他事情,请将回调传递给chrome.tabs.move

chrome.tabs.move(tabId, {index: tabIndex}, function() {
    console.log('Moved tab!');
});

注意:如果您按住鼠标,选项卡不会移动。此外,在标签集中时总是移动标签在用户体验方面有点不友好。您最好使用浏览器操作按钮来激活此功能。是的,只需单击一次即可移动选项卡,但至少用户可以选择不移动选项卡,如果他们愿意的话。

chrome.browserAction.onClicked.addListener(function(tab) {
    var tabId = tab.id;
    chrome.tabs.query({currentWindow: true, pinned: true}, ...);
});
于 2013-04-20T21:36:13.510 回答