2012-11-30 116 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坚持作为我的第一个代码示例中应该罚款。

相关问题