[JS] Brauche Hilfe bei kleinem Script
lima-city → Forum → Die eigene Homepage → HTML, CSS & Javascript
antwort
ausgabe
ausgeben
code
dank
dokument
ende
fehler
forum
frage
funktion
hilfe
http
knacken
liegen
machen
problem
text
tresor
zahl
-
ho ;)
Ich frage mal wieder die Lima-Community (Also DICH!) um Rat...
Jede Antwort, die mir hilft ist willkommen :D
Es geht um ein kleines Script... (Wollte mal wieder ein wenig in JS hineinschnuppern... aber das klappte nicht ganz so einfach, wie ich es mir vorgestellt habe...)
Was das Script macht?
Nichts besonderes XD - Nur eine Spielerei... aber ich bekomms einfach nicht hin :(
Ich habe eig. zwei Fragen, aber die wichtigere kommt zu erst, die zweite kommt dann, wenn Problem 1 gelöst ist :P
...wie bringe ich das Teil erfolgreich zum Laufen?!
Der Fehler scheint bei dem window.setTimeout Befehl zu sein!
Ich will nämlich eine Verzögerung bei der jeweiligen Ausgabe des Ergebnisses bis zur Fertigstellung haben (in dem Fall eine halbe Sekunde.)
Aber so wie ich mir das Vorgestellt habe, funktioniert das wohl nicht :/
Sprich, die function knacken() wird nur einmal ausgeführt, und zwar beim laden - <body onload="knacken(0,0,0,0,0)">
Durch die window.setTimeout Funktion wird das Script kein weiteres mal angeworfen...
Ich will aber, dass die Funktion so lange neu (im halben Sekunden Takt) gestartet wird, bist alle Variablen (zahl_a bis e) zusammen 30 ergeben...
Kann mir wer verraten, wie ich das Problem anders angehen kann?
Hier ist einmal der Code:
<html> <head> <title>Tresor</title> <script type="text/javascript"> function knacken(zahl_a,zahl_b,zahl_c,zahl_d,zahl_e) { zahl_a = 2 * zahl_e - 9; zahl_b = zahl_e - 4; zahl_c = 14 - zahl_e; zahl_d = zahl_e - 3; if (zahl_a + zahl_b + zahl_c + zahl_d + zahl_e == 30) { alert("Der Code Lautet: "+zahl_a+" "+zahl_b+" "+zahl_c+" "+zahl_d+" "+zahl_e); } else { zahl_e++; window.setTimeout("knacken(zahl_a,zahl_b,zahl_c,zahl_d,zahl_e)", 500); document.write("<\/br><h2><center>Der Tresor-Code wird geknackt:<\/center><\/h2><\/br>") document.write("<h4><center>"+zahl_a+" "+zahl_b+" "+zahl_c+" "+zahl_d+" "+zahl_e+"<\/center><\/h4>") } } </script> </head> <body onload="knacken(0,0,0,0,0)"> </body> </html>
Ich danke schon einmal im voraus für eure Hilfe ;)
lg
Sincer
PS:
Wenn das Script funktioniert gibt das Popup (Alert) am Ende Folgendes aus:
Der Code Lautet: 7 4 6 5 8 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
wenn du funktionen in einem windows.setTimeout aufrufst kannst du keine Argumente übergeben, d wirst das dann wohl über globale variablen lösen müssen (auch wenns eigentlich unschön ist)
Hab hier mal was dazu gefunden: http://forum.jswelt.de/javascript/26869-window-settimeout-aufrufen-funktion.html
Beitrag geändert: 29.9.2008 19:35:32 von projektverwaltung -
ich rate dir zu nem framework wie jquery oder prototype
http://jquery.com/
http://www.prototypejs.org/api
dann kansnte das da als ein prototype(klasse) defineiren welche in bestimmten zeitabständen ne methode aufruft etc
dann behällst du merh den überblick,
ansosnten währe die lösung des problems:
window.setTimeout("knacken("+zahl_a+","+zahl_b... -
ho ;)
Vielen dank für deine Antwort :)
Leider konnte ich das Problem noch immer nicht lösen...
(Vil. habe ich einen Fehler bei der Umsetzung gemacht, oder dich falsch verstanden...)
Ich arbeite meines Wissens bereits schon mit globalen variablen...
Ich habe das einmal erklärt bekommen XD
(Wenn kein "var" vor der Variablen in einer Funktion steht, sind diese Variablen automatisch global definiert... was je nachdem Vor- und Nachteile haben kann...) - Oder bin ich da Falsch informiert?
Hab das von hier: http://forum.jswelt.de/javascript/41585-laufschrift-fehler-code-2.html
(Einfach nach Hund suchen (Strg + F) - Dann bist du im richtigen Beitrag von ele XD)
Die anderen zwei Vorschläge von dem Forum habe ich ausprobiert... und sie brachten mir ebenfalls kein positives Ergebnis :(
Hier der erste Vorschlag für meinen Code:
window.setTimeout("knacken('"+zahl_a+"','"+zahl_b+"','"+zahl_c+"','"+zahl_d+"','"+zahl_e+"')", 500);
Der zweite Vorschlag:
window.setTimeout(function() { knacken(zahl_a,zahl_b,zahl_c,zahl_d,zahl_e) }, 500);
Hat leider beides nicht funktioniert...
Habe ich da was falsch verstanden?
Oder einen Fehler bei der Umsetzung gemacht?
Hast du vil. noch einen Vorschlag - Bzw. kannst du das mit den Globalen Variablen etwas genauer erklären?
Oder kann es vil. noch an einem anderen Fehler im Script liegen?
//EDIT:
Habe erst nach dem Post die Antwort von sotex erhalten...
Auch dir Danke für deine Hinweise :)
Aber auch die Zeile...
window.setTimeout("knacken("+zahl_a+","+zahl_b+","+zahl_c+","+zahl_d+","+zahl_e+")", 500);
...konnte mein Script nicht zum Laufen bringen :(
Von JS-Libraries höre ich zum ersten Mal...
Das eröffnet mir ein weiteres Fenster XD
Ich informiere mich einmal darüber... also danke ;)
Trotzdem würde ich das Script fürs erste lieber in der traditionellen Weise abschließen.
//EDIT ENDE
Vielen dank für eure Hilfe ;)
Sincer
Beitrag geändert: 29.9.2008 20:53:50 von sincer -
wenn du richtig javascript debugen willst und sogar mit ner konsole sachen interaktiv testen willst, benutz firebug
http://getfirebug.com/
is n extrem guter webdebugger. ideal für ajaxrequests zu durhcleuchten oder den DOM-Baum und javscriptfunktionen -
ho ;)
Ja, Firebug habe ich schon länger...
Nur ich benütze das Teil nie, weil ich mich nicht wirklich damit auskenne :/
(Vil. sollte ich mir mal die Bedienungsanleitung davon durchlesen XD )
Aber abgesehen davon... gibt es noch einen Fehler im Script, den ich einfach nicht sehe?
Das gibts ja nicht, dass das nicht funktioniert...
lg && thx
Sincer -
ho ;)
Also ich habe das ganze jetzt etwas umstrukturiert...
(War ein Tipp von einem Freund, aber den eigentlichen Bug hat er auch nicht gefunden :( )
Hier ist einmal der "neue" Code:
<html> <head> <title>Tresor</title> <script type="text/javascript"> var zahl_e = null; var zahl_a = 2 * zahl_e - 9; var zahl_b = zahl_e - 4; var zahl_c = 14 - zahl_e; var zahl_d = zahl_e - 3; function knacken() { if (zahl_a + zahl_b + zahl_c + zahl_d + zahl_e == 30) { alert("Der Code Lautet: "+zahl_a+" "+zahl_b+" "+zahl_c+" "+zahl_d+" "+zahl_e); } else { if (zahl_e == null) { zahl_e = 0; window.setTimeout('knacken()', 2000); document.write("</br><h2><center>Der Tresor-Code wird geknackt:</center></h2></br>") document.write("<h4><center>"+zahl_a+" "+zahl_b+" "+zahl_c+" "+zahl_d+" "+zahl_e+"</center></h4>") } else { alert("ich werde LEIDER NICHT ausgeführt!"); zahl_e++; window.setTimeout('knacken()', 2000); document.write("</br><h2><center>Der Tresor-Code wird geknackt:</center></h2></br>") document.write("<h4><center>"+zahl_a+" "+zahl_b+" "+zahl_c+" "+zahl_d+" "+zahl_e+"</center></h4>") } } } </script> </head> <body onload="knacken()"> </body> </html>
Diesmal habe ich die Variablen einmal grundsätzlich definiert... Noch bevor die Funktion knacken() beginnt!
Aktualisiert werden sie ja sowieso nur durch die "zahl_e" Variable.
Das Problem muss an der setTimeout Funktion liegen.
Habe da ein Kontroll PopUp eingebaut :P
alert("ich werde LEIDER NICHT ausgeführt!");
Wäre toll, wenn es auch erscheinen würde XD
Aber das passiert halt leider nicht...
Kurz gesagt:
Die Funktion knacken() wird einmal ausgeführt, und dann nie wieder (auch nicht 2 Sek später)
Was habe ich bei der setTimeout Funktion falsch gemacht?
Meiner Meinung nach kann es nur an der liegen...
Kann mir wer helfen?
vielen Dank :)
Sincer
-
Fehler ist vermutlich, dass du document.write benutzt, nachdem das Dokument schon lange geladen ist. Benutz stattdessen:
<html> <head> <title>Tresor</title> <script type="text/javascript"> function ausgeben(text) { var bodytag = document.getElementsByTagName("body")[0]; bodytag.innerHTML += text; } var zahl_e = null; var zahl_a = 2 * zahl_e - 9; var zahl_b = zahl_e - 4; var zahl_c = 14 - zahl_e; var zahl_d = zahl_e - 3; function knacken() { if (zahl_a + zahl_b + zahl_c + zahl_d + zahl_e == 30) { alert("Der Code Lautet: "+zahl_a+" "+zahl_b+" "+zahl_c+" "+zahl_d+" "+zahl_e); } else { if (zahl_e == null) { zahl_e = 0; window.setTimeout('knacken()', 2000); ausgeben("</br><h2><center>Der Tresor-Code wird geknackt:</center></h2></br>") ausgeben("<h4><center>"+zahl_a+" "+zahl_b+" "+zahl_c+" "+zahl_d+" "+zahl_e+"</center></h4>") } else { alert("ich werde LEIDER NICHT ausgeführt!"); zahl_e++; window.setTimeout('knacken()', 2000); ausgeben("</br><h2><center>Der Tresor-Code wird geknackt:</center></h2></br>") ausgeben("<h4><center>"+zahl_a+" "+zahl_b+" "+zahl_c+" "+zahl_d+" "+zahl_e+"</center></h4>") } } }</script> </head> <body onload="knacken()"> </body> </html>
Auch dieses Skript wird möglicherweise nicht tun, was du glaubst, denn die Zahlen a bis d werden nur einmal gesetzt und bleiben dann konstant (die Zuweisungen mit "zahl_a = 2*zahl_e -9" etc. müsstest du jedes mal vornehmen, wenn du zahl_e änderst. Es sei denn, das ist so gedacht, aber dann mach doch bitte gleich:
var zahl_e = null;
var zahl_a = - 9;
var zahl_b = - 4;
var zahl_c = 14;
var zahl_d = - 3; ).
EOM
Beitrag geändert: 4.10.2008 10:53:20 von merovius -
Zum Ausgangsscript:
Der Fehler ist dass du die Funktion im Body aufrufst. Wenn du dir deinen ausgeführten Quelltext ansiehst hat das document.wirte den ganzen Quelltext überschrieben und damit den Anfang mit deinem Script gelöscht.
Kenn mich leider nicht genug in JS aus um dir einen Lösungsvorschlag zu zeigen, aber ich würd mal versuchen im Body-Bereich ein Feld mit einer id festzulegen und den Text von deinem Script so ändern, dass er es in das Feld schreibt.
Ein anderer Kleiner Hinweis: du brauchst nur die zahl_e der funktion übergeben und abfragen, die anderen Werte haben ja keine Bedeutung mehr für dich und werden ja sofort mit den neuen Werten umgeschrieben.
Hoffe es hilft dir erst mal weiter. -
ho ;)
Vielen dank an euch beide!
Genau diese Informationen hatte ich gebraucht :)
@merovius:
Vielen Dank für deine Hilfe :)
Fehler ist vermutlich, dass du document.write benutzt, nachdem das Dokument schon lange geladen ist.
D'oh
Das wusste ich nicht!
Und auf das wäre ich nie gekommen (kenne mich noch ein bisschen zu wenig damit aus):
function ausgeben(text) { var bodytag = document.getElementsByTagName("body")[0]; bodytag.innerHTML += text; }
Kannst du mir vil. noch erklären, was der [0] er da am ende macht?
Und was bedeutet das += ?
Den Rest kann ich mir selbst zusammen reimen XD
@burningangels:
Der Fehler ist dass du die Funktion im Body aufrufst. Wenn du dir deinen ausgeführten Quelltext ansiehst hat das document.wirte den ganzen Quelltext überschrieben und damit den Anfang mit deinem Script gelöscht.
Alles klar :P
Das habe ich nicht gewusst :/
Dann ist es ja logisch, wenns nicht mehr funktioniert ^^
Thx auch an dich :)
Mein Script schaut nun so aus:
<html> <head> <title>Tresor</title> <script type="text/javascript"> function ausgeben(text) { var bodytag = document.getElementsByTagName("body")[0]; bodytag.innerHTML += text; } var zahl_e = null; var zahl_a = 2 * zahl_e - 9; var zahl_b = zahl_e - 4; var zahl_c = 14 - zahl_e; var zahl_d = zahl_e - 3; function knacken() { if (zahl_a + zahl_b + zahl_c + zahl_d + zahl_e == 30) { alert("Der Code Lautet: "+zahl_a+" "+zahl_b+" "+zahl_c+" "+zahl_d+" "+zahl_e); } else { if (zahl_e == null) { zahl_e = 0; zahl_a = 2 * zahl_e - 9; zahl_b = zahl_e - 4; zahl_c = 14 - zahl_e; zahl_d = zahl_e - 3; window.setTimeout('knacken()', 500); ausgeben("</br><h2><center>Der Tresor-Code wird geknackt:</center></h2></br>") ausgeben("<h4><center>"+zahl_a+" "+zahl_b+" "+zahl_c+" "+zahl_d+" "+zahl_e+"</center></h4>") } else { zahl_e++; zahl_a = 2 * zahl_e - 9; zahl_b = zahl_e - 4; zahl_c = 14 - zahl_e; zahl_d = zahl_e - 3; window.setTimeout('knacken()', 500); ausgeben("</br><h2><center>Der Tresor-Code wird geknackt:</center></h2></br>") ausgeben("<h4><center>"+zahl_a+" "+zahl_b+" "+zahl_c+" "+zahl_d+" "+zahl_e+"</center></h4>") } } } </script> </head> <body onload="knacken()"> </body> </html>
(also eig. eh noch fast das gleiche wie von merovius vorgeschlagen...
An dieser Stelle nochmal ein fettes Danke an alle, die mir Tipps gegeben haben :)
^^
Ich hatte ja im ersten Post bereits erwähnt, dass ich zwei Probleme habe...
Das Erste ist jetzt gelöst :)
Das Zweite stellt mich erneut vor ein Rätsel:
Ich habe nämlich keine Ahnung, wie ich es machen kann, dass zwar immer eine aktuelle Ausgabe kommt, aber die alte damit überschrieben wird...
Ich hätte gerne, dass der ganze Text nicht untereinander ausgegeben wird, sondern sich sozusagen Aktuallisiert...
Jetzt ist es ja so, dass es immer untereinander steht:
Tresor wird geknackt
Zahl
Tresor wird geknackt
Zahl
...
Ich hätte aber gerne, dass sobald die nächste Aktualisierung stattfindet, (sprich alle 500 MS) das Vorherige verschwindet, und nur die neue Ausgabe zu sehen ist.
(Es sollte dann so aussehen, als würde sich nur die Zahl verändern!)
Nur habe ich wie gesagt kA, wie ich das machen kann...
Gibt es einen Befehl, der die Seite wieder "leer" macht?
So eine art CLS für HTML XD
Oder eine andere Methode, wie ich diesen Effekt erreichen kann?
Weiterhin vielen Dank für eure Hilfe :D
lg && thx
Sincer
-
Kannst du mir vil. noch erklären, was der [0] er da am ende macht?
Die Funktion document.getElementsByTagName(string) liefert ein Array zurück, welches alle im HTML-Dokument vorkommenden HTML-Tags "body" (bzw. halt "img", "a", "table" oder whatever) enthält. Die [0] bedeutet: Nimm das erste (in diesem Fall vermutlich einzige) Element des Arrays aus allen Body-Tags.
Und was bedeutet das += ?
i += x;
ist das gleiche wie:
i = i + x;
Das gleiche funktioniert auch mitallen anderen Operatoren.
Ich hatte ja im ersten Post bereits erwähnt, dass ich zwei Probleme habe...
Das Erste ist jetzt gelöst :)
Das Zweite stellt mich erneut vor ein Rätsel:
Ich habe nämlich keine Ahnung, wie ich es machen kann, dass zwar immer eine aktuelle Ausgabe kommt, aber die alte damit überschrieben wird...
In dem Fall mayhst du am besten folgendes: Du definierst in der HTML-Datei noch ein div mit der id="ausgabe" und ersetzt dann das +=, worüber du dich gewundert hattest, durch ein =. also:
function ausgeben(text) { ausgabediv = document.getElementById("ausgabe"); ausgabediv.innerHTML = text; } //Jede Menge Javascript-Code function knacken() { if (zahl_a + zahl_b + zahl_c + zahl_d + zahl_e == 30) { alert("Der Code Lautet: "+zahl_a+" "+zahl_b+" "+zahl_c+" "+zahl_d+" "+zahl_e); } else { if (zahl_e == null) { // noch mehr Code ausgeben("</br><h2><center>Der Tresor-Code wird geknackt:</center></h2></br><h4><center>"+zahl_a+" "+zahl_b+" "+zahl_c+" "+zahl_d+" "+zahl_e+"</center></h4>") } else { // noch ein wenig mehr Code... ausgeben("</br><h2><center>Der Tresor-Code wird geknackt:</center></h2></br><h4><center>"+zahl_a+" "+zahl_b+" "+zahl_c+" "+zahl_d+" "+zahl_e+"</center></h4>") } } }
Wichtig ist dabei, dass du die gesamte Ausgabe in einen Aufruf packst, statt wie bisher in zwei, weil nu ja nicht mehr angehängt wird, sondern ersetzt.
Beitrag geändert: 4.10.2008 17:20:50 von merovius -
ho ;)
Vielen lieben Dank für deine Hilfe Merovius :)
Funktioniert ganz wunderbar :P
Danke
Sincer
PS: Ich mach dann wieder nen Post, wenn ich es genau so habe, wie ich es wollte :D
Also zum Herzeigen des Endergebnisses :P -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage