Javascript keyboard events: keycode/charcode auslesen und aendern?!

  • Hat das schonmal jemand gemacht?

    Also ich will bei tastendruck (normale zeichen 1-0, A-Za-z reichen) auf der seite den keycode (oder charcode, ist egal) abfangen, um 1 erhoehen (also einfach eine andere taste) und dann als "normalen" tastendruck weitergeben. Irgendwie sind die keyboard events die ich bisher gefunden habe aber alle depriciated; und bei MDN habe ich keine beispiele dazu gefunden.

    im moment habe ich nur den code um den tastendruck auszulesen:

    Code
    const body = document.querySelector('body');
    body.onkeydown = function(e) {
        if (!e.metaKey) {
            e.preventDefault();
        }
        console.log("keyCode: ", e.keyCode);
    }
    
    //das funktioniert nicht
    body.dispatchEvent(new Event('keypress', {keyCode: 64}))

    aber wie kann ich den keycode aendern und das geaenderte event weitergeben? Das ganze soll am besten transparent ohne jQuery auf alle form-element anwendbar sein, ohne dass ich jedes einzelne input deklarieren muss - daher document.querySelector('body');

    jemand ne idee was ich falsch mache?

  • Hm, ich habe keine Ahnung, ob ich verstehe was Du vor hast. Den Code da verstehe ich nicht, also die Funktion onkeydown schon, den Rest aber nicht. Schaut zusammenkopiert aus, ohne die wichtigen sonstigen Elemente. Alleine schon, dass Du Old-Style mit "onkeydown" arbeitest, dann aber "neumodisch" mit "keypress". Das sind doch zwei völlig verschiedene Events.

    Auch kannst Du niemals auf Input-Felrder zugreifen, wenn Dein Listener auf dem BODY liegt.

    Was willst Du eigentlich letztendlich erreichen? In einem Input-Feld, Eingaben durch andere ersetzen? Was ist der Sinn dahinter?

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • Ansatz, ohne zu wissen was Du eigentlich willst.

    Kein querySelector auf Body, sondern ein querySelectorAll auf Input. Dann in einer Schleife Listener auf die Inputs setzen. Darin kannst Du dann den bisheriges onkeypress zu Erfassung von keyCode an sich verwenden. Zugriff und Manipulation der Eingaben gehen dann über was wie: this.value += String.fromCharCode((e.keyCode+1));

    Du brauchst aber Listener auf jedes Formular-Feld, nicht auf Body. Macht ja keinen Sinn. Über Body würde das Script auch greifen, wenn man eine reine Textseite ließt und eine Taste drückt. Es geht auch mit einem Input-Feld, aber da eben nur mit dem ersten. Weitere werden ignoriert. Dispatch und new Event werden da ja eigentlich gar nicht gebraucht.

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • Sorry, war gestern spaet. Ich hatte verschiedene codezeilen zusammenkopiert, weil PHPStorm bei den old-style funktionen laufend depriciated angezeigt hat. Javascript ist auch nicht so mein ding; die "normalen" sachen wie mit jquery ajax requests ausfuehren und mit den rueckmeldungen arbeiten und auf der seite einfuegen bekomme ich zwar hin, ich bin mehr so fuer PHP, SQL Laravel und meinetwegen auch C zu haben.

    Das mit dem body ist mir schon klar, aber prinzipiel erkennt der code ja erstmal dass keyboard events auf der seite stattfinden auch ohne dass man explizit in input fields tippt. Den event an form fields binden muss ich spaeter, das ist mir schon klar.

    Das ist fuer eine community, und ziel soll sein die stoerenfriede zu vergraulen. User einfach sperren geht nicht, denn dann kommen sie einfach nur mit neuem account zurueck oder nerven die admins, shitstorm usw. - es muss "ihre eigene idee" sein die seite zu verlassen.

    Im moment ist es so dass problemuser ein captcha bekommen (technisch gesehen voellig unnoetig; es muss einfach nur den user vor dem bildschirm nerven) was sie vorm absenden loesen muessen, und was auch teilweise eine 20% chance hat immer als "falsch geloest" ausgewertet zu werden.

    Ich experimentiere hier gerade mit einer anderen idee, bei welcher es am ende eine gewisse chance geben soll dass beim tippen statt des beabsichtigten buchstabens die taste links oder rechts daneben ausgeloest werden soll...