Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
google chrome扩展的javascript屏幕截图_Javascript_Google Chrome_Google Chrome Extension - Fatal编程技术网

google chrome扩展的javascript屏幕截图

google chrome扩展的javascript屏幕截图,javascript,google-chrome,google-chrome-extension,Javascript,Google Chrome,Google Chrome Extension,我目前正在构建一个GoogleChrome扩展,它从不同页面获取多个屏幕截图,并将它们发布到一个端点上。 我遇到的问题是时间不准确。我的意思是,屏幕截图在页面停止加载之前就被截取得太早了。第二,我只收到链接类型WE的第二个屏幕截图(不是类型PA的第一个),好像动作太快了,只是跳过了PA。我对JS不是很在行,如果有人有如何改进代码的建议,我洗耳恭听。多谢各位 background.js var id = 100; var currentObject; var myTimer; function

我目前正在构建一个GoogleChrome扩展,它从不同页面获取多个屏幕截图,并将它们发布到一个端点上。 我遇到的问题是时间不准确。我的意思是,屏幕截图在页面停止加载之前就被截取得太早了。第二,我只收到链接类型WE的第二个屏幕截图(不是类型PA的第一个),好像动作太快了,只是跳过了PA。我对JS不是很在行,如果有人有如何改进代码的建议,我洗耳恭听。多谢各位

background.js

var id = 100;
var currentObject;
var myTimer;

function wait()
   {setTimeout(wait, 1000);}

chrome.browserAction.onClicked.addListener(
function fireTimer() {
    localStorage["allLocations"] = JSON.stringify([{
      'type': 'PA',
      'url': 'https://app.powerbi.com/groups/me/reports/ReportSection2?chromeless=true'
    },
    {
      'type': 'WE',
      'url': 'https://app.powerbi.com/groups/me/reports/ReportSection?chromeless=true'
    }]);
    myTimer = setInterval(fireScreenshots, 1*60*1000);
});

function fireScreenshots(){
  var allLocations = JSON.parse(localStorage["allLocations"]);
  allLocations.forEach( function (arrayItem)
  {
      if (arrayItem.type != undefined && arrayItem.url != undefined){
        retrieveWebPage(arrayItem)
      }
  });
}

function retrieveWebPage(data){
  currentObject = data;
  chrome.tabs.update({
       url: currentObject.url
  });
  chrome.tabs.onUpdated.addListener(function updatedListener(tabId , info) {
  chrome.tabs.onUpdated.removeListener(updatedListener);
  if (info.status == 'complete' && currentObject != undefined) {
    chrome.tabs.captureVisibleTab(null, {format: "jpeg", quality: 100}, function(screenshotUrl) {
      var xhr = new XMLHttpRequest() , formData = new FormData();
      formData.append("image", screenshotUrl);
      formData.append("dashboard_type", currentObject.type);
      xhr.open("POST", "http://intranet/api/powerbi/screenshots_upload/");
      xhr.send(formData);
    });
  }
});
}

奇怪的是,验证
info.status==“complete”
不足以知道页面已加载

1秒钟的超时可能是问题的临时解决方案。可能是您正在加载的网页中的某些脚本正在进行更新/显示网页的工作,即使DOM已完成加载(尤其是在SPAs类型的应用程序中)


wait
函数的作用是什么?因为即使您在代码中的某个地方调用了它,它也不会做任何事情。它根本不会做任何事情,我在上一次尝试中试图延迟一些事情。现代网页使用脚本构建自己,这发生在DOM加载/完成事件之后。最简单的解决方案是将captureVisibleTab代码封装在setTimeout中大约10000毫秒。您能提交解决方案吗?相关:感谢您的解释,太棒了!
setTimeout(function() {
chrome.tabs.captureVisibleTab(null, {format: "jpeg", quality: 100}, function(screenshotUrl) {
      var xhr = new XMLHttpRequest() , formData = new FormData();
      formData.append("image", screenshotUrl);
      formData.append("dashboard_type", currentObject.type);
      xhr.open("POST", "http://intranet/api/powerbi/screenshots_upload/");
      xhr.send(formData);
    });
}, 1000);