Whitespace in window.prompt
Bernd
- javascript
Hallo zusammen,
Ich habe folgendes Problem:
var UserName = "";
while (UserName == "" || UserName == null || UserName == "Dein Name")
{
UserName = window.prompt("Wie lautet dein Name?", "Dein Name");
}
window.alert("Guten Tag " + UserName);
Der Nutzer wird aufgefordert seinen Namen einzugeben. Dass er dies tut ist für den späteren Verlauf wichtig. Nun könnte er aber die Leertaste benutzen womit er die while Schleife "überlistet".
Wie ich vermute muss mit http://de.selfhtml.org/javascript/objekte/string.htm#replace@title=replace() und ähnlichem gearbeitet werden.
Da ich mich bis jetzt noch nie damit beschäftigt habe hoffe ich auf ein paar gute Tipps oder sogar auf ggf. einen Lösungsvorschlag.
Bernd
Hallo Bernd,
ich denke Mal wonach du suchst ist eine trim() Function, wie diese:
function trim(str) {
return str.replace(/^\s+|\s+$/g, '');
}
Grüße Kai
Hallo Bernd,
ich denke Mal wonach du suchst ist eine trim() Function, wie diese:
function trim(str) {
return str.replace(/^\s+|\s+$/g, '');
}
>
> Grüße Kai
Ja!! Genau das ist es!
Nach ein paar Tests ergibt sich allerdings ein neues Problemchen..
~~~javascript
var UserName = "";
while (UserName == "" || UserName == null || UserName == "Dein Name")
{
UserName = window.prompt("Wie lautet dein Name?", "Dein Name");
UserName = trim (UserName);
}
window.alert("Hallo " + UserName);
So, das mit dem Whitespace funktioniert super. Jetzt kann man aber bei der window.prompt Aufforderung auf 'Abbrechen' klicken womit die while-Schleife abbricht und das darauf folgende window.alert nicht ausgeführt wird.. Weiß jemand was ich nun schon wieder "verbockt" hab?
Bernd
Hallo
Vorweg: Bitte lösche den TGeil dev vorherigen Beitrags, auf den du nicht beziehen willst. Das fördert die Übersicht.
Ja!! Genau das ist es!
Nach ein paar Tests ergibt sich allerdings ein neues Problemchen..
var UserName = "";
while (UserName == "" || UserName == null || UserName == "Dein Name")
{
UserName = window.prompt("Wie lautet dein Name?", "Dein Name");
UserName = trim (UserName);
}
window.alert("Hallo " + UserName);
>
> So, das mit dem Whitespace funktioniert super. Jetzt kann man aber bei der window.prompt Aufforderung auf 'Abbrechen' klicken womit die while-Schleife abbricht …
Wieviele Benutzernamen kann der Benutzer denn auf einmal eingeben? Mir stellt sich die Frage, was die Schleife da zu suchen hat. Normalerweise gibt \*ein\* Benutzer \*einen\* Benutzernamen an. Eine Prüfung bezieht sich darauf, ob dieser gültig ist. Bei dir wird eine Schleife angestoßen, die ausgeführt wird, solange der Benutzername ein Leerstring, NULL oder „Dein Name“ ist. Kannst du das Konstrukt bitte näher erläutern?
Tschö, Auge
--
Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
Terry Pratchett, "Wachen! Wachen!"
ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
[Veranstaltungsdatenbank Vdb 0.3](http://termindbase.auge8472.de/)
Hallo
Vorweg: Bitte lösche den TGeil dev vorherigen Beitrags, auf den du nicht beziehen willst. Das fördert die Übersicht.
Jaja, unten rum alles korrigieren und oben dabei vergessen. Das soll natürlich „… Teil des …“ heißen.
Tschö, Auge
Wieviele Benutzernamen kann der Benutzer denn auf einmal eingeben? Mir stellt sich die Frage, was die Schleife da zu suchen hat. Normalerweise gibt *ein* Benutzer *einen* Benutzernamen an. Eine Prüfung bezieht sich darauf, ob dieser gültig ist. Bei dir wird eine Schleife angestoßen, die ausgeführt wird, solange der Benutzername ein Leerstring, NULL oder „Dein Name“ ist. Kannst du das Konstrukt bitte näher erläutern?
Tschö, Auge
Nun,
var UserName = "";
while (UserName = "" || UserName == null || UserName == "Dein Name")
{
UserName = window.prompt("Wie lautet dein Name?", "Dein Name");
UserName = trim (UserName);
}
window.alert("Hallo " + UserName);
Die while-Schleife erscheint mir als eine einfache Möglichkeit den User dazu zu bringen einen Namen einzugeben.. Normalerweise wird der User auch von sich aus einen Namen eingeben. Das günstige an der while-Schleife ist, dass sie mögliche "Täuschungsversuche" wie Whitespace, Nichts oder Abbrechen des Users "abblocken" kann (Sie überprüft praktisch die Gültigkeit der Eingabe des Users). Im Falle dieses Falles wird der User direkt erneut nach seinem Namen gefragt. Die Variable UserName kommt an zahlreichen Stellen der Webseite vor - und Whitespace etc. sind da fehl am Platze.
Aber nun zu der Sache die ich nicht ganz nachvollziehen kann:
Ohne den Script-Teil
User Name = trim (UserName);
Um mir den umständlichen Teil wie
while (UserName == "" || UserName == " " || UserName == " " ~~
zu ersparen hat mir jemand die function trim (str) geschrieben (Danke nochmal dafür ;) )
Mit dem Script-Teil
UserName = trim (UserName);
gibt es einen Unterschied:
Drückt der User auf 'Abbrechen' fällt das nicht mehr unter die Gültigkeitsüberprüfung der while-Schleife - die while-Schleife bricht ab und der darauf folgende Teil im Script
window.alert("Hallo " + UserName);
wird nicht ausgeführt..
Ergo liegt es an
UserName = trim (UserName);
Ich habe keine Erklärung dafür warum die ' null '-Gültigkeitsüberprüfung mit dem trim-Teil nicht mehr funktioniert oder wie man das Ganze gar wieder zum laufen bringt ;)
Bernd
Hallo Bernd,
function trim(str) {
return str.replace(/^\s+|\s+$/g, '');
}
function checkUserName() {
var UserName = prompt('Wie lautet dein Name?', 'Dein Name');
if (UserName !== null) {
UserName = trim(UserName);
if (UserName !== 'Dein Name' && UserName.length !== 0) {
alert('Dein Name: ' + UserName)
}
}
}
Also mein Ansatz würde eher so aussehen, aber falls die Javascript Spezialisten da noch einmal drübersehen kann das auch nichts schaden.
Grüße Kai
Hallo,
in den Script sind zwei offensichtliche Fehler:
while (UserName = "" || UserName == null || UserName == "Dein Name")
^^^
Beim ersten Ausdruck weist du UserName einen Wert zu. = ist der Zuweisungsoperator. Du suchst den Vergleichsoperator: ==
UserName = window.prompt("Wie lautet dein Name?", "Dein Name");
UserName = trim(UserName);
Wenn der User hier »Abbrechen« wählt, ist UserName kein String, also kannst du nicht trim darauf aufrufen. Das wird eine Ausnahmefehler geben, der das Programm abbricht, denn null hat keine replace-Methode. Du müsstest hier schon prüfen, ob der Wert nicht null ist bzw. ein String ist.
Mathias
Hallo Bernd!
So, das mit dem Whitespace funktioniert super. Jetzt kann man aber bei der window.prompt Aufforderung auf 'Abbrechen' klicken womit die while-Schleife abbricht und das darauf folgende window.alert nicht ausgeführt wird.. Weiß jemand was ich nun schon wieder "verbockt" hab?
Ja, du hast einen konzeptionellen Fehler auf deiner Seite.
Wenn ein "Benutzername" zwingend erforderlich ist, dann mache den Teil deiner Website von einer (Benutzer)Registrierung und entsprechendem Login abhängig.
Und wenn der User auf 'Abbrechen' klickt, musst du die Eingabe "untersuchen" (was du so oder so machen solltest).
AFAIK ist das Verhalten aber nicht einheitlich bei allen Browsern.
Üblicherweise ist die Variable = NULL beim Klick auf 'Abbrechen'. Safari liefert aber in dem Fall einen leeren String (was ggf. zu einer Endlosschleife führen kann).
Gruß Gunther
Hallo,
Ich möchte mich vielmals für eure tollen Tipps bedanken!
Ich habe das Script nun endlich zum laufen gebracht. Zum Schluss möchte ich euch das fertige Script präsentieren:
function trim (str)
{
return str.replace(/^\s+|\s+$/g, "");
}
function checkUserName ()
{
var UserName = "";
while (UserName == "" || UserName == null || UserName == "Dein Name")
{
UserName = window.prompt("Wie lautet dein Name?", "Dein Name");
if (UserName !== null)
{
UserName = trim (UserName);
if (UserName !== "Dein Name" && UserName.length !== 0)
{
window.alert("Hallo " + UserName)
}
}
}
}
checkUserName ();
Danke,
Bernd
Hallo
Ich habe das Script nun endlich zum laufen gebracht. Zum Schluss möchte ich euch das fertige Script präsentieren:
Auch wenn ich kein JavaScript-Crack bin, habe ich ein paar Fragen und Anmerkungen.
function trim (str)
{
return str.replace(/^\s+|\s+$/g, "");
}function checkUserName ()
{
var UserName = "";
while (UserName == "" || UserName == null || UserName == "Dein Name")
Dir ist schon klar, dass UserName immer "" sein muss und nie, wirklich nie, null oder "Dein Name" sein kann, weil du es eine Zeile vorher genau so (leer) festlegst?
> ~~~javascript
{
> UserName = window.prompt("Wie lautet dein Name?", "Dein Name");
> if (UserName !== null)
> {
> UserName = trim (UserName);
> if (UserName !== "Dein Name" && UserName.length !== 0)
Du akzeptierst hier *alles* außer dem Wert "Dein Name" und einer Länge gleich 0. Ob die Prüfung so reicht (Du willst doch bestimmt ausschließlich Zeichenketten als Benutzernamen akzeptieren?) kann ich nicht beurteilen. Vielleicht bin ich da auch auf dem Holzweg.
Die Prüfung UserName.length !== 0
kannst du auf UserName.length > 0
umstellen oder erwartest du negative Längen von Zeichenketten? ;-) Die Reihenfolge erscheint mir zudem andersherum eingängiger, auch wenn das eine Geschmacksfrage sein dürfte. Ich prüfe jedenfalls bei einer gemeinsamen Bedingung den Spezialfall nach dem allgemeineren.
Tschö, Auge
Hi,
var UserName = "";
while (UserName == "" || UserName == null || UserName == "Dein Name")
{
UserName = window.prompt("Wie lautet dein Name?", "Dein Name");
Dir ist schon klar, dass UserName immer "" sein muss und nie, wirklich nie, null oder "Dein Name" sein kann, weil du es eine Zeile vorher genau so (leer) festlegst?
Dir ist schon klar, daß das Unsinn ist, da sich UserName in der Schleife ändern kann?
cu,
Andreas
Hallo
var UserName = "";
while (UserName == "" || UserName == null || UserName == "Dein Name")
{
UserName = window.prompt("Wie lautet dein Name?", "Dein Name");Dir ist schon klar, dass UserName immer "" sein muss und nie, wirklich nie, null oder "Dein Name" sein kann, weil du es eine Zeile vorher genau so (leer) festlegst?
Dir ist schon klar, daß das Unsinn ist, da sich UserName in der Schleife ändern kann?
Ok, du meinst die Schleife, die beim Aufruf der Funktion nur einmal durchläuft, da es konkret nur einen Wert für UserName gibt, der justamente vorher mit "" initialisiert wird?
Mit Bitte um Aufklärung, tschö, Auge
Hi,
var UserName = "";
while (UserName == "" || UserName == null || UserName == "Dein Name")
{
UserName = window.prompt("Wie lautet dein Name?", "Dein Name");Dir ist schon klar, dass UserName immer "" sein muss und nie, wirklich nie, null oder "Dein Name" sein kann, weil du es eine Zeile vorher genau so (leer) festlegst?
Dir ist schon klar, daß das Unsinn ist, da sich UserName in der Schleife ändern kann?
Ok, du meinst die Schleife, die beim Aufruf der Funktion nur einmal durchläuft, da es konkret nur einen Wert für UserName gibt, der justamente vorher mit "" initialisiert wird?
genau, und innerhalb der Schleife bekommt UserName einen neuen Wert zugewiesen, der aber wieder der leere String oder null oder "Dein Name" sein kann - und in diesen Fällen wird die Schleife eben ein zweites, drittes, viertes Mal durchlaufen, bis der genervte Nutzer endlich irgendwas anderes eingibt, zum Beispiel "asdf". ;-)
So long,
Martin