Considere lo siguiente (frágil) código JavaScript:¿Debería estar disponible la configuración de una imagen src a la URL de datos disponible de inmediato?
var img = new Image;
img.src = "data:image/png;base64,..."; // Assume valid data
// Danger(?) Attempting to use image immediately after setting src
console.log(img.width, img.height);
someCanvasContext.drawImage(img, 0, 0);
// Danger(?) Setting onload after setting src
img.onload = function(){ console.log('I ran!'); };
La Pregunta (s)
- caso de que el ancho de la imagen y la altura correcta de inmediato?
- ¿Debería dibujar el lienzo de inmediato?
- ¿Debería invocarse la devolución de llamada
onload
(establecida después de que se cambió el src)?
pruebas experimentales
he creado un simple test page con un código similar. En Safari mis primeras pruebas, tanto mediante la apertura de la página HTML localmente (file:///
url) y cargarlo desde mi servidor, mostraron todo funcionando: la altura y la anchura es correcta, el lienzo dibujan las obras, y la onload
incendios también.
En Firefox v3.6 (OS X), cargar la página después de iniciar el navegador muestra que el alto/ancho no es correcto inmediatamente después de la configuración, drawImage()
falla. (Sin embargo, el controlador onload
se activa). Sin embargo, al volver a cargar la página, se muestra que el ancho/alto es correcto inmediatamente después de la configuración y drawImage()
funciona. Parece que Firefox guarda en caché el contenido de la URL de datos como una imagen y la tiene disponible de inmediato cuando se usa en la misma sesión.
En Chrome v8 (OS X) Veo los mismos resultados que en Firefox: la imagen no está disponible de inmediato, pero toma un tiempo para 'cargarse' asincrónicamente desde la URL de datos.
Además de la prueba experimental de qué navegadores funciona o no, me encantan los enlaces a las especificaciones sobre cómo se supone que debe comportarse. Hasta ahora, mi Google-fu no ha estado a la altura de la tarea.
Apostar sobre seguro
Para aquellos que no entienden por qué lo anterior podría ser peligroso, sabe que debe usar imágenes como ésta sea segura:
// First create/find the image
var img = new Image;
// Then, set the onload handler
img.onload = function(){
// Use the for-sure-loaded img here
};
// THEN, set the src
img.src = '...';
Definitivamente debe configurar 'on' antes de configurar' src'. Pero si el evento de carga a veces se activa en la constelación actual, entonces establecer el URI de "datos" es ciertamente asíncrono, lo que me sorprendería. ¡Interesante! –
¿No es más seguro suponer que no, para aumentar el tiempo de espera y continuar después de que el navegador tenga la posibilidad de volver a dibujarse? –
@mP Sí, ciertamente lo es; Edité mi pregunta para aclarar esto unos 5 minutos antes de su comentario :) Sin embargo, esto no invalida la pregunta. Suponiendo que el comportamiento en Chrome y FF es permisible, no es un error, entonces, es vital, de hecho, ir a lo seguro. – Phrogz