Sollte ein Bild src auf Daten URL sofort verfügbar sein?

Betrachten Sie das folgende (zerbrechlich) JavaScript code:

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!'); };

Die Frage(N)

  • Sollte die Bildbreite und-Höhe werden sofort korrigiert werden?
  • Sollte die Leinwand zeichnen, sofort mit der Arbeit an?
  • Sollte die onload Rückruf (nach der src geändert wurde) aufgerufen werden?

Experimentelle Tests
Ich erstellte eine einfache test-Seite mit ähnlichem code. In Safari meinen ersten tests, sowohl durch das öffnen der HTML-Seite lokal (file:/// url) und laden Sie es von meinem server, zeigte alles: die Höhe und Breite stimmt, die Leinwand zeichnen, Werken, und die onload auch feuert.

In Firefox v3.6 (OS X), das laden der Seite nach dem Start des Browsers zeigt, dass die Höhe/Breite ist nicht richtig, sofort nach der Einstellung drawImage() ausfällt. (Die onload - handler kann jedoch ausgelöst werden.) Laden Sie die Seite erneut, jedoch zeigt die Breite/Höhe nicht richtig, sofort nach der Einstellung, und drawImage() arbeiten. Es scheint, dass Firefox werden die Inhalte der Daten-URL als Bild und hat es sofort zur Verfügung, wenn in der gleichen Sitzung.

In Chrom v8 (OS X) sehe ich die gleichen Ergebnisse wie in Firefox: das Bild ist nicht sofort verfügbar, aber es dauert einige Zeit, um asynchron 'load' aus dem data-URL.

Zusätzlich zu den experimentellen Beweis für das, was in Browsern oben funktioniert oder nicht funktioniert, möchte ich gerne die links zu den Spezifikationen, wie dies Verhalten sollen. Soweit mein Google-fu hat nicht bis zu der Aufgabe.

Es Zu Spielen Sicher
Für diejenigen, die nicht verstehen, warum die oben gefährlich sein kann, wissen, dass Sie verwenden sollten Bilder wie dieses, um sicher zu sein:

//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 = '...';

InformationsquelleAutor der Frage Phrogz | 2011-01-23

Schreibe einen Kommentar