Slideshow Problem: "Crash" beim Einfügen von Texten

mike_mtm

Grünschnabel
Hallo zusammen!

Ich bitte um Hilfe zu meinem Problem. Ich war die letzten Tage damit beschäftigt, eine Slideshow für meine Urlaubsbilder zu basteln. Ganz "primitiv": keine Thumbnails, nur nächstes Bild, voriges Bild sowie ein Text zum jeweiligen Bild. Das ganze mit ein bissl HTML und CSS layouten, fertig.

Dazu hab ich diesen und diesen Beitrag hier im Forum als Inspiration genutzt, da ich mich mit JavaScript nicht so gut auskenne.

Das Problem ist nun, dass beim Einfügen der Texte das ganze Script nicht mehr geht, die Firefox Fehlerkonsole seltsame Meldungen ausgibt, die vorher nicht da waren und beim "Zurückändern" (zum Zeitpunkt wo's vorher get hat) auch nix mehr läuft :eek:
Momentan sieht es so aus, dass die Länge des jeweiligen Bildtextes (zwei Zeilen mit 800px Breite) zu Abstürzen führt. Ich kann's mir nur so erklären, dass in meinem Script die beiden Arrays nicht miteinander können. Oder das text[1] = '<b>Titel 1</0> Text 1.'; nicht korrekt in <div id="text_container"> geschrieben wird. (?) Wenn dieser Fehler auftritt, dreht zusätzlich die Fehlerkonsole durch und meint, ich hätte prevdeact() nicht definiert und vor ' bei '<b>Titel 1</0> Text 1.' müsste noch ein ;. (Was aber nicht sein kann, da das Teil mit "wenig Text" zu funktionieren scheint.

Kann mir nun bitte jemand helfen, das Script so zu verändern, dass das Image-Array mittels diesem Code funktioniert? (Sollte ja nicht so schwer sein, aber ich komme nicht mehr weiter).

Code:
var image = new Array();
image[0] = new Image();
image[0].src = "pic001.jpg";
image[0].txt = "Text 1";
image[1] = new Image();
image[1].src = "pic002.jpg";
image[1].txt = "Text 2";

Das heisst:. Ich würde gerne image[].src und image[].txt mit "document.getElementById" sauber in ein <div> schreiben und nur ein Array nutzen, statt wie jetzt zwei. Wie geht das?


Hier die Info's zu meinem jetzigen Stand:

1. HTML-Datei:
(.css und .js sind in externen Dateien untergebracht)

HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Slideshow Master</title>
<LINK rel="stylesheet" type="text/css" href="css/style_slideshow.css">
<script src="js/javascript_slideshow.js" type="text/javascript"></script>
</head>

<body onload="prevdeact()">
<div id="main">
   <div id="navi_previous">
      <a id="navi_previouslink" href="#" onclick="previous()" title="voriges Bild"><img src="img/arrow_left.gif" alt="voriges Bild" title="voriges Bild"></a>
   </div>
   <div id="frame">
      <div id="title_container">
         <p>Titel der Slideshow</p>
      </div>
      <div id="img_container">
         <img src="img/blank.jpg">
      </div>
      <div id="text_container">
         <b>Wenn</b> Du das hier lesen kannst, ist höchtwahrscheinlich JavaScript in Deinem Browser deaktiviert. Sollte das nicht weiterhelfen und Du nutzt vielleicht den Internet Explorer, ein Tip: Firefox ist so ein schöner Browser :)
      </div>
      <div id="navi">
      </div>
   </div>
   <div id="navi_next">
      <a id="navi_nextlink" href="#" onclick="next()" title="nächstes Bild"><img src="img/arrow_right.gif" alt="nächstes Bild" title="nächstes Bild"></a>
   </div>
   <div id="backtostart">
      <a href="../start.html">Zurück zur Startseite.</a>
   </div>
</div>
</body>
</html>


2. CSS-Datei

Code:
body {
background-color:#505050;
margin:0px;
padding:0px;
}

/* removes borders when images are used as links */
img {
border:none;
}

P.title {
margin:0px;
padding:0px;
font-family:Arial, Helvetica, sans-serif;
font-size:30px;
line-heigth:35px;
color:#FFFFFF;
text-align:top;
}

P.text {
margin:0px;
padding:0px;
font-family:Arial, Helvetica, sans-serif;
font-size:11px;
line-heigth:15px;
color:#FFFFFF;
}

#title_container P {
margin:0px;
padding:0px;
font-family:Arial, Helvetica, sans-serif;
font-size:20px;
line-heigth:30px;
color:#FFFFFF;
}

