代码之家  ›  专栏  ›  技术社区  ›  soren.enemaerke

获取javascript预加载图像的大小

  •  2
  • soren.enemaerke  · 技术社区  · 16 年前

    我正在尝试将服务器上生成的一些图像预加载到一个小网站上。预加载是使用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);报告完成=错误一次,不再调用

    1 回复  |  直到 16 年前
        1
  •  1
  •   soren.enemaerke    16 年前

    我会继续回答我自己的问题。

    将图像预加载到DOM中的隐藏元素(而不是代码级元素)中是获得正确大小的诀窍(感谢mplungjan)。a)问题,即完整事件,仍未解决。

    作为旁注,我最终使用了xmlhttpRequest,因为它允许我查看返回的有效负载的大小。

    推荐文章