Der Martin: JavaScript: Erkennen von aktivem "Caps Lock" bei gedrückten Ziffern-Tasten

Beitrag lesen

Hi,

Nun sieht es danach aus, dass u.a. auf deutschen Tastaturen bei aktivem Caps Lock zwar die Sonderzeichen statt der Ziffern eingefügt werden, sich der aktive Caps Lock aber (in diesem Fall) auch nicht so ohne Weiteres abfragen lässt.

mal vorab gefragt: Wie wahrscheinlich ist es, dass Caps Lock aktiv ist? Wie oft kommt das vor? Ich habe noch nicht oft erlebt, dass jemand das wirklich nutzt - vor allem wegen der Fehlinterpretation der meisten deutschen Tastaturtreiber, die das als Shift Lock implementieren anstatt tatsächlich als Caps Lock, das eigentlich nur auf Buchstabentasten wirken sollte. Insofern habe ich den Eindruck, du versuchst da ein Problem zu lösen, das in freier Wildbahn so gut wie nie auftritt.

Obwohl von den im JavaScript-Code empfangenen Werten her also alles aussieht, als ob eine Ziffer gedrückt worden wäre, erscheint im Eingabefeld eben doch das Sonderzeichen, was dort eben nicht reinsoll.

Ja, das ist klar soweit.


> <input type="text" onkeydown="return onlyNumbers( event )">

Ich würde mal sagen, du hängst dich ans falsche Event. Meines Wissens erfolgt die eigentliche Verarbeitung des Tastendrucks im Zusammenhang mit dem keypress-Event, nicht keydown. Siehe hierzu auch weiterführende Lektüre:
https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent

    if (keyCode === 8 || keyCode === 9 || keyCode === 13 || keyCode === 17 || keyCode === 27 || (ctrlKeyPressed && keyCode === 86) || (!shiftKeyPressed && keyCode >= 48 && keyCode <= 57) || (keyCode == 46) || (keyCode >= 35 && keyCode <= 40) || (keyCode >= 96 && keyCode <= 105))
        return true;

Das kann man auch etwas übersichtlicher schreiben.

    if (typeof decimalseparator !== 'undefined')
    { // point (.) is always allowed charCode=46
        if (keyCode === 190)
            return true; // || charCode == decimalseparator.charCodeAt(0) || (charCode >= 48 && charCode <= 57);
    }

Was isser denn nun, der Dezimalpunkt? 46 (U+002E) oder 190 (U+00BE)? Letzteres ist doch Käse, oder?

So long,
 Martin