2014-10-14 2 views
3

Хотелось бы захватить изображение, возможно, неактивной вкладки.Захват (скриншот) неактивной вкладки

Проблема в том, что при использовании подхода, отображаемого здесь, вкладка часто не получает времени на загрузку до завершения захвата, что приводит к сбою.

Обратный вызов chrome.tabs.update() выполняется до того, как вкладка может быть захвачена.

Я также попытался добавить слушателей к таким событиям, как tabs.onActivated и tabs.onHighlighted, и сделать захват, когда они уволены, но результат тот же. И, как указано этим, я также попробовал highlighted вместо active на chrome.tabs.update() - и комбинация обоих; с прослушивателями и обратными вызовами.

Единственный способ заставить его работать частично лучше, используя setTimeout(), но это очень хакерский, не надежный и уродливый. Тот факт, что нужно активировать вкладку перед захватом, несколько шумный - но если нужно добавить задержки, проблема будет несколько хуже.

Это больше похоже на функцию удобства для моего расширения, но было бы неплохо заставить ее работать.

/* 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

Так что вы обновляете вкладку с помощью метода 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; 
     }); 
    } 
}); 
+0

Спасибо за вход. У меня есть слушатели на всех вкладках, и только один из них - «onActivated» и «onHighlighted». Событие 'onUpdated' не запускается. Статус вкладки (с помощью tabs.get() 'или' tabs.query() ') показывает статус как« полный »и т. Д. Я не могу перезагрузить страницу. – user3342816

+0

Вы также говорите * «С тех пор вы обновляете вкладку с помощью' chrome.tabs.update() '[...]" * - есть ли другие способы сделать это? (Кроме того, просить пользователя сделать это ...: P) – user3342816

+0

@ user3342816 AFAIK, нет других способов сделать вкладку активной. Кстати, я не знаю, можете ли вы поймать какое-то событие, которое сообщит вам, что вкладка готова к захвату ... Я ищу решение в документации ... –

Смежные вопросы