#main {
width:990px;
height:655px;
position:absolute;
top:50%;
left:50%;
margin-top:-320px;
margin-left:-495px;
background-color:#505050;
}

#frame {
width:840px;
height:640px;
position:absolute;
left:75px;
/* background-color:#FFFFFF; */
background-image:url(../img/frame.gif);
}

#img_container {
width:800px;
height:600px;
position:absolute;
top:20px;
left:20px;
background-color:#333333;
}

#text_container {
width:794px;
height:60px;
position:absolute;
top:560px;
font-family:Arial, Helvetica, sans-serif;
font-size:11px;
line-height:15px;
color:#FFFFFF;
padding-left:3px;
padding-right:3px;
margin-left:20px;
margin-right:20px;
background-image:url(../img/text_bkgd.png);
}

#title_container {
width:794px;
height:30px;
position:absolute;
z-index:1;
top:20px;
font-family:Arial, Helvetica, sans-serif;
font-size:20px;
line-height:25px;
color:#FFFFFF;
padding-top:3px;
padding-left:3px;
padding-right:3px;
margin-left:20px;
margin-right:20px;
background-image:url(../img/title_bkgd.png);
}

#backtostart {
width:990px;
heigth:15px;
position:absolute;
top:640px;
font-family:Arial, Helvetica, sans-serif;
font-size:11px;
line-height:15px;
text-align:center;
color:#999999;
}

#backtostart a {
font-size:11px;
border:0px;
color:#999999;
text-decoration:none;
}

#backtostart a:hover {
font-size:11px;
border:0px;
color:#999999;
text-decoration:underline;
}

#backtostart a:visited, #backtostart a:active, #backtostart a:focus {
font-size:11px;
border:0px;
color:#999999;
}

#navi_previous {
width:60px;
height:60px;
position:absolute;
top:280px;
}

#navi_previouslink img {
visibility:hidden;
}

#navi_previouslink:link, #navi_previouslink:visited, #navi_previouslink:active, #navi_previouslink:focus {
position:absolute;
background-image:url(../img/arrow_left.gif);
}

#navi_previouslink:hover {
position:absolute;
background-image:url(../img/arrow_left_red.gif);
}

#navi_next {
width:60px;
height:60px;
position:absolute;
top:280px;
left:930px;
}

#navi_nextlink img {
visibility:hidden;
}

#navi_nextlink:link, #navi_nextlink:visited, #navi_nextlink:active, #navi_nextlink:focus {
position:absolute;
background-image:url(../img/arrow_right.gif);
}

#navi_nextlink:hover {
position:absolute;
background-image:url(../img/arrow_right_green.gif);
}


3. .JS-Datei

Code:
var image = new Array();

/* images */
image[1] = '<img src="pics/pic001.jpg" alt="">';
image[2] = '<img src="pics/pic002.jpg" alt="">';
image[3] = '<img src="pics/pic003.jpg" alt="">';

var text = new Array();

/* text */
text[1] = '<b>Titel 1:</b> Text 1 Text 1 Text 1 Text 1 Text 1 Text 1 Text 1 Text 1 Text 1 Text 1. ';
text[2] = '<b>Titel 2:</b> Text 2 Text 2 Text 2 Text 2 Text 2 Text 2 Text 2 Text 2 Text 2 Text 2. ';
text[3] = '<b>Titel 3:</b> Text 3 Text 3 Text 3 Text 3 Text 3 Text 3 Text 3 Text 3 Text 3 Text 3. ';

/* start index */
var index = 1;

/* number of entries, edit here */
var count = 3;

/* hides the button for previous image at the beginning of slideshow */
function prevdeact() {
   document.getElementById("navi_previous").style.visibility = "hidden";
   document.getElementById("img_container").innerHTML = image[index];
   document.getElementById("text_container").innerHTML = text[index];   
} 

/* next image */   
function next() {
   index ++;
   document.getElementById("img_container").innerHTML = image[index];
   document.getElementById("text_container").innerHTML = text[index];
   document.getElementById("navi_previous").style.visibility = "visible";
   if (index == count) {
      document.getElementById("navi_next").style.visibility = "hidden";
   }
}

