想捕获可能不活跃的标签图片。
问题是,当使用此处显示的方法时,选项卡通常在捕获完成之前没有时间加载,从而导致失败。
在捕获标签之前执行chrome.tabs.update()
回叫。
我还尝试将侦听器添加到tabs.onActivated
和tabs.onHighlighted
之类的事件中,并在触发这些事件时进行捕获,但结果是相同的。而且,作为一个给定的,我在highlighted
上尝试了active
而不是chrome.tabs.update()
- 并且两者结合在一起;听众和回电。
使其更好地工作的唯一方法是使用setTimeout()
,但这是非常hackish,不可靠和丑陋。在捕获之前必须激活选项卡的事实有些嘈杂 - 但如果必须添加延迟,则问题会变得更糟。
这更像是我的扩展程序的一个便利功能,但最好能让它工作。
/* Not the real code, but the same logic. */
var request_tab = 25,
request_win = 123
old_tab;
/* Check which tab is active in requested window. */
chrome.tabs.query({
active : true,
windowId : request_win
}, function (re) {
old_tab = re[0].id;
if (old_tab !== request_tab) {
/* Requested tab is inactive. */
/* Activate requested tab. */
chrome.tabs.update(request_tab, {
active: true
}, function () {
/* Request capture */ /* CB TOO SOON! */
chrome.tabs.captureVisibleTab(request_window, {
format : 'png'
}, function (data) {
/* ... data ... */
/* Put back old tab */
chrome.tabs.update(old_tab, {
active: true
});
})
});
} else {
/* Requested tab is active. */
/* Request capture. */
chrome.tabs.captureVisibleTab(request_window, {
format : 'png'
}, function (data) {
/* ... data ... */
})
}
});
答案 0 :(得分:1)
由于您使用chrome.tabs.update()
方法更新了标签,因此只要标签属性发生变化,就会调用回调,但显然,在加载页面之前 。要解决此问题,您应记住标签尚未准备好,并使用chrome.tabs.onUpdated
事件检查其准备就绪,您可以使用chrome.tabs.captureVisibleTab()
。
以下是解决方案:
var request_tab = 25,
request_win = 123,
waiting = false,
// ^^^ Variable used to check if tab has loaded
old_tab;
// Check which tab is active in requested window.
chrome.tabs.query({
active : true,
windowId : request_win
}, function (re) {
old_tab = re[0].id;
if (old_tab !== request_tab) {
// Requested tab is inactive
// Activate requested tab
chrome.tabs.update(request_tab, { active: true });
// Tab isn't ready, you can't capture yet
// Set waiting = true and wait...
waiting = true;
} else {
// Requested tab is active
// Request capture
chrome.tabs.captureVisibleTab(request_window, {
format : 'png'
}, function (data) {
// Elaborate data...
})
}
});
chrome.tabs.onUpdated.addListener(function(tabID, info, tab) {
// If the tab wasn't ready (waiting is true)
// Then check if it's now ready and, if so, capture
if (waiting && tab.status == "complete" && tab.id == request_tab) {
// Now you can capture the tab
chrome.tabs.captureVisibleTab(request_window, {
format : 'png'
}, function (data) {
// Elaborate data...
// Put back old tab
// And set waiting back to false
chrome.tabs.update(old_tab, { active: true });
waiting = false;
});
}
});