Mozilla kennt Variable nicht mehr ...?
Nils P.
- javascript
Hallo SELFHTML-Forum-am-Sonntag-Leser und -Leserinnen,
Ich hab hier ein kleines Primzahlen und -Teiler-Finder Script geschrieben, aber Mozilla verschluckt sich daran (IE und Opera nicht). Das Problem ist anscheinend: Sobald wg. "document.write" die Seite neu beschrieben wird, kennt Mozi die Variable "zahl" nicht mehr - zumindest lese ich das aus dem Moz-debugger. Ist das script irgendwie falsch, oder ist das ein reines Mozilla-problem? Hier ist der Quelltext:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head>
<title>Primzahlen</title>
<script type="text/javascript">
<!--
function primCheck()
{
var prim = true;
zahl = document.test.eingabe.value;
var i=2;
if(zahl>0)
{
for(var i=2;i<zahl;i++)
{
if((zahl % i)==0)
{
if(prim)
{
document.write('<a href="javascript:history.back()">noch eine</a><br><br>');
document.write(zahl+' ist keine Primzahl. Die Teiler sind:<br>');
}
prim = false;
document.write('<br>'+i);
}
}
if (prim)
alert(zahl+' -> Primzahl');
}
}
//-->
</script>
</head>
<body>
<form name="test" action="x">
<input type="text" name="eingabe">
<input type="submit" onClick="primCheck();return false;" value="Primzahl?">
</form>
</body></html>
Hi,
[...] kennt Mozi die Variable "zahl" nicht mehr - zumindest lese ich das aus dem Moz-debugger. Ist das script irgendwie falsch, [...]
function primCheck()
{
var prim = true;
zahl = document.test.eingabe.value;
mal überlegen: Was könnte hier unterschiedlich sein, so dass prim bekannt ist, zahl jedoch nicht?
Mich wundert nur, dass das Problem erst beim Überschreiben des Dokuments auftritt.
Cheatah
var prim = true;
zahl = document.test.eingabe.value;
mal überlegen: Was könnte hier unterschiedlich sein, so dass prim bekannt ist, zahl jedoch nicht?
Mich wundert nur, dass das Problem erst beim Überschreiben des Dokuments auftritt.
Hi Cheatah,
spielst du auf var an? ich hatte vergessen zu erwähnen, dass ich es in allen möglichen Kkombinationen mit/ohne var versucht hatte. Wenn "zahl" auch per "var" als Lokale deklariert wird, läuft das script in Moz zwar etwas länger, produziert aber trotzdem einen Fehler und läd die Seite endlos. (in Version 1.2.1, auch in NS 4).
Danke jedenfalls für Deine Antwort, wunderte mich schon, dass niemandem was einfällt? Notfalls würde ich das problem ganz anders lösen, aber das interessiert mich jetzt "aus Prinzip"...
Grüße,
Nils
Hi,
spielst du auf var an?
ja.
ich hatte vergessen zu erwähnen, dass ich es in allen möglichen Kkombinationen mit/ohne var versucht hatte.
Dann ist es einfach Tatsache, dass das Überschreiben des Dokuments das Dokument überschreibt. Da dies exakt beim ersten document.write() erfolgt, darfst Du eben derer nicht mehrere haben.
Danke jedenfalls für Deine Antwort, wunderte mich schon, dass niemandem was einfällt?
Die meisten hier vermeiden entsprechende Szenarien, da sie per se problematisch sind - ob nun wegen Variablen, weil die Seite nicht gebookmarkt werden kann (Usability) oder wegen anderer Gründe.
Notfalls würde ich das problem ganz anders lösen,
Das Problem _nicht_ ganz anders zu lösen würde ich mit dem Attribut "Not" versehen ;-)
Cheatah
Hi,
Die meisten hier vermeiden entsprechende Szenarien, da sie per se problematisch sind - ob nun wegen Variablen, weil die Seite nicht gebookmarkt werden kann (Usability) oder wegen anderer Gründe.
Du meinst, weil man diese Seite nicht mit einem feststehenden Eingabewert bookmarken könnte?
Das Problem _nicht_ ganz anders zu lösen würde ich mit dem Attribut "Not" versehen ;-)
Dann bitte ich doch glatt um einen Tipp, wie man das am besten lösen könnte - ah, ich höre schon "serverseitig" - aber ich will doch im Moment JavaScript lernen... Meine momentane Lösung sieht so aus wie unten angefügt (mit viel Hilfe des SelfHTML-Archivs).
cu,
Nils
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head>
<title>Primzahlen</title>
<script type="text/javascript">
<!--
function primCheck()
{
var prim = true;
var zahl = document.test.eingabe.value;
var alleTeiler='';
if(zahl>0)
{
for(var i=2;i<=(zahl/2);i++) // Teiler können max zahl/2 werden
{
if((zahl % i)==0)
{
if(prim)
{
alleTeiler = zahl+' ist keine Primzahl. Die Teiler sind:<br>'
}
prim = false;
alleTeiler += '<br>'+i;
}
}
schreibe(prim,zahl,alleTeiler);
}
}
function schreibe(prim,zahl,alleTeiler)
{
if (prim)
{
if (document.getElementById)
document.getElementById('teilerListe').innerHTML = zahl+' ist eine Primzahl.';
else if (document.all)
document.all['teilerListe'].innerHTML = zahl+' ist eine Primzahl.';
else if (document.layers)
{
document.layers['teilerListe'].document.open ();
document.layers['teilerListe'].document.write (zahl+' ist eine Primzahl.');
document.layers['teilerListe'].document.close ();
}
}
else
{
if (document.getElementById)
document.getElementById('teilerListe').innerHTML = alleTeiler;
else if (document.all)
document.all['teilerListe'].innerHTML = alleTeiler;
else if (document.layers)
{
document.layers['teilerListe'].document.open ();
document.layers['teilerListe'].document.write (alleTeiler);
document.layers['teilerListe'].document.close ();
}
}
}
//-->
</script>
</head>
<body>
<form name="test">
<input type="text" name="eingabe">
<input type="submit" onClick="primCheck();return false;" value="Primzahl?">
</form>
<div id="teilerListe" style="position:absolute;top:70px;left:10px;"> </div>
</body></html>
Hi,
Die meisten hier vermeiden entsprechende Szenarien, da sie per se problematisch sind - ob nun wegen Variablen, weil die Seite nicht gebookmarkt werden kann (Usability) oder wegen anderer Gründe.
Du meinst, weil man diese Seite nicht mit einem feststehenden Eingabewert bookmarken könnte?
einer der Gründe, die gegen ein document.write() nach dem kompletten Rendern einer Seite sprechen, ja.
Dann bitte ich doch glatt um einen Tipp, wie man das am besten lösen könnte - ah, ich höre schon "serverseitig" - aber ich will doch im Moment JavaScript lernen...
Ach, es ist ein lerntechnisches Experiment, bar jeden Ziels einer öffentlichen Nutzung? Da spricht nichts gegen. In der Praxis ist jedoch _alles_, was eine Abhängigkeit zu JavaScript besitzt, äußerst problematisch.
Meine momentane Lösung sieht so aus wie unten angefügt (mit viel Hilfe des SelfHTML-Archivs).
Merci.
var zahl = document.test.eingabe.value;
if(zahl>0)
zahl ist vom Typ String, nicht Integer oder Float.
for(var i=2;i<=(zahl/2);i++) // Teiler können max zahl/2 werden
Nein, maximal sqrt(zahl).
if((zahl % i)==0)
Btw: if ist keine Funktion, daher ist ein Leerzeichen vor der öffnenden Klammer sinnvoll.
<form name="test">
ERROR: Required attribute "action" missing.
Btw: Wenn Du aus zahl einen String der Länge zahl machst, liefert Dir folgende Regular Expression direkt "ist keine Primzahl":
/^(..+)\1+$/
Nicht, dass es performanter wäre ;-)
Cheatah
P.S.: Aus dem Gedächtnis; man möge mich ggf. korrigieren.
Hi!
Ach, es ist ein lerntechnisches Experiment, bar jeden Ziels einer öffentlichen Nutzung?
Genau!
var zahl = document.test.eingabe.value;
if(zahl>0)zahl ist vom Typ String, nicht Integer oder Float.
Das würde bedeuten:
var zahl = parseInt(document.test.eingabe.value);
so?
for(var i=2;i<=(zahl/2);i++) // Teiler können max zahl/2 werden
Nein, maximal sqrt(zahl).
Hm, ich will im Falle, dass prim=false alle Teiler der Zahl anzeigen lassen, also zB bei Eingabe 12 soll kommen: 2,3,4,6 - da stimmt dann zahl/2 schon, meine ich..?
Btw: Wenn Du aus zahl einen String der Länge zahl machst, liefert Dir folgende Regular Expression direkt "ist keine Primzahl":
/^(..+)\1+$/
Nicht, dass es performanter wäre ;-)
Hehe-nein. Übrigens, ich hatte ja immerhin als "kleine" Sicherung ein "if (zahl>0)" in die Funktion eingebaut.
Thx jedenfalls nochmal,
Nils