获取javascript预载图像的大小

问题描述:

我正尝试将服务器上生成的一些图像预加载到一个小网站。使用setWindowTimeout完成预加载并使用Image对象,设置onload回调,然后应用新请求uri。获取javascript预载图像的大小

对于某些请求,服务器可能不得不发信号通知图像是'未更改',而我通过发送一个小的1x1像素gif来做到这一点(似乎我需要发送实际图像,返回空的内容将导致Image对象不会触发onload)。在我的onload处理程序中,我想确定提取的图像的大小,然后确定是否应该用给定的图像更新可视图像。

下面是我目前的解决方案的片段(输出是一个div来帮助调试):

 refresh: function() { 
     var newSrc = '/screenshot.ashx?tick=' + new Date().getTime(); 
     var imgObj = new Image(); 
     var self = this; 

     // this is called when load is done 
     imgObj.onload = function() { 
      //if (imgObj.complete) 
      // return; 
      if (imgObj.width > 1 && imgObj.height > 1) { 
       output.innerHTML += '<br/>Updating image:' + newSrc; 
       img.src = newSrc; //fiddler shows no reload here, read from cache 
      } 
      else { 
       output.innerHTML += '<br/>Empty image:' + newSrc; 
      } 
      self.setupNewRefresh(); 
     }; 

     output.innerHTML += '<br/>Loading image:' + newSrc; 
     imgObj.src = newSrc; 
    }, 

我似乎有两个问题:

一)imgObj.complete是假的时该函数首先调用但它仅调用一次(因此我的评论吧)和

b)我似乎无法加载时依赖于图像的宽度或高度属性。从我获取1x1像素的测试中,它有时会读出50,这在创建新图像时似乎是默认值(),有时会读出正确的大小1.

我的最终目标是有一个小块定期向服务器查询新图像的javascript逻辑,如果没有发生新的事情(1像素图像)或加载新图像,则不执行任何操作。我可能会在这里以错误的方式进行讨论,或者忽​​略了重要的属性或通话,所以我很乐意收到反馈。

编辑:在从mplungjan建议,我预装在一个隐藏的div来代替,这让我有问题,B)。仍然没有解决问题a)虽然;报告的完整=假一次,不再调用

+0

似乎你真的需要将图像加载到DOM来查看实际大小。我用一个隐藏的div来做到这一点。 – mplungjan 2010-07-22 13:28:26

+0

您在加载调用时给src属性一个值...(img.src = newSrc;)我不认为那是必需的。当图像存在时,它会自动从缓存中重新加载。将其留给浏览器。 – foxybagga 2012-01-03 05:21:55

我会继续前进,回答我的问题。

预加载图像到在DOM,而不是代码级元素,一个隐藏的元素是为实际得到正确的尺寸(感谢mplungjan)的伎俩。 a)问题,即完整事件,仍未解决。

作为一个方面说明我结束了使用,而不是因为它允许通过看返回的有效载荷的大小了XMLHttpRequest。