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

onload event erstellen

dodo33

New member
Hallo zusammen, ich habe folgendes Problem. Ich möchte, dass eine Slideshow automatisch beim Laden der Seite gestartet wird und nicht wie bisher auf klickbasis. Außerdem soll die Slideshow beim Erreichen des letzten Bildes, wieder beim ersten Bild anfangen.
Hier mein bisheriger Code:

HTML:
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <link rel="stylesheet" type="text/css" href="main.css">
        <script type="text/javascript" src="script.js"></script>
        <style type="text/css"></style>
        
    </head>
    <body>
        <div id="header">
        <p><img src="screenshots/Logo.jpg" width="100%" height="383" border="4" alt="Logo"</p>
            <div class="clear"></div>
        </div>
        <div id="navi">
        </div>
        <div id="slideshow">
        <h1>Slideshow</h1>
        <p id="meinFader">
        <img src="screenshots/holzbrett.jpg" alt="">
        <img src="screenshots/holzbrett1.jpg" alt="" class="next">
        <img src="screenshots/holzbrett2.jpg" alt="" class="next">    
        </p>
        <p><a href="#" onclick="window.meinFader = new Fader('meinFader'); meinFader.next();
        this.onclick = function () { return false; }; return false;">Slideshow starten</a></p>
        </div>
        
    </body>
</html>  


script.js :

function Fader(id) {
            this.id = id;
            this.images = document.getElementById(id).getElementsByTagName("img");
            this.counter = 0;

            this.fade = function (step) {
                var fader = this;

                step = step || 0;

                this.images[this.counter].style.opacity = step/100;
                this.images[this.counter].style.filter = "alpha(opacity=" + step + ")"; // IE?

                step = step + 2;

                if (step <= 100) {
                    window.setTimeout(function () { fader.fade(step); }, 1);
                } else {
                    window.setTimeout(function () { fader.next(); }, 2000);
                }
            };

            this.next = function () {
                this.counter++;

                if (this.counter < this.images.length) {

                    this.fade();
                }
            };
        }
Für Hilfe und Anregungen bin ich sehr dankbar.
 
Zuletzt bearbeitet von einem Moderator:
Setze deinen Code zukünftig bitte in die entsprechenden Tags!
 
Zuletzt bearbeitet von einem Moderator:
Du hättest dazu schreiben können, dass dies die Slideshow von SelfHTML ist. Dort wird auch an anderer Stelle eine erweiterte Endlos-Version beschrieben:
Genderter Ansatz bei der Fader-Erzeugung
Das automatische Starten müsste, soweit ich es überblicke, so gehen:
Code:
window.onload = function() {erstelleFader(); meine_slideshow.next();}
 
Zuletzt bearbeitet:
Wusste nicht, dass es weiterhilft woher der Code kommt, aber gebe es in Zukunft gerne an. Zu deinem Codestück,

Code:
window.onload = function() {erstelleFader(); meine_slideshow.next();}

Das müsste ich anstatt
Code:
onclick="window.meinFader = new Fader('meinFader'); meinFader.next();
        this.onclick = function () { return false; }; return false;">Slideshow starten

direkt in der HTML-Datei einsetzen, oder?

Sorry, mache gerade meine ersten Schritte bei HTML & Javascript.
 
Ja, aber nicht nicht im a-href-Tag sondern im script-Bereich. Und das gilt für das erweiterte Fader-Skript.
Am besten dies hier:
Code:
		function erstelleFader () {
			var einstellungen = {
				id: "slideshow",
				images: ["http://forum.jswelt.de/images/fliegen1.jpg", "http://forum.jswelt.de/images/fliegen2.jpg", "http://forum.jswelt.de/images/fliegen3.jpg", "http://forum.jswelt.de/images/fliegen4.jpg", "http://forum.jswelt.de/images/fliegen5.jpg", "http://forum.jswelt.de/images/fliegen6.jpg"]
			};

			if (!window.meine_slideshow) {
				window.meine_slideshow = new Fader(einstellungen);
			}
		}
	</script>
