• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Javascript Problem Mac OS Safari

KurtK

New member
Hallo zusammen,

folgender Javascript Code funktioniert nicht unter Mac OS, und ich kann mir nicht erklären wieso. Interessanterweise läuft das Skript in der Windowsversion von Safari. Ich habe folgenden ImagePreloader verwendet:

JavaScript Image Preloader - WebReference.com -

Und diesen lediglich um eine kleine "Animation" (Einen Text der zweimal pro Sekunde um einen Punkt erweitert wird) ergänzt. Ich weiß nicht genau, welche Befehl Safari unter Mac OS nicht ausführt, jedenfalls bleibt meine "Animation" in einer Endlosschleife hängen, obwohl alle Bilder entsprechend geladen werden. Die Objektroutine onComplete wird also nicht aufgerufen, ebensowenig onerror oder onabort. Hat jemand dazu irgendwelche Anregungen?

Code:
 var preload_text ='Preloading';

// Animation im Preload Div
function preload_progress()
{
preload_text += '.';
window.document.getElementById("theDiv").innerHTML=preload_text ;

}

//Imagepreloader Objekt initieren

function ImagePreloader(images, callback)

{
 // Hide the content until all is preloaded
 document.getElementById("theDiv").style.display="inline";
 //document.getElementById("page").style.display="none";
   // store the call-back

    window.document.getElementById("theDiv").progress=setInterval("preload_progress()", 500);
   this.callback = callback;


   // initialize internal state.
   this.nLoaded = 0;
   this.nProcessed = 0;
   this.aImages = new Array;


   // record the number of images.
   this.nImages = images.length;


   // for each image, call preload()
   for ( var i = 0; i < images.length; i++ )
      this.preload(images[i]);
}

// Image Preloader Objektfunktionen und Attribute

ImagePreloader.prototype.preload = function(image)
{

   // create new Image object and add to array
   var oImage = new Image;
   this.aImages.push(oImage);

   // set up event handlers for the Image object
   oImage.onload = ImagePreloader.prototype.onload;
   oImage.onerror = ImagePreloader.prototype.onerror;
   oImage.onabort = ImagePreloader.prototype.onabort;

   // assign pointer back to this.
   oImage.oImagePreloader = this;
   oImage.bLoaded = false;
   // assign the .src property of the Image object
   oImage.src = image;
}

ImagePreloader.prototype.onComplete = function()
{

   clearInterval(window.document.getElementById("theDiv").progress);
   this.nProcessed++;
   if (this.bError == true){
    window.document.getElementById("theDiv").innerHTML = "Error while preloading site [one or more images could not be loaded]!";}

   if ( this.nProcessed == this.nImages )
   {
      this.callback(this.aImages, this.nLoaded);
   }

}

ImagePreloader.prototype.onload = function()
{
   this.bLoaded = true;
   this.oImagePreloader.nLoaded++;
   this.oImagePreloader.onComplete();
}

ImagePreloader.prototype.onerror = function()
{
 clearInterval(window.document.getElementById("theDiv").progress);
   this.bError = true;
   this.oImagePreloader.onComplete();
}

ImagePreloader.prototype.onabort = function()
{
 clearInterval(window.document.getElementById("theDiv").progress);
   this.bAbort = true;
   this.oImagePreloader.onComplete();
}
 
Zuletzt bearbeitet:
Ich würde dir empfehlen nicht die onload-Funktion zu nutzen, weil diese eigentlich nur für fenster und frames gedacht ist, aber nicht für Bilder.
Stattdessen könntest du die Eigenschaft image.complete abfragen. Sobald diese true ist wäre das Bild dann geladen. Hier der Code dazu:

PHP:
ImagePreloader.prototype.preload = function(image)
{

   // create new Image object and add to array
   var oImage = new Image;
   this.aImages.push(oImage);

   // set up event handlers for the Image object
   oImage.onerror = ImagePreloader.prototype.onerror;
   oImage.onabort = ImagePreloader.prototype.onabort;

   // assign pointer back to this.
   oImage.oImagePreloader = this;
   oImage.bLoaded = false;
   // assign the .src property of the Image object
   oImage.src = image;

   // check if image has loaded
   var int = setInterval( function() {
      if(oImage.complete){ 
         clearInterval(int);
         ImagePreloader.prototype.onload();
   }, 50);

}
 
Zurück
Oben