【问题标题】:image,onload event not working in chrome图像,onload 事件在 chrome 中不起作用
【发布时间】:2011-04-28 14:28:51
【问题描述】:

我正在使用 html5 来创建拖放图片上传功能。这在 Firefox 中对我很有用,但在 chrome 中,图像 onload 事件仅在第一次触发。如果我只在第一个作品中拖动多个图像,并且如果我在其中拖动第二个图像则失败。我相信问题在于图像加载。

这是我的代码的工作方式,我删除了不相关的部分:

            var img = document.createElement("img");
            var reader = new FileReader();
            var canvas = document.createElement("canvas");
            var canvasData;
            var ctx = canvas.getContext("2d");
            var myFiles;
            var i = 0; 


                 reader.onload = (function (aImg)
                    { 
                        return function (e)
                        {
                            aImg.src = e.target.result;
                        };
                    })(img);

        img.onload = function (){

        //resizes image 
        //draws it to the canvas
        //posts to server

        i++;
        if(i < myFiles.length){
        processNext(i);
                            }
        }



    function processNext(filei) {

         var file = myFiles[filei];

            img.file = file;

            reader.readAsDataURL(file);


        }

i = 0;
myFiles = files;
processNext(0);

有谁知道为什么这在 Firefox 中有效,但在 chrome 中无效?

【问题讨论】:

  • 您不应该在调用之前定义图像 onload 以确保在注册加载事件之前不会发生调用吗?
  • @epascarello 感谢您的回复,我忘了在其余所有代码之后添加这段代码。 img.src 在 processNextFunction 中被改变

标签: javascript html canvas onload filereader


【解决方案1】:

来自铬跟踪器的解释:

这不是错误。 WebKit 更加严格。您必须在替换之前实例化一个新的 Image() 对象,如下所示:

var photo = document.getElementById('image_id');
var img = new Image();
img.addEventListener('load', myFunction, false);
img.src = 'http://newimgsource.jpg';
photo.src = img.src;

来源:http://code.google.com/p/chromium/issues/detail?id=7731#c12

【讨论】:

  • 嗯.. 但是如果我的英语没有出卖我,chrome 的行为是不正确的,并且每次更改 src 时都必须触发 load 事件下载成功完成。 w3.org/TR/html5/embedded-content-1.html#the-img-element
  • @Harut 感谢您的回复。我尝试了你的建议我添加了 var img = new Image();在我更改源之前的 processNext 函数中,但我得到与以前相同的结果。您提到每次更改 src 时都必须触发 load 事件我不明白您是说我需要手动执行此操作吗?
  • 我刚才说FF的行为似乎是对的。通用的方法应该是销毁旧的图像元素并创建新的图像元素来代替它。
  • @Harut 谢谢我让它工作你是对的我每次都必须创建一个新图像。我更喜欢 Firefox 的方式:)
  • 抱歉,这是我在 * 上的第一篇文章。我相信我现在已经接受了。
【解决方案2】:

这很奇怪,以上都不适合我。我将图像变量定义为本地变量并将其更改为全局变量并开始工作。这有意义吗?谁能解释一下?

这对我不起作用:

function loadImage() {  
  var ImageToLoad = new Image();
  ImageToLoad.onload = function() {
      console.log("finish loading");
  };        
  ImageToLoad.src = "myimage.png";
}

这确实有效:

  var ImageToLoad = new Image();
  function loadImage() {
  ImageToLoad.onload = function() {
      console.log("finish loading");
  };        
  ImageToLoad.src = "myimage.png";
}

【讨论】:

  • 注意你的变量名在这里有不同的大小写
  • ImageToLoad 的大写 I 应该是小写的
最近更新 更多