ersetzen durch:
Code:
		function erstelleFader () {
			var einstellungen = {
				id: "slideshow",
				images: ["http://forum.jswelt.de/images/fliegen1.jpg", "http://forum.jswelt.de/images/fliegen2.jpg", "http://forum.jswelt.de/images/fliegen3.jpg", "http://forum.jswelt.de/images/fliegen4.jpg", "http://forum.jswelt.de/images/fliegen5.jpg", "http://forum.jswelt.de/images/fliegen6.jpg"]
			};

			if (!window.meine_slideshow) {
				window.meine_slideshow = new Fader(einstellungen);
			}
                        window.meine_slideshow.next();
		}
            window.onload = erstelleFader;
	</script>
 
Code:
window.onload = function() {erstelleFader(); meine_slideshow.next();}
ist suboptimal, da man dadurch sämtliche anderen eventuell vorhandenen Listener überschreibt.
Besser:
Code:
if(document.addEventListener){
  window.addEventListener("load", erstelleFader, false);
  window.addEventListener("load", meine_slideshow.next, false);
}
else{
  window.attachEvent("onload", erstelleFader);
  window.attachEvent("onload", meine_slideshow.next);
}
 
Ich mache wie gesagt gerade meine ersten Erfahrungen in diesem Bereich und versuche gerade die einzelnen Schritte nachzuvollziehen, da es mir nicht darum geht einen fertigen Code zu bekommen, sondern die einzelnen Schritte auch zu verstehen.

Meine HTML Datei müsste ich doch dann so anpassen, dass ich die letzten Zeilen mit dem onclick event lösche.

HTML:
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <link rel="stylesheet" type="text/css" href="main.css">
        <script type="text/javascript" src="script.js"></script>
        <style type="text/css"></style>
        
    </head>
    <body>
        <div id="header">
        <p><img src="screenshots/Logo.jpg" width="100%" height="383" border="4" alt="Logo"</p>
            <div class="clear"></div>
        </div>
        <div id="navi">
        </div>
        <div id="slideshow">
        <h1>Slideshow</h1>
        <p id="meinFader">
        <img src="screenshots/holzbrett.jpg" alt="">
        <img src="screenshots/holzbrett1.jpg" alt="" class="next">
        <img src="screenshots/holzbrett2.jpg" alt="" class="next">    
        </p>
        </div>
        
    </body>
</html>

Und die Javasricpt Datei anpassen

Code:
function Fader(id) {
            this.id = id;
            this.images = document.getElementById(id).getElementsByTagName("img");
            this.counter = 0;

            this.fade = function (step) {
                var fader = this;

                step = step || 0;

                this.images[this.counter].style.opacity = step/100;
                this.images[this.counter].style.filter = "alpha(opacity=" + step + ")"; // IE?

                step = step + 2;

                if (step <= 100) {
                    window.setTimeout(function () { fader.fade(step); }, 1);
                } else {
                    window.setTimeout(function () { fader.next(); }, 2000);
                }
            };

            [B]window.onload = function() {erstelleFader(); meine_slideshow.next();};[/B]
        }
            /* anstatt */
            this.next = function () {
                this.counter++;

                if (this.counter < this.images.length) {

                    this.fade();
                }
            };
        }
           /* anstatt */

/* oder wie von  j-l-n vorgeschlagen*/

if(document.addEventListener){
  window.addEventListener("load", erstelleFader, false);
  window.addEventListener("load", meine_slideshow.next, false);
}
else{
  window.attachEvent("onload", erstelleFader);
  window.attachEvent("onload", meine_slideshow.next);
}

Oder habe ich da etwas missverstanden?

Beste Grüße

Dodo[/QUOTE]
 