/* previous image */ 
function previous() {
   index --;
   document.getElementById("img_container").innerHTML = image[index];
   document.getElementById("text_container").innerHTML = text[index];
   document.getElementById("navi_next").style.visibility = "visible";
   if (index == 1) {
      document.getElementById("navi_previous").style.visibility = "hidden";
   }
}


Sorry für den langen Beitrag, aber es ist ja besser, wenn gleich alle Info's da sind. Danke für Eure Hilfe.

Gruß
mtm
 
Servus Sven,

Danke für die Antwort. Cache löschen hab ich glaub ich in meinem Wahn gestern auch gemacht.
Ich kanns mir nicht wirklich erklären warum die Fehler kamen, sonst hätte ich ja auch keinen Beitrag im Forum geschreiben. Heute morgen gings plötzlich wieder :rolleyes:

Ich konnte es gestern mit der Textlänge definitiv reproduzieren - heute nicht. Naja: um so besser!

Kannst Du (oder gern jemand anderes mit Ahnung) mir trotzdem erklären, wie das mit nur einem Array funktioniert? Also so:

Code:
var image = new Array();
image[0] = new Image();
image[0].src = "pic001.jpg";
image[0].txt = "Text 1";
image[1] = new Image();
image[1].src = "pic002.jpg";
image[1].txt = "Text 2";


Wie muss ich dann diese Zeilen ändern, damit .txt und .src da richtig angesprochen/übergeben werden?

Code:
document.getElementById("img_container").innerHTML = image[index];
document.getElementById("text_container").innerHTML = text[index];


Zum Verständnis: Die <div>s in die Bild und Text beinhalten sehen so aus:

HTML:
<div id="img_container">
   <img src="blank.jpg">
</div>
<div id="text_container">
   Text 0
</div>

Muss dann um Text 0 noch irgendein Tag?

Gruß
mtm
 
Probiere es mal so:
Code:
document.getElementById("img_container").getElementsByTagName('IMG')[0].src=image[index].src;
document.getElementById("text_container").innerHTML = image[index].txt;
 
Der Fehler trat nun wieder auf, aber ich habe endlich rausgefunden woran es lag!

In meinen Texten habe ich manche Wörter mit "" ausgezeichnet:

Code:
image[0] = new Image();
image[0].src = "pic001.jpg";
image[0].txt = "Das soll wohl "Kunst" sein.";

Dann fehlt dem Script aber ein ; und nichts geht mehr. Wenn man &quot; statt " nutzt funktionierts.

Code:
image[0] = new Image();
image[0].src = "pic001.jpg";
image[0].txt = "Das soll wohl &quot;Kunst&quot; sein.";

Shit happens :)

Gruß
mtm
 
Hi!

Ich habe nun meine Slideshow fertig gemacht. Nun haben aber meine gesamten Bilder ca. 60 MB. Dies mag für ein Offline-Ansehen ok sein, aber ich bin nun mal perfektionistisch veranlagt und brauche unbedingt einen Preloader mit primitiver Statusanzeige (animiertes gif, so ähnlich wie bei Lightbox).

Bitte schlagt mich jetzt nicht tot mit :rtfm: , :suchen: und :google: die hab ich schon intensiv genutzt aber ich bin nicht fündig geworden.


Theoretisch sollte mein Code (s.u.) folgendes tun:

1. Man ruft start.html auf:
HTML:
<body onload="jscheck();layoutimages()">
jscheck(): Nachschauen ob JS verfügbar ist -> wenn ja, blende mir in ein <div> den link ein zur slideshow.html, die die eigentliche Slideshow startet.
layoutimages(): Preloade alle Bilder die für's Design und Layout zuständig sind. (dies mache ich in der Hoffnung, dass wenn ich slideshow.html aufrufe, "alles" schon da ist bis auf die Bilder der Slideshow.

2. Man klickt auf den Link und slideshow.html wird geladen:
HTML:
<body onload="preloadinfo();start()">
preloadinfo(): checkt, ob alles geladen ist um das <div> mit id="loadoverlay" dann auszublenden. "loadoverlay" legt sich während dem Seitenaufbau/Ladevorgang über die Bilder und zeigt einen schicken AJAX WEB 2.0 drehdings von http://www.ajaxload.info/ an mit Text "Bilder werden geladen".
start(): initialisiert den Counter (Bild x von y) und lädt das erste Bild in das vorbestimmte <div> mit der id="img_container" und den ersten Text in id="text_container".


