Firefox addon getBrowserAtIndex(i)有时在removeTab()上失败

Firefox addon getBrowserAtIndex(i)有时在removeTab()上失败,firefox-addon,firefox-addon-restartless,Firefox Addon,Firefox Addon Restartless,考虑到以下(简化的)示例效果良好: var tabs = window.gBrowser.tabs; for (var i = 2, len = tabs.length; i < len; i++) { var uri = window.gBrowser.getBrowserAtIndex(i).currentURI.spec; } var tabs=window.gBrowser.tabs; 对于(变量i=2,len=tabs.length;i

考虑到以下(简化的)示例效果良好:

var tabs = window.gBrowser.tabs;
for (var i = 2, len = tabs.length; i < len; i++) {
  var uri = window.gBrowser.getBrowserAtIndex(i).currentURI.spec;
}
var tabs=window.gBrowser.tabs;
对于(变量i=2,len=tabs.length;i
以下有时会在带有消息窗口的最后一个选项卡上失败。gBrowser.getBrowserAtIndex(…)未定义

var tabs=window.gBrowser.tabs;
对于(变量i=2,len=tabs.length;i
我不明白为什么它失败了,为什么它只是偶尔失败,而不是一直失败


是否有任何其他方法可以代替
gBrowser.getBrowserAtIndex(i)使用
要获取选项卡的URL?

似乎您正在一个循环中关闭选项卡,在该循环中,您已存储了选项卡的初始数量
len=tabs.length
,然后在现有选项卡的数量可能因您的操作而更改时,将其与原始选项卡数量进行比较

构造:
for(设i=2,len=tabs.length;i

选项卡的长度不改变的情况下更有效。但是,在这种情况下,您正在更改选项卡的数量,每次检查此循环的终止条件时,都需要与
tabs.length
进行比较。所以:
for(设i=2,len=tabs.length;i

实际上,当前循环不总是失败的唯一原因是
window.gBrowser.removeTab()
在实际删除选项卡之前返回。您正在进行一场竞赛,以查看是否在实际删除任何选项卡之前完成了循环

然而,这不是唯一的问题。您正在删除当前为其编制索引的选项卡。在大多数情况下,如果像大多数数组一样删除了该选项卡,则其余较高的索引选项卡将下移到您已经处理的索引处。当前循环不会定期跳过其他选项卡的唯一原因是
window.gBrowser.removeTab()
在实际删除当前索引的选项卡之前返回。只有在看到
undefined
错误的情况下,才可以跳过选项卡

您的循环应该是这样的:
for(让i=tabs.length-1;i>=2;i--){…}


这样,您可以从列表的末尾开始,然后从下面删除。这既可以防止
未定义的问题,也可以通过消除在实际删除任何选项卡之前需要完成整个过程的争用条件来防止跳过选项卡的可能性。

似乎您正在一个循环中关闭选项卡,在该循环中,您已存储了选项卡的初始数量
len=tabs.length
和然后在现有选项卡的数量可能因您的操作而发生更改时,与原始选项卡的数量进行比较

构造:
for(设i=2,len=tabs.length;i

选项卡的长度不改变的情况下更有效。但是,在这种情况下,您正在更改选项卡的数量,每次检查此循环的终止条件时,都需要与
tabs.length
进行比较。所以:
for(设i=2,len=tabs.length;i

实际上,当前循环不总是失败的唯一原因是
window.gBrowser.removeTab()
在实际删除选项卡之前返回。您正在进行一场竞赛,以查看是否在实际删除任何选项卡之前完成了循环

然而,这不是唯一的问题。您正在删除当前为其编制索引的选项卡。在大多数情况下,如果像大多数数组一样删除了该选项卡,则其余较高的索引选项卡将下移到您已经处理的索引处。当前循环不会定期跳过其他选项卡的唯一原因是
window.gBrowser.removeTab()
在实际删除当前索引的选项卡之前返回。只有在看到
undefined
错误的情况下,才可以跳过选项卡

您的循环应该是这样的:
for(让i=tabs.length-1;i>=2;i--){…}


这样,您可以从列表的末尾开始,然后从下面删除。这既可以防止
未定义的问题,也可以通过消除在实际删除任何选项卡之前需要完成整个过程的争用条件来防止跳过选项卡的可能性。

似乎您正在一个循环中关闭选项卡,在该循环中,您已存储了选项卡的初始数量
len=tabs.length
和然后在现有选项卡的数量可能因您的操作而发生更改时,与原始选项卡的数量进行比较

构造:
for(设i=2,len=tabs.length;i

选项卡的长度不改变的情况下更有效。但是,在这种情况下,您正在更改选项卡的数量,每次检查此循环的终止条件时,都需要与
tabs.length
进行比较。所以:
for(设i=2,len=tabs.length;i

实际上,当前循环不总是失败的唯一原因是
window.gBrowser.removeTab()
在实际删除选项卡之前返回。您正在进行一场竞赛,以查看是否在实际删除任何选项卡之前完成了循环

然而,这不是唯一的问题。您正在删除当前为其编制索引的选项卡。在大多数情况下,如果像大多数数组一样删除了该选项卡,则其余较高的索引选项卡将下移为
var tabs = window.gBrowser.tabs;
for (var i = 2, len = tabs.length; i < len; i++) {
  var uri = window.gBrowser.getBrowserAtIndex(i).currentURI.spec;
  window.gBrowser.removeTab(window.gBrowser.tabContainer.childNodes[i]);
}