Hallo Dodo,
ja, ich glaube, Du hast da etwas missverstanden: Mein Vorschlag bezog sich auf die erweiterte Version der Slideshow, wo es wieder von vorne losgeht, wenn das letzte Bild erreicht ist. Wenn ich mir das von dir jedoch ansehe:
Code:
            window.onload = function() {erstelleFader(); meine_slideshow.next();};
        }
            /* anstatt */
            this.next = function () {
                this.counter++;

                if (this.counter < this.images.length) {

                    this.fade();
                }
            };
        }
scheint das eine andere Version zu sein, wo es die Funktion erstelleFader() noch nicht gibt.
 
Ah vielen Dank für die Hilfe, da lag mein Fehler also, jetzt habe ich es verstanden.
Eine weitere Frage die ich im Bezug zur Slideshow hätte, wie geht man am geschicktesten vor, wenn ich unten im Bild eine kleine Leiste mit Punkten für die Anzahl der Bilder haben will und bei Klick auf den jeweiligen Punkt, das entsprechende Bild angezeigt wird? Ähnlich wie bei der Wordpress Theme enigma ***ps://wordpress.org/themes/enigma
 
Wie würdest du denn vorgehen? Hast du denn den bisherigen Code komplett verstanden?
Mach doch mal ein Struktogramm oder sowas in der Art, dann sehen wir ob die Logik okay ist und gehen den nächsten Schritt an.
 
Ich habe an so etwas ähnliches, wie bei dem Beispiel von deinem Link gedacht. Ich will allerdings keinen fertige Slideshow benutzen, sondern zur Übung eben selbst eine "schreiben" um das ganze besser zu verstehen. Mir geht es hierbei eben darum, ein wenig in die Materie einzusteigen.

Ich habe den bisherigen Code unten eingefügt. Die Slideshow funktioniert jetzt wunderbar mit onload, jetzt würde ich eben gerne eine kleine Navigationsleiste dazu bereitstellen, wie im Beispiel und zusätzlich noch gerne eine kleine Texteinblendung für jedes Bild. Nur leider fehlt mir dazu das nötige know-how.

HTML:
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <meta name="robots" content="index,follow">
        <meta name="description" content="Hier finden Sie alles"> 
        <meta name="keywords" content="abc, def">
        <meta name="author" content="XXX">
        <meta name="language" content="de">
        <title>XXX</title>
        <link rel="stylesheet" type="text/css" href="main.css">
        <link rel="shortcut icon" href="screenshots/Favicon.ico">
        <script type="text/javascript" src="script.js"></script>
        <style type="text/css"></style>
    </head>
    
    <body>
        <div id="Rahmen">
            <div id="header">
                <div id="Logo">
                <img src="screenshots/Logo.jpg" alt="Logo" id="logo">
                </div>
                
                <br>
                
                <div id="Navigation">
                    <ul id="Navigation">
                    <li><a href="#Beispiel">Home</a></li>
                    <li><a id="aktuell" href="#Beispiel">BSP</a>
                    <ul>
                        <li><a href="#Beispiel">BSP</a></li>
                        <li><span>Philosophie</span></li>
                        <li><a href="#Beispiel">BSP</a></li>
                    </ul>
                    </li>
                    <li><a href="#Beispiel">Galerie</a></li>
                    <li><a href="#Beispiel">BSP</a></li>
                    </ul><div></div>
                </div>
                <div id="table">
                <img src="screenshots/tafel.png" alt="table" id="table">
                <img src="screenshots/tafel2.png" alt="table" id="table2">
                </div>
            </div>
            <br>
            <div id="content">
                <div id="slider">
                   <img src="screenshots/holzbrett.jpg" alt="" id="slideshow">
                </div>    
                
            <h1>Herzlich Willkommen</h1>

            </div>
            
            <br>
            
            <div id="footer">

            </div>
         
    </body>
</html>

CSS:
Code:
html {
    background-image: url(screenshots/holz2.jpeg);
}