SOLL-Zustand sollte halt sein, dass beim Öffnen von slideshow.html nur das Seitendesign und das drehende gif mit "Bilder werden geladen"-Text angezeigt werden soll.
Die Realität sieht aber so aus, dass layoutimages() irgendwie nix bringt und die Layoutgrafiken nicht sofort da sind und dass das lade-gif ewig nicht auftaucht und nur der alt-Text da steht.
Kann das daran liegen, dass das Bilder Array nicht in einer "kontrollierten" function() steht? Wie könnte man die Sache lösen?
Die Deluxe-Lösung wär als nächstes wenn <div id="loadoverlay"> vor jedem einzelnen Bild zusehen wäre, solange dieses lädt. Bin für alles offen :)

Ach ja: Sollte das ein Admin lesen: gehört das in ein neues Topic, oder sollte ich das ganze wenigstens wieder auf "offen" stellen?


Hier mein Code:

start.html (Startseite)
HTML:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Slideshow - Startseite</title>
<LINK rel="stylesheet" type="text/css" href="res/css/style_slideshow.css">
<script src="res/js/javascript_slideshow.js" type="text/javascript"></script>
</head>

<body onload="jscheck();layoutimages()">
<div id="main">
  <div id="frame">
    <div id="img_container">
      <div id="title_startpage">
         Title
      </div>
      <div id="subtitle_startpage">
         Subtitle
      </div>
      <div id="slideshowstart">
         <noscript>
            <img src="res/img/no_javascript.gif" alt="JavaScript ist deaktiviert!">
         </noscript>
      </div>
      <div id="infos_startpage">
         Eine Bildschirmauflösung von mindestens 1024 x 768 Pixeln wird empfohlen. <br>
         Läuft bestens in Firefox 2.xx &amp; 3.xx sowie Internet Explorer 7. <br>
         Mit F11 gelangst Du zur Vollbildansicht des Browsers. <br>
         JavaScript muss zum Betrachten aktiviert sein. <br>
      </div>
      <div id="infos_validation">
         <img src="res/img/valid-html401-blue.png" alt="Valid HTML 4.01 Strict">
         <img src="res/img/valid-css2-blue.png" alt="Valid CSS Level 2.1">
      </div>
    </div>
  </div>
</div>
</body>
</html>

slideshow.html (die eigentliche Slideshow)
HTML:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Slideshow</title>
<LINK rel="stylesheet" type="text/css" href="css/style_slideshow.css">
<script src="js/javascript_slideshow.js" type="text/javascript"></script>
</head>

<body onload="preloadinfo();start()">
<div id="main">
   <div id="navi_previous">
      <a id="navi_previouslink" href="#" onclick="previous()" title="voriges Bild"><img src="img/arrow_left.gif" alt="voriges Bild" title="voriges Bild"></a>
   </div>
   <div id="frame">
      <div id="loadoverlay"> 
         <div id="loader">
            <br>
            <img src="img/ajax-loader.gif" alt="...">
            <br>
            <br>
            Bilder werden geladen...
         </div>
      </div>
      <div id="title_container">
            Title
         <div id="counter">
         </div>
      </div>
      <div id="img_container">
         <img src="img/blank.gif" alt="blank">
      </div>
      <div id="text_container">
         <b>Bitte warte einen Moment,</b> bis alle Bilder geladen sind.
      </div>
      <div id="navi">
      </div>
   </div>
   <div id="navi_next">
      <a id="navi_nextlink" href="#" onclick="next()" title="nächstes Bild"><img src="img/arrow_right.gif" alt="nächstes Bild" title="nächstes Bild"></a>
   </div>
   <div id="backtostart">
      <a href="start.html">Zurück zur Startseite.</a>
   </div>
</div>
</body>
</html>

JS-File
PHP:
/* if JavaScript is deactivated, there is no link to start the slideshow */
function jscheck() {
   document.getElementById("slideshowstart").innerHTML = '<a id="slideshowstartlink" href="res/slideshow.html" title="Slideshow starten"></a>';
}

