Bernd: Whitespace in window.prompt

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

  1. 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

    1. 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

      1. 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/)
        
        1. 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

          --
          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
        2. 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);

          • kann der User die Eingabezeile nicht mit 'Dein Name' ausgefüllt lassen,    (' "Dein Name" '-Gültigkeitsüberprüfung)
          • kann der User die Eingabezeile nicht leer lassen und auf 'Weiter' klicken,    (' "" '-Gültigkeitsüberprüfung)
          • kann der User die Eingabeaufforderung nicht Abbrechen    (' null '-Gültigkeitsüberprüfung)

          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

          1. 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

          2. 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

      2. 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

  2. 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

    1. 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

      --
      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
      1. 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

        --
        Warum nennt sich Andreas hier MudGuard?
        O o ostern ...
        Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
        1. 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

          --
          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
          1. 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

            --
            Männer haben nur eine Angst: Die Angst, kein Mann zu sein.
              (Liv Tyler, US-Schauspielerin)
            Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(