捕获(非屏幕截图)的屏幕截图

时间:2014-10-14 10:07:35

标签: javascript google-chrome google-chrome-extension

想捕获可能不活跃的标签图片。

问题是,当使用此处显示的方法时,选项卡通常在捕获完成之前没有时间加载,从而导致失败。

在捕获标签之前执行chrome.tabs.update()回叫。

我还尝试将侦听器添加到tabs.onActivatedtabs.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 ...  */
        })
    }
});

1 个答案:

答案 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;
        });
    }
});