bmxruler: Problem mit alerts und ggf. if else

Hallo leute... ich bin neu in dem Forum und hoffe ihr könnt mir helfen. Ich möchte in meinem kleinen Skript noch eine fehlermeldung einbauen die erst dann erscheint, wenn 111 nicht ersetzt wurde. Und zwar anstelle des eigentlichen alerts. Ich blicke nicht mehr durch. Also wenn z.B. 222, oder 333 eingegeben wird und nichts ersetzt wird, dann soll die Meldung kommen: "GEHT NICHT". Ich kann mich nur sehr schlecht ausdrücken. ich hoffe ihr versteht mich. Wenigstens ein bisschen :D

<html>
<body>



 <script>
function getidc() {
   
  var a = document.getElementById('IDC').value;

  a = a.replace('111', '42458' )  ; 
  
  last_digit = a.slice(-1);
  rest = a.slice(0,-1);
  control_digit = last_digit;
  if (parseInt(last_digit) + 3 >= 10){

    tmp = parseInt(control_digit) + 3;
    control_digit = parseInt(tmp) % 10;
  }
  
  
  else {

    tmp = parseInt(control_digit) + 3;
    control_digit = parseInt(tmp) % 10;
  }
  
  result = rest + control_digit
  
  
  document.getElementById('IDC').value = result ;


   
   
   
   
  var copyText = document.getElementById('IDC');

  copyText.select();

  document.execCommand('copy');

  alert("Kopiert: " + copyText.value );

  

}

  
    
</script> 





<input type="text" size="80" id="IDC" onChange="getidc();" /><br><br>


<button class="funktionen" onclick="getidc()">Kopieren</button>




