2012-11-30 114 views
4

我正在開發一個Chrome擴展,我想要打開一個新的選項卡,但在用戶打開的當前選項卡之後。這是我試圖做的:如何在當前選項卡之後立即打開新選項卡?

function clickEvent(info, tab) { 
    update(); 
    var url= "http://google.com"; 
    var id = tab.id+1; 
    chrome.tabs.create({'url': url, 'index': id}); 
} 

但創建的選項卡在鉻選項卡欄中的選項卡隊列結束時打開。從chrome.tabs.create中刪除'index': id後,結果相同。我不知道我該如何解決問題。有誰能夠幫助我?

回答

3

因爲您使用的參數錯誤(id應該是index),因此該選項卡被添加到最後。 tabid是一個正整數,用於唯一標識會話中的選項卡。因此,id的值總是高於選項卡的數量。

該標籤的位置可以從index屬性中讀取。所以,用index替換id

function clickEvent(info, tab) { 
    update(); 
    var url = "http://google.com/"; 
    var index = tab.index + 1; 
    chrome.tabs.create({'url': url, 'index': index}); 
} 
5

這聽起來像你正在創建一個 '孩子' 選項卡,在這種情況下,你應該同時設置indexopenerTabId

function addChildTab(url, parentTab) { 
    chrome.tabs.create({ 
     'url': url, 
     'windowId': parentTab.windowId, 
     'index': parentTab.index + 1, // n.b. index not id 
     'openerTabId': parentTab.id // n.b. id not index 
    }); 
} 

設置openerTabId表示新選項卡將作爲父標籤的子選項卡正確關聯,因此:

  • 如果您在子選項卡處於活動狀態時關閉它,則父選項卡將成爲活動選項卡(而不是稱爲子選項卡右側的選項卡)。這使其行爲與用戶在新選項卡中打開的鏈接的行爲相同。
  • 在樹中顯示選項卡的擴展程序will work properly

另請參閱https://code.google.com/p/chromium/issues/detail?id=67539其中添加了這個。


注意:如果你在後臺打開的選項卡(通過傳遞active:false),然後parentTab.index + 1是不完全正確,而是最好你插入現有子(和孫)後的新標籤的parentTab標籤:

function addBackgroundChildTab(url, parentTab) { 
    chrome.tabs.query({'windowId': parentTab.windowId}, function(tabs) { 
     var parentAndDescendentIds = {}; 
     parentAndDescendentIds[parentTab.id] = true; 
     var nextIndex = parentTab.index + 1; 
     while (nextIndex < tabs.length) { 
      var tab = tabs[nextIndex]; 
      if (tab.openerTabId in parentAndDescendentIds) { 
       parentAndDescendentIds[tab.id] = true; 
       nextIndex++; 
      } else { 
       break; 
      } 
     } 
     chrome.tabs.create({ 
      'url': url, 
      'active': false, 
      'windowId': parentTab.windowId, 
      'index': nextIndex, 
      'openerTabId': parentTab.id 
     }); 
    }); 
} 

但是,這可能是矯枉過正的目的,在這種情況下,與parentTab.index + 1堅持作爲我的第一個代碼示例中應該罰款。

相關問題