body {
    font-family: Verdana, Helvetica, Arial, sans-serif;
    font-size: 16px;
    line-height: 1.5em;
    color: white;
    background-color: #570F14;
    max-width: 800px;
    margin: 0 auto;
    padding: 2em 2em 4em;
}

div#Rahmen {
    padding: 15px;
    background-color: #79191F;
}

div#header {
    background-color: #79191F;
}

div#Logo {
    width: 50%;
    margin: 0 auto;
}

img#logo {
    border: solid #000000 1px;
    border-radius: 1px;
    display: block;
    -webkit-animation: colorize 2s cubic-bezier(0, 0, .78, .36) 1;
    animation: colorize 2s cubic-bezier(0, 0, .78, .36) 1;
}

@-webkit-keyframes colorize {
    0% {
        -webkit-filter: grayscale(100%);
    }
    100% {
        -webkit-filter: grayscale(0%);
    }
}

/* Navigation*/

div#Navigation {
    font-size: 12px;
    width: 782px;
    height: 35px;
    padding: 0.8em;
    position:relative;
    left: -15px;
    background-image: url(screenshots/holz.jpg);
  }

  ul#Navigation {
    margin: 0; 
    padding: 1;
    text-align: center;
  }

  ul#Navigation li {
    list-style: none;
    float: left;  
    position: relative;
    margin: 0.4em; padding: 0;
  }


  ul#Navigation li ul {
    margin: 0; padding: 0;
    position: absolute;
    top: 2.0em; left: -0.4em;
    display: none;  /* Unternavigation ausblenden */
  }

  ul#Navigation li:hover ul {
    display: block;  /* Unternavigation in modernen Browsern einblenden */
  }

  ul#Navigation li ul li {
    float: none;
    display: block;
    margin-bottom: -0.39em;
    z-index:2;
  }

  ul#Navigation a, ul#Navigation span {
    display: block;
    width: 6.4em;  
/* Breite den in li enthaltenen Elementen zuweisen */
    padding: 0.2em 1em;
    text-decoration: none;
    font-weight: bold;
    border: 1px solid black;
    border-left-color: black;
    border-top-color: black;
    color: white;
    background-color: #79191F;
  }
  
  ul#Navigation a:hover, ul#Navigation span, li a#aktuell {
    border-color: black;
    border-left-color: black;
    border-top-color: black;
    color: white;
    background-color: #570F14;
  }

  li a#aktuell {  /* aktuelle Rubrik kennzeichnen */
    color: white;
    background-color: #570F14;
  }

  ul#Navigation li ul span {  /* aktuelle Unterseite kennzeichnen */
    background-color: #570F14;
  }

/* Navigation Ende*/

img#table {
    position: absolute;
    left:-10px;
    float: left;
}

img#table2 {
    position: absolute;
    right: 20px;
    float: right;
}

/* Slider */

div#slider {
    padding: 15px;
    position: relative; 
    top: 0; 
    left: 0;
}

.next {
    position: absolute; 
    top: 0; 
    left: 0;
    opacity: 0;
    filter:alpha(opacity=0);
}

.fader { 
    position: relative;
    display: inline-block;
}
        
.fader img {
    vertical-align: top;
}

/* Slider Ende */

/* Footer */

div#footer {
    text-align: left;
    font-size: small;
    border: 1px solid black;
    position: relative;
    width: 800px;
    top: 100px;
    left: -15px;
} 

/* Footer Ende */

Script:
Code:
/* Slider */

