Considérez les points suivants (fragile) du code JavaScript:
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 Question(s)
- Si la largeur de l'image et de la hauteur correcte immédiatement?
- Si la toile dessiner le travail tout de suite?
- Si l'
onload
callback (mise après la src a été modifié), - elle être invoquée?
Les Tests Expérimentaux
J'ai créé une simple page de test avec le même code. Dans Safari de mes premiers essais, à la fois par l'ouverture de la page HTML en local (file:///
url) et de le charger à partir de mon serveur, ont montré ce travail: la hauteur et la largeur est correct, la toile dessiner des œuvres, et l' onload
aussi des incendies.
Dans Firefox v3.6 (OS X), le chargement de la page après avoir lancé le navigateur montre que la hauteur/largeur est pas correcte immédiatement après le réglage, drawImage()
d'échec. ( onload
Gestionnaire n'feu, cependant.) Le chargement de la page à nouveau, cependant, montre que la largeur/hauteur correcte immédiatement après le réglage, et drawImage()
de travail. Il semblerait que Firefox met en cache le contenu des données de l'URL d'une image et l'a immédiatement disponible lorsque utilisé dans la même session.
Dans Chrome v8 (OS X) je vois les mêmes résultats que dans Firefox: l'image n'est pas disponible immédiatement, mais prend un certain temps, de manière asynchrone "charge" à partir des données de l'URL.
En plus de la preuve expérimentale de ce que les navigateurs ci-dessus fait ou ne fonctionne pas, j'aimerais vraiment des liens vers les specs sur la façon dont cela est censé se comporter. Jusqu'à présent, mon Google-fu n'a pas été à la hauteur de la tâche.
Jouer En Toute Sécurité
Pour ceux qui ne comprennent pas pourquoi le ci-dessus peut être dangereux, sachez que vous devez utiliser les images comme ça pour être sûr:
// 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 = '...';