2013-04-20 110 views
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; 
        } 
       } 
      } 
     } 
    }); 
}); 
+0

可能重复[调用chrome.tabs.query后,结果是不可用(http://stackoverflow.com/questions/11688171/after-calling-chrome-tabs-query-the-results - 不可用) – 2013-04-20 20:10:38

+0

@RobW我明白了。这个问题必须由我误解异步和同步。谢谢。 – vturlington 2013-04-20 20:29:03

+0

很高兴有帮助。 – 2013-04-20 20:29:32

回答

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

注意:如果按住鼠标,标签将不会移动。而且,当标签集中时总是移动标签对于用户体验来说有点不友好。您最好使用browser action button来激活此功能。是的,这是一个额外的点击移动标签,但至少用户可以选择不移动标签,如果他们想。

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

感谢您的回答。尽管有两个问题,我没有解决其中的一个问题。 1)在tabs.move调用中的tab.id应该是tab.tabId。很容易修复。 2)!tab.pinned不是一个好主意,因为在这个范围内,tab只是一个只有属性“tabId”和“windowId”的activeInfo对象(参见[here](http://developer.chrome.com) /extensions/tabs.html#event-onActivated))。我尝试使用for循环来移动标签,并找到适当的选项卡来移动(并检查固定状态),但我仍然以我原来的错误结束。 – vturlington 2013-04-20 22:20:34

+0

@TwilitSoul你是对的类型,更新(和测试)的答案。 – 2013-04-20 22:25:59

+0

唉,我们更接近,但[对我来说]至少不是那里。我也测试了这一点,而且我仍然遇到同样的错误。它始终将新创建的选项卡移动到正确的位置。实际上,当我使用ctrl-tab或shift-ctrl-tab切换标签页时,我会移动到的标签页总是正确地改变位置,这很有趣(因为我没有想过这个,也不喜欢这样)。但是,当我单击一个选项卡时,它不会移动选项卡。我认为这可能会表现得如此之快,以至于我仍然保持鼠标按钮不动,并且认为我正在按住该选项卡。 – vturlington 2013-04-20 22:38:03

相关问题