/* should preload layoutimages */
function layoutimages () {
   // counter
   var i = 0;

   // create object
   imageObj = new Image();

   // set image list
   layoutimages = new Array();
   layoutimages[0]="../img/start_slideshow.gif"
   layoutimages[1]="../img/start_slideshow_green.gif"
   layoutimages[2]="../img/ajax-loader.gif"
   layoutimages[3]="../img/frame.gif"
   layoutimages[4]="../img/arrow_right.gif"
   layoutimages[5]="../img/arrow_right_green.gif"
   layoutimages[6]="../img/arrow_left.gif"
   layoutimages[7]="../img/arrow_left_red.gif"

   // start preloading
   for(i=0; i<=7; i++) {
      imageObj.src=layoutimages[i];
   }
}

/* loading notification */
function preloadinfo() {
   if (document.getElementById) {
   document.getElementById("loadoverlay").style.visibility = "hidden";
   }
}

/* slideshow */

/* start index */
var index = 1;

/* number of entries, edit here */
var count = 11;

var image = new Array();

/* images, edit here */
image[1] = new Image();
image[1].src = "pics/pic001.jpg";
image[1].txt = "Title 1";
image[2] = new Image();
image[2].src = "pics/pic002.jpg";
image[2].txt = "Title 2";
image[3] = new Image();
image[3].src = "pics/pic003.jpg";
image[3].txt = "Title 3";
image[4] = new Image();
image[4].src = "pics/pic004.jpg";
image[4].txt = "Title 4";
image[5] = new Image();
image[5].src = "pics/pic005.jpg";
image[5].txt = "Title 5";
image[6] = new Image();
image[6].src = "pics/pic006.jpg";
image[6].txt = "Title 6";
image[7] = new Image();
image[7].src = "pics/pic007.jpg";
image[7].txt = "Title 7";
image[8] = new Image();
image[8].src = "pics/pic008.jpg";
image[8].txt = "Title 8";
image[9] = new Image();
image[9].src = "pics/pic009.jpg";
image[9].txt = "Title 9";
image[10] = new Image();
image[10].src = "pics/pic010.jpg";
image[10].txt = "Title 10";
image[11] = new Image();
image[11].src = "pics/pic011.jpg";
image[11].txt = "Title 11";

/* loads first image, first text, sets image-counter to one */
function start() {
   document.getElementById("img_container").getElementsByTagName('IMG')[0].src=image[index].src;
   document.getElementById("text_container").innerHTML = image[index].txt;
   document.getElementById("counter").innerHTML = index+" / "+count;  
} 

/* next image */   
function next() {
   index ++;
   document.getElementById("img_container").getElementsByTagName('IMG')[0].src=image[index].src;
   document.getElementById("text_container").innerHTML = image[index].txt;
   document.getElementById("navi_previous").style.visibility = "visible";
   document.getElementById("counter").innerHTML = index+" / "+count;
   if (index == count) {
      document.getElementById("navi_next").style.visibility = "hidden";
   }
}

/* previous image */ 
function previous() {
   index --;
   document.getElementById("img_container").getElementsByTagName('IMG')[0].src=image[index].src;
   document.getElementById("text_container").innerHTML = image[index].txt;
   document.getElementById("navi_next").style.visibility = "visible";
   document.getElementById("counter").innerHTML = index+" / "+count;
   if (index == 1) {
      document.getElementById("navi_previous").style.visibility = "hidden";
   }
}

CSS File
HTML:
body {
background-color:#505050;
margin:0px;
padding:0px;
}

/* color in here = same as background. removes borders in FF when images are used as links */
#main a, #main a:visited, #main a:active {
border:0px;
color:#505050;
}

/* removes borders when images are used as links */
img {
border:0px;
}

#main {
width:990px;
height:655px;
position:absolute;
top:50%;
left:50%;
margin-top:-320px;
margin-left:-495px;
background-color:#505050;
}

#frame {
width:840px;
height:640px;
position:absolute;
left:75px;
/* background-color:#FFFFFF; */
background-image:url(../img/frame.gif);
}

#title_container {
width:790px;
height:30px;
position:absolute;
z-index:1;
top:20px;
font-family:Arial, Helvetica, sans-serif;
font-size:20px;
line-height:30px;
color:#FFFFFF;
padding-left:5px;
padding-right:5px;
margin-left:20px;
margin-right:20px;
background-image:url(../img/title_bkgd.png);
}

