Rolf B: Problem mit alerts und ggf. if else

Beitrag lesen

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