2011-04-28 14 views
6

Estoy usando html5 para crear la funcionalidad de carga de imágenes arrastra y suelta. Esto funciona muy bien en Firefox, pero en Chrome, el evento de carga de la imagen solo se dispara por primera vez. Si arrastro varias imágenes solo en las primeras obras, si lo arrastro, falla. Creo que el problema es con la carga de la imagen.imagen, el evento onload no funciona en cromo

aquí es la forma en que mi código funciona He quitado las secciones irrelevantes:

  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); 

¿alguien sabe por qué esto funciona en Firefox, pero no cromo?

+0

¿No debería definir el proceso de carga de la imagen antes de hacer la llamada para asegurarse de que la llamada no se produce antes de la evento de carga está registrado? – epascarello

+0

@epascarello Gracias por la respuesta, olvidé agregar esta pieza de código que sigue al resto. el img.src se cambia en el procesoSiguienteFunction – Early73

Respuesta

7

Explicación del rastreador de cromo:

Esto no es un error. WebKit es simplemente más estricto. Usted debe crear una instancia de una imagen() objeto nuevo antes de la sustitución, así:

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

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

+2

Hm .. Pero si mi inglés no me traiciona, el comportamiento de Chrome no es correcto y el evento de carga debe activarse cada vez que se cambia src la descarga finaliza satisfactoriamente. http://www.w3.org/TR/html5/embedded-content-1.html#the-img-element – Harut

+0

@Harut Gracias por la respuesta. Intenté lo que sugirió que agregue var img = new Image(); en mi función processNext antes de cambiar la fuente pero obtengo los mismos resultados que antes. Usted mencionó que el evento de carga se debe disparar cada vez que se cambia el src. No entiendo si está diciendo que necesito hacerlo manualmente. – Early73

+0

Acabo de decir que el comportamiento de FF parece ser el correcto. Y la forma universal debería ser destruir un elemento de imagen antiguo y crear uno nuevo en lugar de él. – Harut

0

Esto es extraño, ninguna de las anteriores trabajó para mí. Estaba definiendo la variable de imagen como local y la cambié a global y comenzó a funcionar. ¿Esto tiene sentido? ¿Alguien puede explicarlo?

Esto aún no ha trabajado para mí:

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

Este trabajo lo hizo:

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

Tenga en cuenta que su nombre de variable tiene un caso diferente aquí –

Cuestiones relacionadas