#counter {
width:60px;
height:15px;
position:absolute;
z-index:2;
top:11px;
left:735px;
font-family:Arial, Helvetica, sans-serif;
font-size:11px;
line-height:15px;
text-align:right;
color:#FFFFFF;
}

#img_container {
width:800px;
height:600px;
position:absolute;
top:20px;
left:20px;
background-color:#505050;
}

#text_container {
width:790px;
height:40px;
position:absolute;
top:580px;
font-family:Arial, Helvetica, sans-serif;
font-size:11px;
line-height:20px;
color:#FFFFFF;
padding-left:5px;
padding-right:5px;
margin-left:20px;
margin-right:20px;
background-image:url(../img/text_bkgd.png);
}

#loadoverlay {
width:800px;
height:600px;
position:absolute;
top:20px;
left:20px;
background-color:#505050;
z-index:3;
}

#loader {
width:160px;
height:80px;
position:absolute;
top:260px;
left:320px;
font-family:Arial, Helvetica, sans-serif;
font-size:11px;
line-height:14px;
text-align:center;
color:#FFFFFF;
}

#backtostart {
width:990px;
height:15px;
position:absolute;
top:640px;
font-family:Arial, Helvetica, sans-serif;
font-size:11px;
line-height:15px;
text-align:center;
color:#999999;
}

#backtostart a {
font-size:11px;
border:0px;
color:#999999;
text-decoration:none;
}

#backtostart a:hover {
font-size:11px;
border:0px;
color:#999999;
text-decoration:underline;
}

#backtostart a:visited, #backtostart a:active, #backtostart a:focus {
font-size:11px;
border:0px;
color:#999999;
}

#navi_previous {
width:60px;
height:60px;
position:absolute;
top:290px;
visibility:hidden;
}

#navi_previouslink img {
visibility:hidden;
}

#navi_previouslink:link, #navi_previouslink:visited, #navi_previouslink:active, #navi_previouslink:focus {
position:absolute;
background-image:url(../img/arrow_left.gif);
}

#navi_previouslink:hover {
position:absolute;
background-image:url(../img/arrow_left_red.gif);
}

#navi_next {
width:60px;
height:60px;
position:absolute;
top:290px;
left:930px;
}

#navi_nextlink img {
visibility:hidden;
}

#navi_nextlink:link, #navi_nextlink:visited, #navi_nextlink:active, #navi_nextlink:focus {
position:absolute;
background-image:url(../img/arrow_right.gif);
}

#navi_nextlink:hover {
position:absolute;
background-image:url(../img/arrow_right_green.gif);
}

#title_startpage {
width:725px;
height:35px;
position:absolute;
top:60px;
left:10px;
font-family:Arial, Helvetica, sans-serif;
font-size:30px;
line-height:35px;
color:#FFFFFF;
}

#subtitle_startpage {
width:723px;
height:15px;
margin-left:12px;
position:absolute;
top:100px;
font-family:Arial, Helvetica, sans-serif;
font-size:11px;
line-height:15px;
color:#FFFFFF;
}

#infos_startpage {
width:584px;
height:60px;
margin-left:12px;
margin-right:10px;
position:absolute;
top:533px;
font-family:Arial, Helvetica, sans-serif;
font-size:11px;
line-height:15px;
color:#FFFFFF;
}

#infos_validation {
width:184px;
height:34px;
position:absolute;
padding-top:26px;
padding-left:10px;
top:533px;
left:606px;
font-family:Arial, Helvetica, sans-serif;
font-size:11px;
line-height:15px;
color:#FFFFFF;
}

#slideshowstart {
margin:0px;
padding:0px;
width:65px;
height:55px;
position:absolute;
top:60px;
left:735px;
border:0px;
}

#slideshowstartlink:link, #slideshowstartlink:visited, #slideshowstartlink:active, #slideshowstartlink:focus {
width:65px;
height:55px;
position:absolute;
background-image:url(../img/start_slideshow.gif);
}

#slideshowstartlink:hover {
width:65px;
height:55px;
position:absolute;
background-image:url(../img/start_slideshow_green.gif);
}
 
Moin,