function Fader(einstellungen) {
            if (!einstellungen.id || !document.getElementById(einstellungen.id)
                || einstellungen.images.length < 2) {

                return new Boolean(false);
            }

            var i, original = document.getElementById(einstellungen.id);

            this.id = einstellungen.id;
            this.images = new Array();
            this.counter = 0;

            this.element = document.createElement("span");
            this.element.className = "fader";
            original.parentNode.replaceChild(this.element, original);

            for (i = 0; i < einstellungen.images.length; i++) {
                this.images[i] = document.createElement("img");
                this.images[i].src = einstellungen.images[i];
                this.images[i].alt = "Bild";

                 if (i == 0) {
                    this.element.appendChild(this.images[i]);
                }
            }

            this.fade = function (step) {
                var fader = this, imgs = this.element.getElementsByTagName("img");

                step = step || 0;

                imgs[1].style.opacity = step/100;
                imgs[1].style.filter = "alpha(opacity=" + step + ")"; // IE?

                step = step + 2;

                if (step <= 100) {
                    window.setTimeout(function () { fader.fade(step); }, 1);
                } else {
                    imgs[1].className = "";
                    this.element.removeChild(imgs[0]);
                    window.setTimeout(function () { fader.next(); }, 4000);
                }
            };

            this.next = function () {
                this.counter = (this.counter < this.images.length -1) ? this.counter +1 : 0;

                this.element.appendChild(this.images[this.counter]);
                this.images[this.counter].className = "next";
                this.fade();
            };
        }

        function erstelleFader () {
            var einstellungen = {
                id: "slideshow",
                images: ["screenshots/holzbrett.jpg", "screenshots/holzbrett1.jpg","screenshots/holzbrett2.jpg"]
            };

            if (!window.meine_slideshow) {
                window.meine_slideshow = new Fader(einstellungen);
            }
            window.meine_slideshow.next();
		}
            window.onload = erstelleFader;
/* Slider Ende */
 
Dann würde ich erstmal ganz einfach anfangen. Versuch mal, die Funktion next() so in eine Funktion, z. B. goto() umzuändern, dass ein bestimmtes Bild angezeigt wird. Dazu musst Du den Index als Eingangsparameter übergeben.
Dann würde ich erstmal diese Punkte im HTML anlegen. Entweder als Grafik oder indem Du die Ecken ein Divs mit mit der CSS-Eigenschaft border-radius abrundest.
Bei diesen Punkten musst Du dann einen onclick-Eventhandler anlegen, der die neue Funktion goto() jeweils mit dem richtigen Index aufruft.
Als nächsten Schritt kannst Du dann das Anlegen der Punkte mit einer Schleife automatisieren.
 
Um den Index als Eingangsparameter zu übergeben, hätte ich in der js Datei nach
Code:
this.counter = 0;
eine Zeile mit
Code:
var index = 0;
eingesetzt. Dann gehe ich davon aus, dass man im js noch eine Funktion zum Hochzählen der Indexvariable anlegen muss,

Code:
function goto_img() {
  var a = images.length;
  if (index == a) {
    index = 0;
  } else if (index < 0) {
    index = a - 1;
  }
  document.getElementById("slideshow").src = img[index];
}

Im html lege ich dann die Punkte an und positioniere diese und gebe ihnen einen onclick-handler:

Code:
<div....onclick="switch_img(0)...../div>

Hierbei scheine ich jedoch einen Denk- oder Codefehler zu haben, wenn nicht sogar beides, da es bei mir nicht funktioniert.
 
Nein, Du musst es genau so wie in der Funktion next() machen. Einen Eingangsparameter definiert man, indem man den Namen in die runden Klammern bei der Funktionsdefinition schreibt. Lies dir mal die Grundlagen durch:
SELFHTML: JavaScript / Sprachelemente / Funktionen
So müsste die Funktion IMO aussehen:
Code:
            this.goto = function (idx) {
                this.counter = idx;

                this.element.appendChild(this.images[this.counter]);
                this.images[this.counter].className = "next";
                this.fade();
            };
