2013-04-20 108 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

相關問題