Follow along with the video below to see how to install our site as a web app on your home screen.
Anmerkung: This feature may not be available in some browsers.
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8">
<script type="text/javascript">
var oArrImages = new Array ();
oArrImages[0] = new Image();
oArrImages[1] = new Image();
oArrImages[0].src = 'bild0.jpg';
oArrImages[1].src = 'bild1.jpg';
function SwitchImage(oImg) {
var sNew = (oImg.src == oArrImages[0].src) ? oArrImages[1].src : oArrImages[0].src;
oImg.src = sNew;
}
</script>
<title>Bild Test</title>
</head>
<body>
<img onclick="SwitchImage(this);" src="bild0.jpg" alt="bild" id="bild1"/>
<br/>
Klicken zum ändern.
<hr/>
<img onmouseover="SwitchImage(this);" onmouseout="SwitchImage(this);" src="bild1.jpg" alt="bild" id="bild2"/>
<br/>
Mouseover zum ändern.
</body>
</html>
nn man auf ein Bild mit Mouseover-Effekt klickt, dass der Mouseover-Effekt stopp
Mit dem Beispielcode muss er nur noch zwei Bilder bild0.jpg und bild1.jpg kopieren und schon kann er selbst weiter üben.
Ohhh, das hatte ich überlesenOder wo entfernst du genau die mouseover- und mouseoutevents wenn er klickt?
Das mag sein, ich habe mir das in vergangenen Zeiten selbst beigebracht und dann mehrere Jahre nichts gemacht.Der Code ist ein exemplarisches Beispiel für veraltetes JavaScript
ob ich nun arr = new Array() oder arr = [] ist nur eine Frage der Anzahl der Zeichen und Lesbarkeit. arr = ['foo.jpg', 'bar.jpg'] mag angehen bei bis 5 Elementen, aber bei mehr sehe ich doch lieber, welches Element an welcher Position steht, ziehe also die Index-Schreibweise immer vor. Ich persönlich ziehe auch die Events an den Elementen vor, das mag nicht zeitgemäß sein, aber falsch ist es auch nicht. Mein Vater sagte in vergleichbaren Fällen immer:... dafür reicht ein simples: var arr = ['foo.jpg', 'bar.jpg'];
Ich glaube es ist nicht ganz klar was ich meinte Also, ich habe ein Bild. Wenn man über dieses Bild mit der Maus fährt, dann erscheint dahinter ein anderes Bild. Das funktioniert und sieht so aus:Ohhh, das hatte ich überlesen![]()
<img src="Bild1.png" alt="" height="200" width="250"
onMouseOver="src='Bild2.png'"
onMouseOut="src='Bild1.png'"/>
Es hat halb funktioniert. Wenn man auf das Bild drückt ändert es zum zweiten. Aber der Mouseover-Effekt ist ja nicht mit drin. Ich habe auch versucht ihn mit einzubinden. Aber wenn man dann mit der Maus rüber fährt und klickt, switcht es zum anderen Bild, märkt es sich aber nicht. Liegt das daran, dass ich den "RemoveEventListener" noch nicht mit eingebunden habe, oder woran sonst?Mein Beispiel zeigt doch das Prinzip, musst nur noch eine Zeile hinzufügen, um den Event Listener zu deaktivieren siehe https://developer.mozilla.org/de/docs/Web/API/EventTarget/removeEventListener
Aber dein erneuter Code zeigt, dass du nichts probiert, geschweige verstanden hast
<img src="bilder/1.jpg" alt="" height="200" width="250" onmouseover="showImg(this, 'bilder/2.jpg');" onmouseout='showImg(this, "bilder/1.jpg");' onclick='fixImg(this);'>
<script type="text/javascript">
function showImg(ele, im) {
if (ele.getAttribute("data-clicked") != "true") ele.src = im;
}
function fixImg(ele) {
if (ele.getAttribute("data-clicked") == "true") {
ele.setAttribute("data-clicked", "false");
} else {
ele.setAttribute("data-clicked", "true");
}
}
</script>
Vielleicht ist dieses einfacher und verständlicher
<figure>
<img src="img1.jpg" alt="image">
</figure>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
<script>
(function() {
var images = ['img1.jpg','img2.jpg'],
bindElements = function() {
$('img').on({
'mouseover': function() {
$(this).attr('src', images[1]);
},
'mouseout': function() {
$(this).attr('src', images[0]);
}
});
};
$('figure').on('click', function() {
if (typeof $._data(document.querySelector('img'),'events') != 'undefined') {
$('img').off();
} else {
bindElements();
}
});
bindElements();
}());
</script>
Das Array habe ich nur verwendet, weil ich mal vor grauer Vorzeit hörte, dass dies dafür sorgt, dass die Bilder auch schon geladen sind, wenn man das Script aufruft und dann nicht erst nachgeladen werden. Dass ich jQuery für ein einfaches Beispiel auch für einen Overkill halte, habe ich ja deutlich gemacht. Meine erste Lösung war auch, sich den Status zu merken, aber da es im JavaScript keine statischen Variablen gibt und ich globale vermeiden wollte, habe ich das sein lassen. Auf die Idee, den Status beim Bild zu merken, bin ich nicht gekommen (damals gab es auch diese Attribute glaube noch nicht), die finde ich gut. Den Event zu entfernen mag zwar sauber sein, aber ob er in der Praxis relevant ist, bezweifle ich. Die gesparten Ressourcen sind sicher vernachlässigbar.Dass man für einen simplen Bilderwechsel ein Array und jQuery braucht, will sich mir nicht erschließen. Ebenso wenig die Vorteile, wenn man das Vorhandensein von Listenern abfragt statt eine Statuskennung.
Vielen Dank! Funktioniert super!Vielleicht ist dieses einfacher und verständlicher:
Code:<img src="bilder/1.jpg" alt="" height="200" width="250" onmouseover="showImg(this, 'bilder/2.jpg');" onmouseout='showImg(this, "bilder/1.jpg");' onclick='fixImg(this);'> <script type="text/javascript"> function showImg(ele, im) { if (ele.getAttribute("data-clicked") != "true") ele.src = im; } function fixImg(ele) { if (ele.getAttribute("data-clicked") == "true") { ele.setAttribute("data-clicked", "false"); } else { ele.setAttribute("data-clicked", "true"); } } </script>
Hst du denn auch verstanden, WAS und WARUM und WIE da funktioniert?Vielen Dank! Funktioniert super!
Nicht komplett. Also durch das Klicken wird nun die Funktion 'fixImg' abgerufen. Ich kann es halbwegs nachvollziehen. Kannst du mir vielleicht nur die Begriffe 'ele' und 'im' erklären?Hst du denn auch verstanden, WAS und WARUM und WIE da funktioniert?
$.each($._data(document.querySelector('img'),'events'), function(key, value) {
console.debug('event: ', key);
});
p {background-image: url('image1.jpg')}
p.myclass:hover {background-image: url('image2.jpg')}
<p class="myclass"></p>
$('p').on('click', function() {
$(this).toggleClass('myclass');
});
Das trifft zu. Allerdings ist hier nicht das Array das entscheidende, sondern dass das Bild in einem Image-Objekt vorgeladen wird.dass die Bilder auch schon geladen sind, wenn man das Script aufruft und dann nicht erst nachgeladen werden.
I. w. S. ein objektorientiertes Vorgehen, nämlich die Eigenschaften beim Objekt zu speichern. Dies ermöglicht es, das Skript unverändert auf mehrere Bilder anzuwenden.Auf die Idee, den Status beim Bild zu merken, bin ich nicht gekommen (damals gab es auch diese Attribute glaube noch nicht), die finde ich gut.
Hattet ihr noch keine Funktionen? ele ist ein Element. Wirfst Du einen Blick auf den Aufruf der Funktion im HTML, siehst Du, dass dieser Parameter mit "this" versorgt wird; "this" ist das Element bei dem der Listener notiert wird bzw. das was gehovert bzw. geklickt wird, in diesem Fall das img-Element. Wird die Funktion ausgeführt, wird ele durch dieses Element ersetzt.´im ist die Adresse des anzuzeigenden Bildes; sie wird entweder mit "Bild1.jpg" oder "Bild2.jpg" versorgt.Ich kann es halbwegs nachvollziehen. Kannst du mir vielleicht nur die Begriffe 'ele' und 'im' erklären?