(Sicher muss man sich auch noch um die Timer kümmern, aber probiere erst mal aus, ob dieses funktioniert.
Und das onclick in dem div müsste so aussehen:
Code:
<div .... onclick="goto(0);" .....></div>
 
Vielen Dank schon mal für die Hilfe, allerdings funktioniert dein Vorschlag bei mir nicht.
Habe die js und die Html Datei mit deinem Codestück ergänzt, allerdings ohne Effekt.

Code:
function Fader(einstellungen) {
            if (!einstellungen.id || !document.getElementById(einstellungen.id)
.
.
.
 };

            if (!window.meine_slideshow) {
                window.meine_slideshow = new Fader(einstellungen);
            }
            window.meine_slideshow.next();
		}
            window.onload = erstelleFader;

/* Slider Ende */

/* Slider Navi */

  this.goto = function (idx) {
                this.counter = idx;

                this.element.appendChild(this.images[this.counter]);
                this.images[this.counter].className = "next";
                this.fade();
            };

/* Slider Navi Ende*/

HTML:
<div> <img src="screenshots/150px-Gruener_Pfeil.svg.png" style="cursor:pointer" onclick="goto(0);" alt="" width="40" height="40" /></div>
 
Du musst die Funktion goto() innerhalb des Fader definieren, z. B. direkt hinter der Funktion next().
Dem Dateinamen nach scheint die Grafik ein Pfeil zu sein. Ich hatte dich so verstanden, dass Du für jedes Bild einen Punkt haben willst? Wenn Du jedoch eine Funktion "nächstes Bild" haben willst, müsstest Du natürlich auch die Funktion next() im onclick aufrufen.
 
Das ist mir beim Reinkopieren verrutscht, es ist innerhalb des Faders. Die Pfeile habe ich dabei nur als Grafikersatz für die Punkte verwendet. Am Ende möchte ich allerdings sowohl die Punkte, als auch links und rechts zwei Pfeile zur Navigation haben.
Grüße DOD
 
Hab's mal ausprobiert und so funktioniert es:
Code:
            this.fade = function (step) {
                var fader = this, imgs = this.element.getElementsByTagName("img");

                step = step || 0;

                imgs[1].style.opacity = step/100;
                imgs[1].style.filter = "alpha(opacity=" + step + ")"; // IE?

                step = step + 2;

                if (step <= 100) {
                    this.timer = window.setTimeout(function () { fader.fade(step); }, 1);
                } else {
                    imgs[1].className = "";
                    this.element.removeChild(imgs[0]);
                    this.timer = window.setTimeout(function () { fader.next(); }, 4000);
                }
            };

            this.next = function () {
                this.counter = (this.counter < this.images.length -1) ? this.counter +1 : 0;

                this.element.appendChild(this.images[this.counter]);
                this.images[this.counter].className = "next";
                this.fade();
            };

            this.goto = function (idx) {
                this.counter = idx;
 
               if (imgs[1]) {
                    imgs[1].className = "";
                    imgs[1].opacity = 1;
                    this.element.removeChild(imgs[0]);
                }

                this.element.appendChild(this.images[this.counter]);
                this.images[this.counter].className = "next";
                window.clearTimeout(this.timer);
                this.fade();
            };
Ich musste noch den Timer löschen, damit es funktioniert.
HTML:
                <div id="slider">
                   <img src="screenshots/holzbrett.jpg" alt="" id="slideshow"><br>
                    <div class="bullet" onclick="window.meine_slideshow.goto(0);"></div>
                    <div class="bullet" onclick="window.meine_slideshow.goto(1);"></div>
                    <div class="bullet" onclick="window.meine_slideshow.goto(2);"></div>
                </div>
HTML:
.bullet {
    background-color: white;
    width: 10px;
    height: 10px;
    border-radius: 50%;
    margin: 10px;
    float: left;
}
Jetzt überleg mal, wie man das Anlegen der divs mit den Punkten automatisieren kann. Der einfachste Weg ist wahrscheinlich, wenn Du es mit innerHTML machst.
 
Zuletzt bearbeitet:
Zurück
Oben