扩展程序的设计使得当您单击固定标签时,它会将其移动到所有固定标签中的最右侧位置。在我不断遇到问题之前,它会工作几次:
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 :(得分:2)
您当前的代码存在一些缺陷:
chrome.tabs.move
方法:您可以通过反复向右移动标签,在最后一个固定标签后移动单个标签。正如我所说的那样,chrome.tabs.move
是异步的,所以当你再次呼叫chrome.tabs.move
时,前一个&#34;移动请求&#34;可能尚未完成。因此你的错误。为了提高效率,请使用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}, ...);
});