tabs.moveInSuccession()

修改一组标签页的继承关系。

使用 tabs API,可以将同一个窗口中的一个标签页指定为另一个标签页的后继标签页。如果标签页 B 是标签页 A 的后继,并且标签页 A 在处于活动状态时被关闭,那么下一个被激活的将是标签页 B。如果标签页 A 没有后继,则浏览器可以自由决定下一个要激活的标签页。如果标签页 B 是标签页 A 的后继,那么标签页 A 就被称为标签页 B 的前驱。一个标签页最多只能有一个后继,但可以有任意数量的前驱。标签页不能将自身或另一个窗口中的标签页指定为后继。

所有标签页最初都没有后继;只有当 WebExtension 为其指定后继时,标签页才会获得后继。然而,浏览器必须尽可能避免让某个标签页处于与其他标签页的继承关系中而被“孤立”:如果标签页 B 是标签页 A 的后继,标签页 C 是标签页 B 的后继,并且 B 被关闭(或移动到另一个窗口),那么标签页 A 将把标签页 C 指定为自己的后继。防止 C 以这种方式被孤立,称为将标签页(B)从其继承链中移除

tabs.moveInSuccession() 接受一个标签页 ID 数组,并将所有这些标签页从其继承链中移除。然后,它将数组中的每个标签页设为前一个标签页的后继,形成一个链。它可以选择性地将链中最后一个标签页的后继设置为一个锚定标签页,该锚定标签页不会从其继承链中移除。附加选项可以控制标签页链是“插入”到锚定标签页的前面还是后面,以及操作是否像链表插入一样。

虽然可以使用 tabs.update() 来指定后继标签页,但通常更希望使用 tabs.moveInSuccession() 来更改后继,即使只有一个标签页需要指定其后继。区别在于,browser.tabs.moveInSuccession([a], b) 会将标签页 a 从其继承链中移除,因此 a 的任何前驱都会继承 a 原来的后继;而如果改用 browser.tabs.update(a, {successorTabId: b}),标签页 a 可能会继续成为其他标签页的后继,这可能会出乎意料。tabs.moveInSuccession() 的另一个优点是,所有继承关系的更改都是原子性的,无需担心 tabs.update()tabs.get() 等调用之间以及用户关闭标签页等其他操作之间的竞争条件。

语法

js
browser.tabs.moveInSuccession([1, 3, 5, 7, 2, 9], 4, {insert:true})

参数

tabIds

array of integer。标签页 ID 的数组。数组元素的顺序决定了标签页之间的关系。任何无效的标签页 ID,或与不在 tabId 所在窗口中的标签页(或如果省略 tabId,则为数组中的第一个标签页)对应的标签页 ID,都将被忽略——它们将保留其当前的后继和前驱。

tabId 可选

integer。将成为 tabIds 数组中最后一个标签页的后继的标签页的 ID。如果此 ID 无效或为 tabs.TAB_ID_NONE,则最后一个标签页将没有后继。默认为 tabs.TAB_ID_NONE

options 可选

object.

append 可选

boolean。确定是在 tabId 的继承链之前还是之后移动 tabIds 中的标签页。如果为 false,则在 tabId 之前移动标签页;如果为 true,则在 tabId 之后移动标签页。默认为 false

insert 可选

boolean。确定在将 tabId 的当前前驱或后继(取决于 options.append)链接到链的另一侧后,是否将其重新链接。如果为 true,则会发生以下情况之一:如果 options.appendfalse,则数组中的第一个标签页将成为 tabId 的任何当前前驱的后继;如果 options.appendtrue,则 tabId 的当前后继将成为数组中最后一个标签页的后继。默认为 false

浏览器兼容性