onload feuert, im <body> notiert, sobald der HTML-Dokumentinhalt geladen ist.
Die Bilder, die du dort per JS lädts gehören jedoch nicht dazu, onload wartet also nicht, bis diese geladen sind.

Lösungsvorschlag: (die Anpassungen sind fett markiert)
Code:
/* if JavaScript is deactivated, there is no link to start the slideshow */
var loaded;
function jscheck() {
   document.getElementById("slideshowstart").innerHTML = '<a id="slideshowstartlink" href="res/slideshow.html" title="Slideshow starten"></a>';
}

/* should preload layoutimages */
function layoutimages () {
   // counter
   var i = 0;

   // create object
   imageObj = new Image();

   // set image list
   layoutimages = new Array();
   layoutimages[0]="../img/start_slideshow.gif"
   layoutimages[1]="../img/start_slideshow_green.gif"
   layoutimages[2]="../img/ajax-loader.gif"
   layoutimages[3]="../img/frame.gif"
   layoutimages[4]="../img/arrow_right.gif"
   layoutimages[5]="../img/arrow_right_green.gif"
   layoutimages[6]="../img/arrow_left.gif"
   layoutimages[7]="../img/arrow_left_red.gif"

   loaded=layoutimages.length;
   // start preloading
   for(i=0; i<=loaded; i++) {
      imageObj.onload=function(){preloadinfo();}
      imageObj.src=layoutimages[i];
   }
}

/* loading notification */
function preloadinfo() {
   if (document.getElementById) {
   loaded--;if(!loaded)document.getElementById("loadoverlay").style.visibility = "hidden";
   }
}

/* slideshow */

/* start index */
var index = 1;

/* number of entries, edit here */
var count = 11;

var image = new Array();

/* images, edit here */
image[1] = new Image();
image[1].src = "pics/pic001.jpg";
image[1].txt = "Title 1";
image[2] = new Image();
image[2].src = "pics/pic002.jpg";
image[2].txt = "Title 2";
image[3] = new Image();
image[3].src = "pics/pic003.jpg";
image[3].txt = "Title 3";
image[4] = new Image();
image[4].src = "pics/pic004.jpg";
image[4].txt = "Title 4";
image[5] = new Image();
image[5].src = "pics/pic005.jpg";
image[5].txt = "Title 5";
image[6] = new Image();
image[6].src = "pics/pic006.jpg";
image[6].txt = "Title 6";
image[7] = new Image();
image[7].src = "pics/pic007.jpg";
image[7].txt = "Title 7";
image[8] = new Image();
image[8].src = "pics/pic008.jpg";
image[8].txt = "Title 8";
image[9] = new Image();
image[9].src = "pics/pic009.jpg";
image[9].txt = "Title 9";
image[10] = new Image();
image[10].src = "pics/pic010.jpg";
image[10].txt = "Title 10";
image[11] = new Image();
image[11].src = "pics/pic011.jpg";
image[11].txt = "Title 11";

/* loads first image, first text, sets image-counter to one */
function start() {
   document.getElementById("img_container").getElementsByTagName('IMG')[0].src=image[index].src;
   document.getElementById("text_container").innerHTML = image[index].txt;
   document.getElementById("counter").innerHTML = index+" / "+count;  
} 

/* next image */   
function next() {
   index ++;
   document.getElementById("img_container").getElementsByTagName('IMG')[0].src=image[index].src;
   document.getElementById("text_container").innerHTML = image[index].txt;
   document.getElementById("navi_previous").style.visibility = "visible";
   document.getElementById("counter").innerHTML = index+" / "+count;
   if (index == count) {
      document.getElementById("navi_next").style.visibility = "hidden";
   }
}

/* previous image */ 
function previous() {
   index --;
   document.getElementById("img_container").getElementsByTagName('IMG')[0].src=image[index].src;
   document.getElementById("text_container").innerHTML = image[index].txt;
   document.getElementById("navi_next").style.visibility = "visible";
   document.getElementById("counter").innerHTML = index+" / "+count;
   if (index == 1) {
      document.getElementById("navi_previous").style.visibility = "hidden";
   }
}

Es wird eingangs ein Variable deklariert:
Code:
var loaded;
diese erhält später als Wert die Anzahl der Bilder
Code:
loaded=layoutimages.length;

dem onload-Event der Bilder wird jetzt preloadinfo() zugewiesenimageObj.onload=function(){preloadinfo();}

