Newsgroup: it.comp.lang.javascript
Titolo: Safari, Image.onerror, AHIA!

Sto scrivendo uno script per uno slideshow, e al momento di gestire gli
errori di caricamento delle immagini mi sono imbattuto in questo
comportamento anomalo di Safari.
In sostanza se gli elementi immagine vengono creati dinamicamente, il
gestore onerror non viene mai richiamato :(
Nessun problema invece per le immagini "statiche" nel documento HTML.
Piccolo esempio:
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
        "
http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd
">
<html xmlns="
http://www.w3.org/1999/xhtml
" xml:lang="it" lang="it">
<head>
  <meta http-equiv="content-type" content="text/html;
charset=iso-8859-1" />
  <title>Image trouble</title>
  <script type="text/javascript">
    function test()
    {
    var thumb = document.createElement("img");
 
    alert(thumb);
    // FF: Object HTMLImageElement
    // Safari: Object IMG
 
    thumb.onload = function()
    {
      alert(this.src);
    };
    thumb.onabort = function()
    {
      alert("Abort! " + this.src);
    };
    thumb.onerror = function()
    {
      alert("Errore! " + this.src);
      // FF: tutto ok
      // Safari: non esegue mai l'alert
    };
    document.getElementById("casa").appendChild(thumb);
    thumb.src = "
http://immagine.che.non.esiste
";
    }
  </script>
</head>
<body onload="test()">
  <div id="casa"></div>
</body>
</html>
Problema gia' riscontrato da qualcuno? Conoscete un workaround?
-- 
Firma in ferie

     };
L'errore si verifica anche se sostituisci:
	var thumb = document.createElement("img");
con:
	var thumb = new Image();
?
-- 
~ "When you have eliminated the impossible, whatever remains,
however improbable, must be the truth." (S.H.)

 ?
ho anche provato con new Image(), ma in quel caso Safari non aggiunge
neppure il nodo:
//...
 document.getElementById("casa").appendChild(thumb);
//...
DOM Exception 8
aspetta aspetta...
<
http://www.html.com/forums/safari-web-browser/6937-inserting-image-node
s-safari.html>
-- 
Firma in ferie

 s-safari.html>
...risolto con i metodi W3C DOM API ^^;;;
    var thumb = document.createElement("img");
 
    thumb.setAttribute("onload","alert(this.src)");
    thumb.setAttribute("onerror","alert('error: '+this.src)");
    thumb.setAttribute("onabort","alert('abort: '+this.src)");
    document.getElementById("casa").appendChild(thumb);
    thumb.src = "
http://immagine.che.non.esiste
";
    // Oppure:
    // thumb.setAttribute("src","
http://immagine.che.non.esiste
");
ad occhio mi sembrerebbe un bug grande quanto una casa...
-- 
Firma in ferie

 DOM Exception 8
E' normale, stai tentando di aggiungere qualcosa al DOM che non è un
elemento.
(Ora non ho modo di leggere il link, sorry, magari gli dò un'occhiata poi se
il problema persiste)


 ...risolto con i metodi W3C DOM API ^^;;;
Che però non funzionerebbero su IE, per la questione famosa del binding.
So che probabilmente tu stai facendo qualcosa per la dashboard, ma sarebbe
utile avere una procedura crossbrowser in caso si debba fare un'operazione
del genere su un sito web.
Fammi sapere per il new Image.


 elemento.
uhm... FF invece lo digerisce, e l'alert su "thumb" restituisce "[object
HTMLImageElement]", quindi pare che sotto l'implementazione si celi un
elemento DOM vero e proprio.
Ancora piu' strano, Safari con new Image() e immagine non esistente
richiama l'onload:
    var thumb = new Image();
    thumb.onload = function()
    {
      alert("Load: "+this.src);
    };
    thumb.onerror = function()
    {
      alert("Error: "+this.src);
    };
    thumb.onabort = function()
    {
      alert("Abort: "+this.src);
    };
    thumb.src = "
http://immagine.che.non.esiste
";
    // Safari: "Load: undefined"
-- 
Firma in ferie

 del genere su un sito web.
per il lato Safari (v2) tutto ok con l'accortezza di utilizzare la via
img = document.createElement("img")
img.setAttribute("onerror", "codice()");
per altri gestori di eventi e proprieta' pare non sussista alcun
problema.
-- 
Firma in ferie

     // Safari: "Load: undefined"
E' strano che riporti undefined, però. Dovrebbe riportare ugualmente l'src,
non concordi?
Che "this", forse, non si riferisce all'oggetto image? Che sia in un qualche
modo decontestualizzato?
Cosa ti risponde un semplice "alert(this)" ?


 img.setAttribute("onerror", "codice()");
Che è impraticabile, su web. A meno di non fare uno sniffing (brr) del
browser.


 Cosa ti risponde un semplice "alert(this)" ?
e infatti: [object Window]
-- 
Firma in ferie

 e infatti: [object Window]
Oh bella. Urge un'approfondimento.


 e infatti: [object Window]
Oh bella. Urge un approfondimento, in serata.
Se hai novità, facci sapere...



-- 
Firma in ferie


Ma che bello. A quando una versione meno bacata di Safari?


 Già so che dirai che per qualche motivo è sbagliato, ma reggerò :-D
Oggi non sono in vena. E poi so già che ci arriverai da solo, a tempo
debito. Quindi a questo giro evito..
