如何知道浏览器加载图像后何时完成处理?

阿尔瑙·卡斯特维(ArnauCastellví)

创建图像对象时,可以使用“ complete”属性或“ onload”方法知道何时完全加载图像,然后,该图像已使用了一段时间(例如,调整大小),在大文件中可能需要几秒钟的时间。
如何知道浏览器加载图像何时完成处理编辑:在示例中可以看到“完成”消息和图像外观之间的延迟,我想避免这种情况。使用“ onload”方法的示例:



var BIGimage;
	putBIGimage();
	function putBIGimage(){
		BIGimage=document.createElement("IMG");
		BIGimage.height=200;
		BIGimage.src="http://orig09.deviantart.net/5e53/f/2013/347/f/d/i_don_t_want_to_ever_leave_the_lake_district_by_martinkantauskas-d6xrdch.jpg";
		BIGimage.onload=function(){waitBIGimage();};
	}
	function waitBIGimage(){
			console.log("Complete.");
			document.body.appendChild(BIGimage);
	}

使用“ complete”属性的示例:

var BIGimage;
	putBIGimage();
	function putBIGimage(){
		BIGimage=document.createElement("IMG");
		BIGimage.height=200;
		BIGimage.src="http://orig09.deviantart.net/5e53/f/2013/347/f/d/i_don_t_want_to_ever_leave_the_lake_district_by_martinkantauskas-d6xrdch.jpg";
		waitBIGimage();
	}
	function waitBIGimage(){
		if (!BIGimage.complete){
			console.log("Loading...");
			setTimeout(function(){
				waitBIGimage();
			},16);
		} else {
			console.log("Complete.");
			document.body.appendChild(BIGimage);
		}
	}

编辑:感谢@Kaiido的响应,我为等待图像处理做了此解决方案。

var imagesList=["https://omastewitkowski.files.wordpress.com/2013/07/howard-prairie-lake-oregon-omaste-witkowski-owfotografik-com-2-2.jpg",
		"http://orig03.deviantart.net/7b8d/f/2015/289/0/f/0ffd635880709fb39c2b69f782de9663-d9d9w6l.jpg",
		"http://www.livandiz.com/dpr/Crater%20Lake%20Pano%2016799x5507.JPG"];
var BIGimages=loadImages(imagesList);
onLoadImages(BIGimages,showImages);

function loadImages(listImages){
	var image;
	var list=[];
	for (var i=0;i<listImages.length;i++){
		image=document.createElement("IMG");
		image.height=200;
		image.src=listImages[i]+"?"+Math.random();
		list.push(image);
	}
	return list;		
}

function showImages(){
	loading.style.display="none";
	for (var i=0; i<BIGimages.length;i++){
		document.body.appendChild(BIGimages[i]);
	}
};

function onLoadImages(images,callBack,n) {
	if (images==undefined) return null;
	if (callBack==undefined) callBack=function(){};
	else if (typeof callBack!="function") return null;
	var list=[];
	if (!Array.isArray(images)){
		if (typeof images =="string") images=document.getElementById(images);
		if (!images || images.tagName!="IMG") return null;
		list.push(images);
	} else list=images;
	if (n==undefined || n<0 || n>=list.length) n=0;
	for (var i=n; i<list.length; i++){
		if (!list[i].complete){
			setTimeout(function(){onLoadImages(images,callBack,i);},16);
			return false;
		}
		var ctx = document.createElement('canvas').getContext('2d');
		ctx.drawImage(list[i], 0, 0);
	}
	callBack();
	return true;
}
<DIV id="loading">Loading some big images...</DIV>

海道

这是一种方法。

CanvasContext2DdrawImage方法是同步的。在能够使用此方法之前,浏览器必须完全渲染图像。

因此,您可以在方法中将其用作等待waitBIGimage方法。

var BIGimage;
putBIGimage();

function putBIGimage() {
  BIGimage = document.createElement("IMG");
  BIGimage.height = 200;
  BIGimage.src = "https://upload.wikimedia.org/wikipedia/commons/c/cf/Black_hole_-_Messier_87.jpg?r=" + Math.random();
  BIGimage.onload = waitBIGimage;
  BIGimage.onerror = console.error;
}

function waitBIGimage() {
  // only for demo
  // we've got to also log the time since even the console.log method will be blocked during processing
  var start = performance.now();
  console.log('waiting', start);

  // this is all needed
  var ctx = document.createElement('canvas').getContext('2d');
  ctx.drawImage(this, 0, 0);

  // demo only
  var end = performance.now();
  console.log("Complete.", end);
  console.log(`it took ${end - start}ms`)

  // do your stuff
  document.body.appendChild(BIGimage);
}

在我的Firefox上,大约需要1秒钟来处理图像,而在我的Chrome上,似乎在onload事件触发时图像已被处理。

但是方法的一个大问题是它是同步的,因此将在处理Image的所有时间内阻止脚本。

HTMLImageElement接口最近已扩展为包含一个decode()method,它应该允许我们等到可以绘制图像为止,就像您想要的那样。但是,从早期的测试中,我发现此方法具有欺骗性,但这可能是由于早期实现的错误:

var BIGimage;
putBIGimage();

function putBIGimage() {
  BIGimage = document.createElement("IMG");
  BIGimage.height = 200;
  BIGimage.src = "https://upload.wikimedia.org/wikipedia/commons/c/cf/Black_hole_-_Messier_87.jpg?r=" + Math.random();
  BIGimage.onload = e => console.log('load event', performance.now());
  BIGimage.decode().then(waitBIGimage);
  BIGimage.onerror = console.error;
}

function waitBIGimage() {
  var start = performance.now();
  // only to see if it worked fine
  var ctx = document.createElement('canvas').getContext('2d');
  ctx.drawImage(BIGimage, 0, 0);

  // demo only
  var end = performance.now();
  console.log(`it took ${end - start}ms to draw`)

  // do your stuff
  document.body.appendChild(BIGimage);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

浏览器如何知道脚本是否已完成加载?

任务完成后 Gulp 重新加载浏览器

浏览器如何知道已加载多少页面?

如何知道NetworkImage何时完成加载?

如何根据浏览器宽度加载图像

如何让浏览器以编程方式加载图像

浏览器如何加载图像?大拇指是必要的吗?

(CORS)浏览器如何知道何时发出飞行前请求

如何知道移动浏览器何时显示底部导航栏?

如何知道aiortc中的浏览器对等体何时断开连接?

您如何知道何时从缓存中检索浏览器?

jQuery load() 以及如何知道动态添加的图像何时完成加载?

如何确定何时关闭浏览器?

跨浏览器问题:首次加载后,Firefox无法从php文件加载图像

根据浏览器宽度加载图像

使用window.open并将HTML直接写入新页面时,如何使浏览器知道页面已完成“加载”?

如何知道Google Chrome浏览器是否已完成同步?

浏览器如何知道scss文件?

如何知道浏览器窗口大小?

知道函数何时完成处理

检测何时加载iframe内容(跨浏览器)

浏览器何时缓存下载的图像?

第二次刷新浏览器后在画布上加载svg图像

如何知道浏览器限制了 3rd 方图像的显示?

jquery处理递归ajax调用,如何告诉浏览器它已经完成

运行“ ng serve --watch”时,如果源发生任何更改,浏览器如何知道何时刷新?

在Puppeteer Sharp中完成程序后如何停止关闭浏览器

在PHP中,即使浏览器退出后,如何确保脚本将继续运行直到完成?

在Python中强制Selenium等待浏览器完成加载