Zufällige Funktion ausführen
Jana
- javascript
0 bleicher0 Der Martin
0 jana1 Jeena Paradies0 bleicher0 jana2 Der Martin
0 Jana
0 JürgenB
0 jana
Hallo liebes Forum,
ich würde gerne wissen ob es möglich ist bei Aufrufen einer Seite eine von mehreren Funktionen (es geht um Hintergrundfarbanimationen) nur eine auszuführen. Also dass zufällig eine der Funktionen ausgewählt und gestartet wird...
Gibt es dafür in javascript oder jQuery eine einfache Lösung?
Vielen Dank!
Jana
Grüße,
Gibt es dafür in javascript oder jQuery eine einfache Lösung?
ja, funktionen dürfen AFAIK arraywerte sein. wie man zufälligen array schlüßel erzeugt muss ich nicht erklären?
MFG
bleicher
Hallo,
ich würde gerne wissen ob es möglich ist bei Aufrufen einer Seite eine von mehreren Funktionen (es geht um Hintergrundfarbanimationen) nur eine auszuführen. Also dass zufällig eine der Funktionen ausgewählt und gestartet wird...
nicht "out of the box", soweit mir bekannt ist. Ich würde *eine* bestimmte Funktion aufrufen, in dieser Funktion eine Zufallszahl ermitteln und abhängig davon in einer switch-Abfrage eine weitere Funktion aufrufen, die dann für den Effekt sorgt.
Mit einem etwas mehr objektorientierten Ansatz könnte man auch ein Array mit Funktionsreferenzen anlegen und die gewünschte Funktion direkt aus dem Array aufrufen; man eliminiert damit die switch-Anweisung.
So long,
Martin
Hallo martin,
Mit einem etwas mehr objektorientierten Ansatz könnte man auch ein Array mit Funktionsreferenzen anlegen und die gewünschte Funktion direkt aus dem Array aufrufen; man eliminiert damit die switch-Anweisung.
das klingt nach der lösung, die ich gesucht habe!
kannst du mir vielleicht etwas genauer erklären, wie das funktionieren würde? bin neuling. =)
vielen dank!
Hallo,
das klingt nach der lösung, die ich gesucht habe!
kannst du mir vielleicht etwas genauer erklären, wie das funktionieren würde? bin neuling. =)
function a() { alert("a") } // Zwei (oder mehrere) Funktionen erstellen
function b() { alert("b") }
var functions = [a, b]; // Die Pointer darauf in ein Array reinpacken
var rand = Math.floor (Math.rand() * functions.length); // Eine Zufallszahl zwischen 0 und der Anzahl der Funktionen und diese abrunden
functions[rand](); // Die funktion an der stele der Zufallszahl aus dem Array holen und ausführen (dazu sind die letzten Klammern da)
Alles ungetestet aber es sollte dich schon mal auf den richtigen Weg führen.
Jeena
Grüße,
warum nicht anonym direkt im array? das müllt glaube ich den scope etwas weniger zu. oder gibt es da andere gründe?
MFG
bleicher
Hallo bleicher,
du meinst so?
( [ function() { alert("a"); }, function() { alert("b"); } ][Math.floor(Math.random()*2)] )();
Das ist ein anonymes Array anonymer Funktionen, von denen eine sofort zufallsgesteuert ausgeführt wird.
Gruß, Jürgen
Hallo,
( [ function() { alert("a"); }, function() { alert("b"); } ][Math.floor(Math.random()*2)] )();
Gutes Beispiel dass das vor allem für Anfänger wie Jana extrem schwer lesbar ist und somit den Lerneffekt minimiert.
Da unser Slogan "Energie des Verstehens" ist fand ich ein ausführlicheres Beispiel mit Kommentaren was in der jeweiligen Zeile passiert als eher Zielführend :-)
Jeena
Hallo Jeena,
meine Zustimmung. Mein Einzeiler war auch eher an Bleicher gerichtet. Ich habe sogar daran gedacht, noch etwas mit ? und : einzubauen :)
Mein verlinktes Beispiel ist auch etwas übersichtlicher.
Warten wir jetzt mal, ob sich Jana noch mal meldet.
Gruß, Jürgen
Hallo,
warum nicht anonym direkt im array? das müllt glaube ich den scope etwas weniger zu. oder gibt es da andere gründe?
Mehrere Gründe.
1. Jana schreibt sie kann noch nicht so gut JavaScript, es ist viel einfacher zu verstehen was da passiert wenn man die funktionen benennt
2. wahrscheinlich gibt es die Funktionen schon fertig irgendwo geschrieben
3. wenn die Funktionen ziemlich groß sind dann hilft es der Übersichtlichkeit ihnen Namen zu geben
Grundsätzlich kann man das einfach als lambdas ins Array werfen, da das aber als Beispiel für einen Neuling funktionieren sollte habe ich mich dagegen entschieden.
Jeena
Das mit der Übersichtlichkeit macht jedoch tatsächlich Sinn...=)
Jeenaparadies, weisst du, warum dein code bei mir nicht funktioniert?..
functionsrand; // Die funktion an der stele der Zufallszahl aus dem Array holen und ausführen (dazu sind die letzten Klammern da)
müsste die funktion nicht function [rand] (); heissen?
Wäre dankbar für eine Antwort...
vielen Dank
Jana
Hallo,
Das mit der Übersichtlichkeit macht jedoch tatsächlich Sinn...=)
ja, find' ich auch. Wenn man genügend tief in der Materie steckt, kommt einem die kompakte Lösung zwar auch irgendwann übersichtlich vor, aber sie ist nicht unbedingt für Einsteiger geeignet.
functionsrand; // Die funktion an der stele der Zufallszahl aus dem Array holen und ausführen (dazu sind die letzten Klammern da)
müsste die funktion nicht function [rand] (); heissen?
Nein. Wenn du diesen Ansatz schon anschauen willst, lass ihn uns Schritt für Schritt aufdröseln.
Das Gesamt-Konstrukt sah so aus (siehe Posting von Jeena):
function a() { alert("a") } // Zwei (oder mehrere) Funktionen erstellen
function b() { alert("b") }
var functions = [a, b]; // Die Pointer darauf in ein Array reinpacken
var rand = Math.floor (Math.rand() * functions.length); // Eine Zufallszahl zwischen 0 und der Anzahl der Funktionen und diese abrunden
functionsrand; // Die funktion an der stele der Zufallszahl aus dem Array holen und ausführen (dazu sind die letzten Klammern da)
Zunächst definiert er seine einzelnen Funktionen, hier mit den exemplarischen Namen a und b. Im zweiten Schritt legt er ein Array an, das die Namen (genauer: die Referenzen) dieser beiden Funktionen enthält, und nennt das Array functions. Beachte das 's' am Ende, das nicht nur den Plural anzeigt, sondern auch dafür sorgt, dass der Name nicht mit dem Schlüsselwort "function" verwechselt werden kann. Es ist nichts weiter als ein frei gewählter Name, er hätte auch "murmeltiere" heißen können.
Dann generiert Jeena eine Zufallszahl, und bemisst ihren Wertebereich nach der Anzahl der Elemente im Array functions.
Und schließlich ruft er eine der Funktionen auf:
functions[rand]();
Diese Anweisung heißt:
\* Schau ins Array "functions"
\* Hole das Element heraus, das durch "rand" indiziert wird (daher die eckigen Klammern)
\* Nimm an, dass dieses Arrayelement eine Funktion ist, und ruf sie auf (daher die runden Klammern am Ende)
Jetzt klarer geworden?
So long,
Martin
--
Ich denke, also bin ich hier falsch.
Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
Jetzt klarer geworden?
Ja, vielen Dank...jetzt ist alles klar und funktioniert!
Hallo jana,
hier ein Beispiel. Die Tannenbaumfunktion besteht aus vier Funktionen, die per gewichtetem Zufall ausgewählt werden.
Gruß, Jürgen
Ihr seid super,
vielen Dank!
Jeena Paradies code hat so leider nicht funktioniert, aber Jürgens Lösung klappt...
Danke an euch!
Hallo jana,
Jeena Paradies code hat so leider nicht funktioniert,
ich glaube das liegt am Tippfehler:
Math.rand -> Math.random
aber Jürgens Lösung klappt...
welche? Mein "Einzeiler" oder das Tannenbaumscript?
Gruß, Jürgen
Hallo,
ich glaube das liegt am Tippfehler:
Math.rand -> Math.random
Ja stimmt, sorry, hab das einfach aus dem Kopf runtergetippt und wohl mit einer anderen Sprache verwechselt.
Jeena