</body>
</html>
  1. Hallo,

    magst du mal aufschreiben,

    • was das Script machen soll,
    • welchen möglichen Fehler du wo abfragen möchtest, und
    • warum im if- und im else-Zweig das gleiche gemacht wird?

    Gruß
    Jürgen

    1. sehr gerne.

      zu 1: das Skript soll aus einer langen zahl (zb: 1111123456767) die ersten 111 durch die aufgeführten Ziffern ersetzen. Zudem soll die letzte Ziffer einen vorgegebenen wert addiert bzw subtrahiert werden. Dabei darf allerdings nur die letzte Ziffer verändert werden. (zb: 8+3=11 = 1) Die zehnerstelle darf nicht geändert werden. Dann kommt der der alert: (Kopiert: ergebnis).

      zu 2:Lautet die Zahl zb: 222354654657, oder 333.... oder 123... soll eine Fehlermeldung erscheinen die dem nutzer sagt: "kann nicht aufgelöst werden" oder "geht nicht"

      zu 3: das skript funktioniert zwar auch ohne "else", jedoch nur wenn die letzte Ziffer gerechnet wird, und das ergebnis größer als 10 ist. ist das Ergebnis kleiner als 10, ändert sich die letzte Ziffer nicht mehr. Warum?? keine Ahnung. also habe ich ein "else" gebaut.... und jetzt funzt es (zb: ist die letzte Ziffer eine 5 und wird dann mit 3 addiert, ändert sich die letzte Ziffer der Zahl nicht)

      ich muss dazu sagen, das ich kein Fachmann auf dem Gebiet bin :D Hoffentlich hab ich mich verständlich ausgedrückt.

      gruß auch an dich..... Stefan

      1. Hallo bmxruler,

        wenn du im then und else Teil eines if das gleiche stehen hast, ist die Lösung ganz einfach: der if ist überflüssig.

        control_digit = last_digit;
        if (parseInt(last_digit) + 3 >= 10) {
           tmp = parseInt(control_digit) + 3;
           control_digit = parseInt(tmp) % 10;
        }
        else {
           tmp = parseInt(control_digit) + 3;
           control_digit = parseInt(tmp) % 10;
        }
        

        macht exakt das gleiche wie

           control_digit = last_digit;
           tmp = parseInt(control_digit) + 3;
           control_digit = parseInt(tmp) % 10;
        

        und eigentlich auch das gleiche wie

           control_digit = (parseInt(last_digit) + 3) % 10;
        

        Um herauszufinden, ob dein Replace etwas gemacht hat, kannst Du das Replace-Ergebnis in einer anderen Variablen speichern und nach dem Replace vergleichen, ob sich etwas geändert hat.

        Wenn nicht, gibst Du den GEHT NICHT Alert aus und verlässt die Funktion mit return.

        Du solltest aber noch überprüfen, ob dein last_digit eine Ziffer ist. Also z.B.

        if (last_digit < '0' || last_digit > '9') {
           alert("Ungültige Eingabe");
           return;
        }
        

        Statt einer solchen Prüfung könntest Du auch das pattern-Attribut von input benutzen, du musst dann nur verstehen was reguläre Ausdrücke sind. Du kannst mit einem Pattern auch sicherstellen, dass irgendwo 111 in deiner Eingabe vorkommt.

        Für Fehlermeldungen könnte sich auch ein weiteres HTML Element anbieten, das den Fehlertext aufnimmt. Alerts sind nervig. Ich will Dir jetzt allerdings nicht mit dem Validation-API kommen, das ist für Dich noch zu komplex.

        Rolf

        --
        sumpsi - posui - clusi
        1. leider macht das "if" nicht das gleich wie das "else". "if" addiert nur wenn ergebnis größer als 10. ist das ergebnis kleiner... passiert einfach nichts...

          scheinbar jedenfalls :(

          1. Hallo bmxruler,

            hast Du deinen Code selbst erstellt, oder irgendwoher mit Copy+Paste zusammengesucht, ohne zu verstehen was passiert?

            In dem Code, den Du oben gepostet hast, machen then- und else-Teil genau das gleiche.

            Rolf

            --
            sumpsi - posui - clusi
            1. teils teils... aber versuche es ruhig mal... es funktioniert nicht. ich weiß was if und else machen. im if wird die 3 nur zur letzten ziffer addiert wenn das ergebnis größer als 10 ist :D darum das else. im if die erste zeile sagt: wenn ergebnis größer als 10 mach -1 auf der zehnerstelle ;) allerdings wird komischer weise nur dann addiert wenn auch das ergebnis größer als 10 ist. es funktioniert nur mit dem else. das da das gleich drinne steht ist mir bewusst. aber dort wird dann eben auch die letzte ziffer gerechnet wenn das ergebnis kleiner als 10 ist. das tut es eben nur mit dem if nicht.

              versucht es mal ;) ach ja... sry wegen meiner kleinschreibung. bin kurz angebunden auf der arbeit.

              1. Hallo bmxruler,

                wir reden wohl schrecklich weit aneinander vorbei. Bzw. deine Arbeit lenkt dich zu sehr ab? In dem Fall warte bis Feierabend und guck es Dir in Ruhe an.

                Dieser Code:

                control_digit = last_digit;
                if (parseInt(last_digit) + 3 >= 10) {
                   tmp = parseInt(control_digit) + 3;
                   control_digit = parseInt(tmp) % 10;
                }
                

                addiert 3 auf die letzte Stelle und entfernt den 10-er Übertrag. Dann und nur dann, wenn die letzte Stelle 7,8 oder 9 ist.

                Du willst aber auch dann 3 auf die letzte Stelle addieren, wenn sie 0,1,2,3,4,5 oder 6 ist. Deine Lösung war, einen else hinzuzufügen und den Code aus dem THEN-Teil dahin zu kopieren. Das Entfernen des Übertrags mittels % 10 ist dann zwar überflüssig, schadet aber auch nicht.

                Was ich Dir aber die ganze Zeit sagen will, ist: DER IF IST UNNÖTIG (und die zugehörigen geschweiften Klammern natürlich auch). Wenn im THEN und ELSE Teil der gleiche Code ausgeführt wird, ist der IF überflüssig. Der folgende Code addiert auf jede Ziffer von 0-9 3 auf und entfernt einen eventuell entstandenen Zehner-Übertrag. Der zweite parseInt ist auch unnötig. Es ist ja schon ein int.

                control_digit = last_digit;
                
                   tmp = parseInt(control_digit) + 3;
                   control_digit = tmp % 10;
                
                

                Rolf

                --
                sumpsi - posui - clusi
                1. so Leute.... ich glaube zu wissen was ihr meint. Nach meinem verständnis sollte es auch so funktionieren. Tut es auch :D Ich bin halt ein wenig unbeholfen was javascript angeht. Bitte entschuldigt das :D aber wie bekomme ich das hin?

                  Um herauszufinden, ob dein Replace etwas gemacht hat, kannst Du das Replace-Ergebnis in einer anderen Variablen speichern und nach dem Replace vergleichen, ob sich etwas geändert hat. Wenn nicht, gibst Du den GEHT NICHT Alert aus und verlässt die Funktion mit return.

                  <html>
                  <body>
                  
                   <script>
                  function getidc() {
                     
                    var a = document.getElementById('IDC').value;
                  
                    a = a.replace('111', '42458' )  ; 
                    
                    last_digit = a.slice(-1);
                    rest = a.slice(0,-1);
                    control_digit = last_digit;
                    parseInt(last_digit) + 3 >= 10;
                  
                    tmp = parseInt(control_digit) + 3;
                    control_digit = parseInt(tmp) % 10;
                    
                    result = rest + control_digit
                  
                    document.getElementById('IDC').value = result ;
                     
                    var copyText = document.getElementById('IDC');
                  
                    copyText.select();
                  
                    document.execCommand('copy');
                  
                    alert("Kopiert: " + copyText.value );
                  }
                  </script> 
                  
                  <input type="text" size="80" id="IDC" onChange="getidc();" /><br><br>
                  

                  Edit Rolf B: Leerzeilenwüste begrünt und ~~~ Rahmen hinzugefügt.

                  1. Hallo bmxruler,

                    Ich bin halt ein wenig unbeholfen was javascript angeht

                    Nicht nur. Du überliest auch einiges von dem, was man für Dich aufschreibt. Ich bin kein Unternehmensberater. Ich produziere Text des Inhalts wegen, nicht weil ich nach Menge bezahlt werde.

                    Warum liegt zum Beispiel dieses Trümmerteil noch herum:

                    parseInt(last_digit) + 3 >= 10;
                    

                    Das ist die Bedingung aus dem if. Wenn der if wegkommt, dann natürlich auch die Bedingung. Der zweite parseInt ist - wie geschrieben - ebenfalls unnötig. Und die Prüfung, ob dein last_digit überhaupt eine Ziffer ist, muss auch hinein.

                    Weitere Hinweise:

                    Schreibe in diesem Forum vor und hinter Codebeispiele bitte ein ~~~. Dann wird das auch als Code dargestellt. Für schöne Farbgebung von Code kannst Du noch die Programmiersprache dahinter schreiben, z.B. html, css oder js. Beispiel:

                      ~~~js
                      parseInt(last_digit) + 3 >= 10;
                    
                    
                    Achte bitte darauf, JavaScript-Anweisungen mit einem Semikolon zu beenden. Das kann andernfalls Syntaxfehlermeldungen oder merkwürdige Fehler auslösen. Nur nach einem Anweisungsblock oder Funktionsdefinition (das, was in {...} steht) kommt kein Semikolon[^1].
                    
                    ~~~js
                     result = rest + control_digit;
                    

                    Wie Du feststellst, ob Du ein "111" ersetzt hast, habe ich Dir gestern um 21:46 Uhr beschrieben (Um herauszufinden, ob dein Replace etwas gemacht hat...). Bist Du nicht im Stande, das eigenständig in JavaScript umzusetzen? Oder hast Du diesen Teil in der Informationsflut, die ich losgelassen habe, bloß übersehen?

                    Rolf

                    --
                    sumpsi - posui - clusi
                    1. ich fürchte ich bin dazu nicht im Stande. tut mir leid... Ich bin halt ein gerade dabei mir Javascript anzueignen. Ich will euch auch nicht länger nerven. So schaut das ding nun aus. Wie ich den replace vergleiche, keinen blassen Schimmer... wie ich das Ergebnis in einer Variabelen speicher.... keine ahnung (var b = keine Ahnung) ich habe es schon gelesen, aber ich weiß halt nicht wie es geht. Danke trotzdem für eure Hilfe.

                      
                      
                      
                      function getidc() {
                      
                         
                      
                        var a = document.getElementById('IDC').value;
                      
                      
                      
                        a = a.replace('111', '42458' )  ; 
                      
                        
                      
                        last_digit = a.slice(-1);
                      
                        rest = a.slice(0,-1);
                      
                        control_digit = last_digit;
                      
                        
                      
                      
                      
                        tmp = parseInt(control_digit) + 3;
                      
                        control_digit = parseInt(tmp) % 10;
                      
                        
                      
                        result = rest + control_digit
                      
                      
                      
                        document.getElementById('IDC').value = result ;
                      
                         
                      
                        var copyText = document.getElementById('IDC');
                      
                      
                      
                      
                      
                      if (last_digit < '0' || last_digit > '9') {
                      
                         alert("Ungültige Eingabe");
                         window.location.reload();
                      
                         return;
                      
                         
                      
                      }
                      
                      
                      
                        copyText.select();
                      
                      
                      
                        document.execCommand('copy');
                      
                      
                      
                        alert("Kopiert: " + copyText.value );
                      
                      
                      
                      
                      
                      }
                      
                      
                      
                      
                      1. Hallo bmxruler,

                        du brauchst Dich nicht zu entschuldigen, das sollte vielleicht eher ich tun. Aber ich muss doch wissen, wo ich Dich abholen kann.

                        Gucken wir uns Deinen Code mal an.

                          var a = document.getElementById('IDC').value;
                          var a = eingabe.replace('111', '42458' )  ; 
                        

                        Zuerst: Suche im Dokument nach dem Element mit ID 'IDC', lies den Wert aus (.value) und speichere das in der Variablen a. So weit, so gut.
                        Dann: Nimm den Wert in a, ersetze darin 111 durch 42458 und speichere das Ergebnis wieder in a.

                        Wenn Du das so schreibst:

                          var eingabe = document.getElementById('IDC').value;
                          var a = eingabe.replace('111', '42458' ); 
                        

                        dann speicherst Du den Eingabewert in einer eigenen Variablen und die Ersetzung in a. Den alten Wert hast Du noch in eingabe. Jetzt kannst Du vergleichen.

                          if (a == eingabe) {
                            alert("Geht nicht, Eingabe muss 111 enthalten!");
                            return;
                          }
                        

                        Als nächstes kommt bei Dir

                           last_digit = a.slice(-1);
                        

                        Die Prüfung, ob das eine Ziffer ist, sollte nun der nächste Schritt sein. Denn warum noch viel Code ausführen, wenn die Eingabe jetzt schon als falsch erkannt wird. Also verschieben wir Deinen Prüfungscode hierhin:

                           if (last_digit < '0'	||	last_digit > '9') {
                              alert("Ungültige Eingabe"); 
                        // ?? window.location.reload();
                              return;
                           }
                        

                        Den Reload sollte man besser bleiben lassen. Wenn Du UNBEDINGT das Eingabefeld leeren willst, kannst Du das so tun:

                              document.getElementById('IDC').value = '';
                        

                        Aber warum soll der Anwender seinen Eingabefehler nicht sehen? Ich würde es nicht tun.

                        Jetzt kann die Ziffernveränderung erfolgen, und danach kannst Du die Kopie ins Clipboard setzen.

                           rest = a.slice(0,-1);
                           control_digit = last_digit;
                           tmp = parseInt(control_digit) + 3;
                           control_digit = parseInt(tmp) % 10;
                           result = rest + control_digit;
                           document.getElementById('IDC').value = result;
                        

                        Das ist viel Code, den man etwas eindampfen kann. Nicht jeden Zwischenwert muss man in Variablen speichern. Man kann eine Zwischenrechnung auch direkt ausführen.

                        Eine mögliche Zusammenfassung wäre:

                           var rest = a.slice(0,-1);
                        
                           //                                    <-------->  last_digit direkt verwenden
                           //                                    |        |
                           var control_digit =         (parseInt(last_digit) + 3) % 10;
                           //                 ^^^^^^^   |                      |
                           //                    |      <--- Formel für tmp --->
                           //                    |
                           //  kein zweiter parseInt() nötig
                        
                           var result = rest + control_digit;
                           document.getElementById('IDC').value = result;
                        

                        Die Klammern um die Formel für tmp müssen sein, wegen „Punktrechnung vor Strichrechnung“.

                        Beachte die var Befehle. Wenn Du die weglässt, würden die Variablen global angelegt werden und nicht nur innerhalb deiner Funktion. Das willst Du nicht. JavaScript-Projekte, die über eine zwei bis drei kleine Funktionen hinaus gehen, müssen streng darauf achten, nicht den globalen Speicher zu vermüllen.

                        Da result sonst nirgends gebraucht wird, braucht man diese Variable eigentlich auch nicht (es sei denn, man möchte beim Debuggen die Zwischenwerte sehen):

                           var rest = a.slice(0,-1);
                           var control_digit = (parseInt(last_digit) + 3) % 10;
                        
                           document.getElementById('IDC').value = rest + control_digit;;
                        

                        Hiernach kommt dann noch dein Code für das Kopieren in's Clipboard. Fertig. Nicht superschön, aber es tut, was Du brauchst, mit den Mitteln, die Du kennst.

                        Achso. Beim Clipboard-Kopieren speicherst Du Dir eine Referenz auf das Eingabefeld. Das kann man eigentlich am Anfang tun und damit das ständige Aufrufen von getElementById vermeiden. Hier ist die fertige Funktion:

                        function getidc() {
                           var inputElement = document.getElementById('IDC');
                           var eingabe = inputElement.value;
                        
                           var a = eingabe.replace('111', '42458' ) ;
                           if (a != eingabe) {
                              alert("Ungültige Eingabe, 111 muss enthalten sein!");
                              return;
                           }
                           var last_digit = a.slice(-1);
                           if (last_digit < '0'	 	last_digit > '9') {
                              alert("Ungültige Eingabe, letzte Stelle ist keine Ziffer!");
                              return;
                           }
                           var rest = a.slice(0,-1);
                           var control_digit = (parseInt(control_digit) + 3) % 10;
                        
                           inputElement.value = rest + control_digit;
                        
                           inputElement.select();
                           document.execCommand('copy');
                           alert("Kopiert: " + inputElement.value );
                        }
                        

                        So, uff, ich hoffe im Code ist kein Tippfehler. Das ist ohne Test entstanden 😉

                        Rolf

                        --
                        sumpsi - posui - clusi
                        1. Wow... also das ist mehr Hilfe als ich mir erhofft habe. Ich werde es gleich mal ausprobieren. Ich danke euch allen unendlich das ihr euch so eine Arbeit macht mir zu helfen. Normalerweise stehe ich nicht so sehr auf dem Schlauch, aber irgendwie trete ich zur Zeit auf der Stelle. Ich würde gerne JavaScript bis ins Detail lernen. Aber mir fehlen einfach Ansprechpartner bei einfachen Fragen. Ich sollte mal mehr Bücher lesen glaube ich. Also nochmals 1000 dank für alles.

                          1. Hallo bmxruler,

                            ich hatte den anderen Zweig zum Thema "111" noch nicht gesehen.

                            Ist es so, dass die 111 definitiv am Anfang stehen muss, um ersetzt zu werden? Hier musst Du deine fachlichen Anforderungen einmal genau formulieren. Was darf wo stehen, was ist ok, was nicht.

                            Über die Technik machen wir uns dann gemeinsam Gedanken.

                            Rolf

                            --
                            sumpsi - posui - clusi
                        2. Lieber Rolf.... :D

                          Ich habe es nun geschaft die Funktion zu teste,. Irgendwo scheint ein fehler zu sein. Habe leider keine Konsole auf der Arbeit, daher sehe ich nicht wo der Fehler ist. kannst du nochmal drüber schauen? Ich bekomme es einfach nicht hin.

                        3. also... ich habs nun hinbekommen. Das Problem waren 2 kleine Fehler und der eigentliche Übeltäter war der Firefox. Irgendwie verlässt der Firefox nicht die Funktion mit "return;". Nun läuft es so wie ich mir das vorgestellt habe 😂 Allerdings nur im Internet Explorer.

                          1. Hallo bmxruler,

                            nein, sowas tut der liebe Fuchs nicht. Da muss was anderes faul sein.

                            Zeig noch mal den Code, bitte. Aber nicht unbedingt von der Arbeit aus; wenn sowas nicht deine Arbeit ist, kannst Du dafür Ärger bekommen...

                            Rolf

                            --
                            sumpsi - posui - clusi
      2. zu 1: das Skript soll aus einer langen zahl (zb: 1111123456767) die ersten 111 durch die aufgeführten Ziffern ersetzen.

        Wirklich immer ersetzen? Auch bei 2221113337772?

        Wenn nicht, ist

        a = a.replace('111', '42458');

        hier nicht brauchbar.

        1. Ja darüber habe ich mir auch schon Gedanken gemacht. 🙈 Ich bin allerdings froh das ich das soweit ans laufen bekommen habe. Sollte so eine Zahl auftreten, wäre es sehr doof 😂.

          1. Hallo,

            Ja darüber habe ich mir auch schon Gedanken gemacht. 🙈 Ich bin allerdings froh das ich das soweit ans laufen bekommen habe. Sollte so eine Zahl auftreten, wäre es sehr doof 😂.

            Einfach bloß sehr doof oder zu vermeiden?
            Wenn du Bedingungen beschreiben kannst, kann man das auch algorithmisch z.b. per regex umsetzen.

            Gruß
            Kalk

            1. Es wäre selbstverständlich zu vermeiden. Allerdings ist das für mich, noch lange nicht umsetzbar. Da muss ich noch eine Menge lernen.

              1. Hallo,

                Es wäre selbstverständlich zu vermeiden. Allerdings ist das für mich, noch lange nicht umsetzbar. Da muss ich noch eine Menge lernen.

                Ich bin auch kein RegEx-Experte, aber laut Wiki würde ich meine replace-Experimente mit „^111“ starten...

                Gruß
                Kalk

          2. Ja darüber habe ich mir auch schon Gedanken gemacht. 🙈 Ich bin allerdings froh das ich das soweit ans laufen bekommen habe. Sollte so eine Zahl auftreten, wäre es sehr doof 😂.

            Eine "regular Expression", wie das in Reihen und Spalten gepresste Calciumcarbonat bereits schrieb, löst das Problem.

            Du mußt nur noch seine Lösung in RegExp-Schreibweise umsetzen [flags braucht man hier keine] und als erstes Argument in dein replace() einsetzen [dabei keine Anführungszeichen verwenden] und fertig.

            Nur der Vollständigkeit halber:

            Eine weitere Möglichkeit wäre, in einer if-Bedingung mit substr() zu prüfen, ob die ersten drei Zeichen des Zahlstrings '111' lauten und nur dann die replace() Zeile auszuführen. Das funktioniert in diesem Fall, da replace() nur die erste passende Zeichenkette ersetzt.