【问题标题】:Getting the dimensions of a newly updated image element获取新更新的图像元素的尺寸
【发布时间】:2014-01-20 03:12:12
【问题描述】:

我在获取新更新的图像元素的尺寸时遇到问题。

我正在使用 FileReader 在屏幕上显示图像文件的预览。 文件读取器和相关代码完成执行后,我会检索图像元素的新尺寸,以便相应地调整它们。

在某些浏览器上,信息不会立即更新,我需要添加延迟才能检索新维度。这会导致新图像根据之前图像的尺寸而不是它自己的尺寸进行调整。

如何确定新图片已完全加载?

我原以为FileReader().onloadend 就足够了,但显然不是。我认为这是在 fileReader 加载后执行的,而不是在 DOM 渲染它时执行。 (我说的对吗?)

然后我找到了this question,它建议使用 1 毫秒的超时。这有时有效,但并非总是如此。这似乎取决于浏览器渲染图像的速度(更多可用资源而不是文件大小)。难道我们没有其他方法可以检测这些参数的变化吗?

HTML

<img src="#.png" alt=""/>
<input id="fileInput" type="file" accept='image/*' onChange="loadIt()" />

JS

preview = getElementsByTagName('img')[0];

function loadIt() {

    var imgReader = new FileReader();
    imgReader.readAsDataURL(document.getElementById('fileInput').files[0]); //read from file input

    imgReader.onloadstart = function(e) {
        //
    }
    imgReader.onload = function (imgReaderEvent) {
        if (isImage()) {
            preview.src = imgReaderEvent.target.result;
            //
        }
        else {
            preview.src = 'error.png';
            //
        }
    }
    imgReader.onloadend = function(e) {

        setImage();

        setTimeout(function(){
            setImage();
        }, 1);

        setTimeout(function(){
            setImage();
        }, 2000);
        //
    }
};

function setImage() {
    preview_w = preview.width;
    preview_h = preview.height;
    console.log('dimensions: '+avatar_preview_w+' x '+avatar_preview_h);
    //
};

【问题讨论】:

    标签: javascript dhtml


    【解决方案1】:

    您应该在您的图像上调用preview.onload 或preview.onloadend 以检测它是否已完成加载。在readAsDataURL 之后,你也调用了你的事件代码应该是这样的

    var preview=document.getElementsByTagName("img")[0];
    function loadIt() {
       var imgReader=new FileReader();
       imgReader.onload=function(){
       if (isImage()) {
          preview.src = imgReader.result;
          preview.onload=setImage;
       } else {
          preview.src = 'error.png';
          //
       }
       imgReader.readAsDataURL(document.getElementById('fileInput').files[0]); //read from file input
    }
    function setImage(){
       preview_w = preview.width;
       preview_h = preview.height;
       console.log('dimensions: '+avatar_preview_w+' x '+avatar_preview_h);
    }
    

    【讨论】:

    • 将我的代码更改为在 onload 后执行 readAsDataURL。看不到任何变化。在设置 src 之后添加 preview.onload=setImage; 根本没有帮助。
    • 我的坏:preview.onload=setImage; 确实有效。我使用的是preview.onload=setImage();,虽然有效但没有更新值。这是为什么?
    • @patrick 当你说 preview.onload=setImage(); 时它正在正确执行,因为有左括号和右括号。这就是为什么。
    【解决方案2】:

    您在设置.onload 和.onloadend 之前调用了imgReader.readAsDataURL。

    我不知道您的 setImage() 正文中的某些变量是什么;但是,从这里开始:

    function loadIt() {
    
        var preview = getElementsByTagName('img')[0],
    
            setImage = function () {
            preview_w = preview.width;
            preview_h = preview.height;
            console.log('dimensions: '+avatar_preview_w+' x '+avatar_preview_h);
        },
    
        imgReader = new FileReader();
    
        imgReader.onloadstart = function(e) {};
    
        imgReader.onload = function (imgReaderEvent) {
            if (isImage()) {
                preview.src = imgReaderEvent.target.result;
            }
            else {
                preview.src = 'error.png';
            };
        };
    
        imgReader.onloadend = function(e) {setImage();};
    
        imgReader.readAsDataURL(document.getElementById('fileInput').files[0]); //read from file input
    };
    

    【讨论】:

    • setImage() 中有哪些变量?您还没有解决任何重新检测到该图像已完成加载的问题
    • 您不必重新检测图像是否已加载,因为您已经通过将函数附加到 .onloadend 和 .onload 以及 .onloadstart 来检测图像是否已加载。有一些变量下落不明,因为发布者没有与我们分享它们,或者除非它们是某种类型的全局变量。我只是在解决这个问题。
    • isImage() 是一个自定义函数,如果文件扩展名是 .png、.jpg 等,则返回 true。此外,.onloadend 是在 FileReader 加载图像时执行的,而不是由DOM
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    相关资源
    最近更新 更多