huah hat geschrieben:Ich glaube Javascript kann als Zufallsergebnis nur 1 oder 0 ausgeben.
Nein, Math.random() liefert eine Zahl
zwischen 0 und 1. Auch Kommazahlen sind Zahlen, und mit denen kann man durchaus auch direkt arbeiten:
Code: Alles auswählen
var i = Math.random();
if (i < 0.333) {
document.write('<a href="bla">Code 1<' + '/a>');
}
else if (i < 0.666) {
// Code 2
}
else {
// Code 3
}
Das hat allerdings den Nachteil, dass man bei Hinzukommen oder Wegnehmen einer Option fast alle anderen Optionen bzw. die Grenzwerte dazu anpassen muss.
Kommt beispielsweise eine Option hinzu, müssen 0.333 und 0.666 in 0.25 respektive 0.666 geändert werden. Das ist natürlich zusätzliche Arbeit, weshalb das Multiplizieren und anschließende Abrunden eine sinnvolle Wahl ist.
Wichtig beim Schreiben von HTML-Code mittels document.write ist in jedem Falle, dass schließende Elemente wie das </a> oben aufgebrochen werden in
'<' + '/a>'. Die Kombination </ beendet (eigentlich) jeglichen Javascript-Bereich, manche Browser tolerieren die Verwendung, andere jedoch nicht - deshalb in zwei Teilen schreiben.
Als Badewasserzusatz:
Code: Alles auswählen
<!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></title>
<script type="text/javascript">
/*
Die Werbemaschinerie ist vollständig in der Variablen Werbung gekapselt.
Werbemittel werden erst später definiert, an der Variablen Werbung muss
nichts geändert werden.
*/
var Werbung = {
dazu: function(objekt, gewicht) {
this.werbemittel.push(objekt);
},
werbe: function() {
var i = Math.floor(Math.random() * this.werbemittel.length);
if (typeof this.werbemittel[i] == "string") {
document.write(this.werbemittel[i]);
}
else if (typeof this.werbemittel[i] == "function") {
this.werbemittel[i]();
}
},
werbemittel: Array()
}
/*
Im Folgenden werden die Werbemittel definiert.
Bei Text bzw. HTML ist, wie oben schon geschrieben, darauf zu achten,
dass schließende Elemente aufgebrochen werden. Weiterhin muss der
komplette Code (leider) in einer Zeile stehen.
*/
Werbung.dazu('Werbung 1<script type="text/javascript">google_ad_client = "pub-1";<' + '/script>');
Werbung.dazu('Werbung 2 sollte hier <a href="">erscheinen<' + '/a>.');
Werbung.dazu(function() { alert("Hallo Welt"); });
</script>
</head>
<body>
<!-- Hier Werbung! //-->
<script type="text/javascript">Werbung.werbe();</script>
</body>
</html>
Der Code demonstriert gleich ein paar Dinge auf einmal:
Die
Werbemittel werden in ein Feld (Werbung.werbemittel) geschrieben, anstatt sie direkt auszugeben. Das hat verschiedene Vorteile:
- Die Daten sind vom Code getrennt. Man läuft nicht mehr Gefahr, beim Bearbeiten der Daten versehentlich den Code zu zerlegen.
- Beim Auswürfeln muss nicht mehr die Anzahl der Werbemittel angeben werden. Stattdessen wird auf die Feldlänge .length zurückgegriffen, sie zeigt automatisch an, wie viele Elemente im Feld gespeichert sind. Somit lassen sich Werbemittel hinzufügen, ohne dass auf sonstige Einstellungen geachtet werden muss.
- Beim Ausgeben muss keine endlose if-else-Konstruktion genutzt werden, weil mittels
feld[x] direkt auf das Element x des Feldes zugegriffen werden kann. Die Menge an notwendigen document.write()-Aufrufen (und damit potentieller Fehlerquellen) reduziert sich auf genau 1.
- Der HTML-Bereich der Seite bleibt übersichtlicher, denn statt des ganzen Werbegedöns mit Würfelei und if-else-bla erscheint dort nur
<script type="text/javascript">Werbung.werbe()</script> - kurz und bündig.
Diese Nutzung eines Feldes statt if-else ist eigentlich das Wichtigste, was ich mit dem Code zeigen wollte. Es kommen aber noch zwei Nebensachen hinzu:
Die Nutzung von
Javascript-Objekten. Der gesamte Werbekram ist im Objekt Werbung verkapselt. In diesem Objekt befindet sich das „Werbelager“ (das Feld werbemittel) wie auch die Funktion, die die Werbung ausgibt (werbe()). Verkapselung schafft Platz im Namensraum, alles ist schön geordnet und zusammenhängend an einer Stelle und, sofern der Texteditor das unterstützt, mit einem Klick kann der gesamte Werbecode auf eine Zeile zusammengefaltet werden.
Last but not least lassen sich bei Javascript auch Funktionen in Variablen speichern, denn
Funktionen sind Objekte. Mit Werbung.dazu() lässt sich also nicht nur normaler Text bzw. HTML-Code als Werbemittel einfügen, sondern auch eine Funktion, die, so ausgewürfelt, mittels der für den einen oder anderen Programmierer etwas merkwürdig ausehenden Konstruktion werbemittel
() aufgerufen wird.
Ob es nun irgendeinen Nutzen hat, dass man auch Funktionen für die Werbung einsetzen kann, weiß ich allerdings nicht :-)