我正在尝试将服务器上生成的一些图像预加载到一个小网站上。预加载是使用setwindowtimeout完成的,使用一个image对象,设置onload回调,然后应用新的请求URI。
对于某些请求,服务器可能必须发出图像“未更改”的信号,我通过发送一个小的1x1像素的GIF(似乎我需要发送一个实际图像,返回空内容将导致图像对象不触发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;
},
我似乎有两个问题:
a)首次调用函数时imgobj.complete为false,但只调用一次(因此我将其注释掉),并且
b)加载时,我似乎无法依赖图像的宽度或高度属性。从我对获取1x1像素的测试中,它有时会读取50,这在创建新图像时似乎是默认值(),有时会读取1的正确大小。
我的最终目标是让一小部分JavaScript逻辑定期查询服务器以获取新图像,如果没有发生任何新情况(1像素图像)或加载新图像,则不执行任何操作。我可能是走错了路,或者忽略了重要的财产或电话,所以我很高兴收到反馈。
编辑:根据mplungjan的建议,我改为预加载到一个隐藏的div中,这有助于解决问题b)。但仍然无法解决问题a);报告完成=错误一次,不再调用