如何在最后一个固定标签后移动标签?

时间:2013-04-20 19:27:26

标签: google-chrome-extension

扩展程序的设计使得当您单击固定标签时,它会将其移动到所有固定标签中的最右侧位置。在我不断遇到问题之前,它会工作几次:

  

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

1 个答案:

答案 0 :(得分:2)

您当前的代码存在一些缺陷:

  1. 效率低下:您选择所有窗口和标签,而只需要当前窗口中的固定标签。
  2. 错误使用异步 chrome.tabs.move方法:您可以通过反复向右移动标签,在最后一个固定标签后移动单个标签。正如我所说的那样,chrome.tabs.move是异步的,所以当你再次呼叫chrome.tabs.move时,前一个&#34;移动请求&#34;可能尚未完成。因此你的错误。
  3. 为了提高效率,请使用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!');
    });
    

    注意:如果按住鼠标,标签不会移动。此外,在选项卡聚焦时始终移动选项卡在用户体验方面有点不友好。您最好使用browser action button来激活此功能。是的,只需再单击一下即可移动选项卡,但至少用户可以选择不移动选项卡。

    chrome.browserAction.onClicked.addListener(function(tab) {
        var tabId = tab.id;
        chrome.tabs.query({currentWindow: true, pinned: true}, ...);
    });