In preloadinfo selbst wird jetzt die Eingangs erstellte Variable heruntergezählt, sobald sie 0 ist, sind alle Bilder geladen
Code:
loaded--;if(!loaded)document.getElementById("loadoverlay").style.visibility = "hidden";

Habs jetzt nicht getestet, aber nach dem Schema könnte es ablaufen(nicht vergessen, den Aufruf per body-onload herauszunehmen)

Kleine Anmerkung noch:
Die wenigsten Besucher werden warten, bis 60MB Bilder fertiggeladen sind:eek:
Vielleicht solltest du das ganze schon früher anzeigen, so nach 5% der zu ladenden Bilder.
So kann man schon etwas sehen, und der Rest wird im Hintergrund weitergeladen.:)
Das wäre recht simpel machbar, indem du die Variable loaded änderst(wobei es keine Garantie dafür gibt, in welcher Reihenfolge die Bilder fertiggeladen werden).
 
Danke Sven, für Deine Ideen!

Ich hab das nun eingebaut:
PHP:
/* if JavaScript is deactivated, there is no link to start the slideshow */
var loaded;

function jscheck() {
   document.getElementById("slideshowstart").innerHTML = '<a id="slideshowstartlink" href="res/slideshow.html" title="Slideshow starten"></a>';
}

/* preloads layoutimages */
function layoutimages () {

   // counter
   var i = 0;

   // create object
   imageObj = new Image();

   // set image list
   layoutimages = new Array();
   layoutimages[0]="../img/start_slideshow.gif"
   layoutimages[1]="../img/start_slideshow_green.gif"
   layoutimages[2]="../img/ajax-loader.gif"
   layoutimages[3]="../img/frame.gif"
   layoutimages[4]="../img/arrow_right.gif"
   layoutimages[5]="../img/arrow_right_green.gif"
   layoutimages[6]="../img/arrow_left.gif"
   layoutimages[7]="../img/arrow_left_red.gif"

   loaded=layoutimages.length;
   // start preloading
   for(i=0; i<=7; i++) {
      imageObj.onload=function() {
         preloadinfo();
      }
      imageObj.src=layoutimages[i];
   }
}

/* loading notification */
function preloadinfo() {

   if (document.getElementById) {
   loaded--;
      if (!loaded)document.getElementById("loadoverlay").style.visibility = "hidden";
   }
}
Allerdings geht nun "loadoverlay" nicht auf "hidden" sondern bleibt stehen.

Und kannst Du mir hier die Syntax erklären? Ich dachte nach if (irgendwas) kommt immer eine { ? Und was bedeutet ! vor eine var? :)
PHP:
      if (!loaded)document.getElementById("loadoverlay").style.visibility = "hidden";

Das layoutimages () Bilder vorlädt ist ja auch nur eine Sache: das andere Problem ist - so wie ich das sehe - das Script zu dem "Gewicht" selbst, also die Bilder, die in der Slideshow am Ende angezeigt werden sollen. Also alles was in der.js unter /* slideshow */ steht. Die Sachen werden ja auch nicht kontrolliert geladen.

Chronologisch ausgedrückt: ich hätte gerne, wenn slideshow.html aufgerufen wird:
1. dass erst die Layout-Images geladen werden,
2. "loadoverlay" mein Lade-gif mit Text anzeigt
3. und dann die Bilder in var image = new Array(); lädt.
4. Wenn dies dann erledigt ist, "loadoverlay" auf "hidden" stellen.

Und ja, 60MB sind ne Menge Holz, aber das ganze ist primär zum offline ansehen gedacht. Falls ich mit Deiner/Eurer Hilfe was gutes mit funktionierenden Preloadern hinbekomme, dann super, kann ich dann auch für online nutzen. Ich mach sowas halt in der Regel mit Flash und wollte diesmal mit JS rumprobieren.
 
Ahso, hatte den falsche Array erwischt :-)

Der Ablauf wäre bei image[] identisch wie vorher genannt.

1.Dem Bild den onload-Event zuweisen und danach die src
2. Der Variable die Länge von image[] als Wert zuweisen

Damit erst die layoutimages geladen werden, müsstest du das Laden der Grafiken in image[] auch in einer Funktion vornehmen, welche du am Ende von layoutimages() aufrufst.
 

Neue Beiträge

Zurück