BBCodes per Tastenkombination ins Formularfeld einfügen
Moritz
- javascript
Hallo zusammen,
ich möchte es gerne ermöglichen, in mein Formularfeld Formatierungs-Tags per Tastenkombination eingefügt werden. Das Einfügen an der Richtigen Stelle bekomme ich durch das Skript von Torsten Anacker gut in den Griff.
Nun schaffe ich es aber nicht, den event bei zwei gleichzeitig gedrückten Tasten auszulösen. "Mein" Versuch sieht so aus und orientiert sich http://de.selfhtml.org/javascript/objekte/event.htm#allgemeines@title=hieran:
function TasteGedrueckt (Ereignis) {
if (!Ereignis)
Ergebnis = window.event;
if (Ereignis.which) {
Tastencode = Ereignis.which;
} else if (Ereignis.keyCode) {
Tastencode = Ereignis.keyCode;
}
if (Tastencode == 74 && Tastencode == 18) {
insert('[link]', '[/link]');
}
document.onkeydown = TasteGedrueckt;
Dieser Forumsbeitrag könnte eine Lösung enthalten, aber leider durchschaue ich nicht, was ich bei mir entsprechend anpassen muss.
Hallo,
Nun schaffe ich es aber nicht, den event bei zwei gleichzeitig gedrückten Tasten auszulösen.
wenn du von gleichzeitig gedrückten Tasten redest, ist eine davon sicher ein Modifier Key (Shift, Alt, Ctrl). Denn zwei reguläre Tasten kann man zwar auch gleichzeitig drücken, sie "blockieren" sich aber gegenseitig.
function TasteGedrueckt (Ereignis) {
if (!Ereignis)
Ergebnis = window.event;
if (Ereignis.which) {
Tastencode = Ereignis.which;
} else if (Ereignis.keyCode) {
Tastencode = Ereignis.keyCode;
}
if (Tastencode == 74 && Tastencode == 18)
Das kann natürlich nichts werden: Tastencode kann nie gleichzeitig den Wert 74 und 18 haben! Bedenke, dass die Ctrl-Taste und die J-Taste, die du hier abfragen willst, genaugenommen *nacheinander* gedrückt werden, das erzeugt daher insgesamt fünf Events:
keydown: 18 (Ctrl)
keydown: 74 (J)
keypress: J
keyup: 74 (J)
keyup: 18 (Ctrl)
Du musst also darauf achten, wann die Ctrl-Taste gedrückt bzw. losgelassen wird, und dir den Zustand dieser Taste selbst merken. Internet Explorer macht das für dich, wie du ja selbst schon gelesen hast.
Dieser Forumsbeitrag könnte eine Lösung enthalten, aber leider durchschaue ich nicht, was ich bei mir entsprechend anpassen muss.
Da hat molily gezeigt, dass e.ctrlKey offenbar auch von Gecko-Browsern unterstützt wird, obwohl ich den Hinweis "Microsoft-Syntax" im einleitenden Satz dieses Abschnitts so gedeutet hätte, dass nur IE diese Eigenschaften zur Verfügung stellt. Das Symbol "DOM 2.0" deutet allerdings auch auf eine standardisierte und damit *sehr* wahrscheinlich auch von Gecko unterstützte Lösung.
Das macht dein Vorhaben natürlich viel einfacher: Reagiere nur auf die gewünschte Buchstabentaste, und frage innerhalb des Eventhandlers zusätzlich e.ctrlKey ab.
Übrigens: Die Tastenkombi Ctrl-J ist äquivalent zum Drücken der Enter-Taste und daher heikel. Beispielsweise wird sie ein Formular absenden, wenn beim Drücken dieser Kombination ein Formularelement focussiert war. Zumindest ist die Wahrscheinlichkeit groß, dass dein Script diese Tastenkombination niemals "sieht", weil sie bereits vom OS oder von der Applikation vernascht wird.
So long,
Martin
Nachtrag:
Ich bin wohl noch nicht so richtig wach ...
if (Tastencode == 74 && Tastencode == 18)Das kann natürlich nichts werden: Tastencode kann nie gleichzeitig den Wert 74 und 18 haben! Bedenke, dass die Ctrl-Taste und die J-Taste, ...
Natürlich ist 18 nicht der Code der Ctrl-Taste, sondern der der Alt-Taste.
Damit ist meine abschließende Warnung bzgl. der vorrangigen Behandlung bestimmter Tastenkombis durch System und Anwendung natürlich hinfällig - zumal ...
Übrigens: Die Tastenkombi Ctrl-J ist äquivalent zum Drücken der Enter-Taste
... das auch Krampf ist. Ctrl-M entspricht der Enter-Taste (CR), Ctrl-J ist ja bloß ein einfacher Zeilenvorschub (LF).
Ciao,
Martin
Hi Martin,
Übrigens: Die Tastenkombi Ctrl-J ist äquivalent zum Drücken der Enter-Taste
... das auch Krampf ist. Ctrl-M entspricht der Enter-Taste (CR), Ctrl-J ist ja bloß ein einfacher Zeilenvorschub (LF).
Ciao,
Martin
Da hast Du grundsätzlich recht, jedoch kenne ich persönlich das Ctrl-M zum Abschicken einer Maske lediglich vom Vax-VMS (ein rechter Dinosaurier!) und eben von Windows (eigentlich auch schon DOS). Unter UNIX und MacOSX ist genau das Ctrl-J gleichbedeutend mit EOL.
liebe Grüsse
Gina
Hallo,
Da hast Du grundsätzlich recht, jedoch kenne ich persönlich das Ctrl-M zum Abschicken einer Maske lediglich vom Vax-VMS (ein rechter Dinosaurier!) ...
stimmt allerdings!
und eben von Windows (eigentlich auch schon DOS). Unter UNIX und MacOSX ist genau das Ctrl-J gleichbedeutend mit EOL.
Erzeugt dann die Enter-Taste bei diesen Systemen (auch Linux) ein 0x0A (Linefeed, also Ctrl-J) anstelle eines 0x0D (Carriage Return, Ctrl-M) wie bei DOS/Windows?
Ciao,
Martin
Hallo Martin,
hab vielen vielen Dank für deine Hilfe!!!
Auf der Grundlage von deiner Erklärung zu den events, die so passieren, habe ich folgendes Entwickelt:
//Diese Funktion soll den schalter = 1000 setzen, wenn die alt-Taste gedrückt wird
function Schalterein (Ereignis) {
alt = Ereignis.which;
if (alt==18) {
schalter = 1000;
//Testausgabe alert("Es wurde die Alt-Taste: " + Ereignis.which + " gedrückt:: " + schalter);
}
}
//Diese Funktion soll einen alert ausgeben, wenn die alt-Taste gedrückt (UND NOCH NICHT LOSGELASSEN) wurde
function Taste (Event) {
key = Event.which;
if (schalter==1000) {
alert("Wunderbar: bei gerückter Alt-Taste und einer weiteren kann ich einen alert erzeugen" + key);
}
}
//Diese Funktion soll den schalter wieder = 0 setzen
function Schalteraus (Er) {
xx = Er.which;
if (peter==18) {
schalter = 0;
alert("Folgende Taste wurde losgelassen: " + xx + " " + schalter);
}
}
document.onkeydown = Schalterein;
document.onkeypress = Taste;
document.onkeyup = Schalteraus;
Mit der Funktion "Schalterein" schaffe ich es, nach dem Drücken der ALT-Taste, den "schalter = 1000" zu setzen.
Mit der Funktion "Taste" wurde bei "schalter = 1000" und dem Drücken einer beliebigen Tausend der Wunderbar-alert ausgelöst.
Mit der letzten Funktion wollte ich den "schalter = 0" setzen, damit ich wieder normal die anderen tasten drücken kann. Nun funktioniert es leider insgesamt nicht mehr.
Das mit dem e.altkey hat bei mir auf der http://de.selfhtml.org/javascript/objekte/anzeige/event_alt_ctrl_shift_key.htm@title=event-Seite nicht funktioniert (mozilla 3.5.5). Daher habe ich es damit lieber nicht weiter probiert.
Hast du noch einen Tip dazu, was mit meinem script nicht stimmen könnte?
Besten Gruß und nochmals vielen Dank!,
Moritz
Hallo,
ich habe nun einfach die Funktion "Schalteraus" gelöscht und stattdessen, den "schalter = 0" an das Ende vom der Funktion "Taste" gesetzt.
Damit erziele ich folgenden erfolg: Ich kann den BBCode nun einfügen, indem ich die Alt-Taste drücke (nicht gedrückhalte) und danach "e" drücke. Dann wird mit der BBCode eingefügt. Was ich damit also nicht erreicht habe ist, dass die Alt-Taste gedrückt gehalten werden muss. - Da das Programm aber erstmal nur für mich ist, finde ich das schon sehr gut! :)
Noch einmal vielen Dank an dich Martin, du hast mir den nötigen Hinweis zum Erstellen der Struktur gegeben!
Und hier noch mein aktueller Code:
//Diese Funktion soll den schalter = 1000 setzen, wenn die alt-Taste gedrückt wird
function Schalterein (Ereignis) {
alt = Ereignis.which;
if (alt==18) {
schalter = 1000;
// alert("Es wurde die Alt-Taste: " + Ereignis.which + " gedrückt:: " + schalter);
}
}
//Diese Funktion soll einen alert ausgeben, wenn die alt-Taste gedrückt (UND NOCH NICHT LOSGELASSEN) wurde
function Taste (Event) {
key = Event.which;
if (schalter==1000)
//alert("wunderbar: schalter = " + schalter + " und key = " + key);
{
if (key == 101) {
insert('\n\\begin{enumerate}', '\n\\end[enumerate}');
}
schalter = 0;
}
}
document.onkeydown = Schalterein;
document.onkeypress = Taste;
Hallo,
hab vielen vielen Dank für deine Hilfe!!!
gern geschehen, so eine Resonanz lese ich gern. :-)
Das mit dem e.altkey hat bei mir auf der http://de.selfhtml.org/javascript/objekte/anzeige/event_alt_ctrl_shift_key.htm@title=event-Seite nicht funktioniert (mozilla 3.5.5).
Schreibweise beachten: e.altkey ist falsch, Javascript ist case-sensitive!
Ciao,
Martin
Hallo,
da ich habe nun viele Latex-tags als Ausgabe nach meinen Tastenkombinationen eingebaut. Ich schreibe die Texte nun wesentlich schneller und vor allem ohne Flüchtigkeitsfehler im Code. Das ist wunderbar!
Das ich die Alt-Taste mit dem entsprechenden Buchstaben nicht gleichzeitig drücken muss, ist vielleicht sogar ein Vorteil, weil ich so andere Funktionen (z.B. von Firefox) nicht verdränge oder gleichzeitig aktiviere!
Womit ich noch nicht ganz zufrieden bin ist, dass der Buchstabe meiner Kombination im Textfeld immer mit ausgegeben wird, sodass ich ihn immer von Hand löschen muss. Um das Problem anzugehen könnte ich mir folgende Lösung in abstrakter Beschreibung Vorstellen:
1. java merkt sich, wo der Kursor gerade steht
2. nimmt die Formularfeld-Eingabe als String auf
3. Löscht das letzte Zeichen hinter der Kursor-Position
4. Löscht die Eingabe im Feld
5. Kopiert den modifizierten string wieder zurück in das Eingabe Feld
Ist das ein gangbarer Weg oder würde ich die Welt damit komplizierter machen, als sie schon ist? Gibt es einen einfacheren Lösungsweg?
Habt vielen Dank,
euch einen angenehmen Abend,
Moritz
Hi,
Das ich die Alt-Taste mit dem entsprechenden Buchstaben nicht gleichzeitig drücken muss, ist vielleicht sogar ein Vorteil, weil ich so andere Funktionen (z.B. von Firefox) nicht verdränge oder gleichzeitig aktiviere!
ah, da ist was dran. Diese "Einrastfunktion" für die Shift- Alt- und Ctrl-Tasten kann man in Windows auch global über die sogenannten Eingabehilfen haben. Mir gefällt's nicht, aber ich kann mir durchaus vorstellen, dass man sich daran gewöhnen kann. Blöd nur, wenn man dann mal wieder an einem Rechner arbeiten muss, wo's "normal" ist.
Womit ich noch nicht ganz zufrieden bin ist, dass der Buchstabe meiner Kombination im Textfeld immer mit ausgegeben wird, sodass ich ihn immer von Hand löschen muss.
Du weißt, dass du die Standardreaktion auf ein Event unterdrücken kannst, indem dein Eventhandler false zurückgibt? Nein, anscheinend nicht. Dann weißt du's jetzt. ;-)
Ist das ein gangbarer Weg oder würde ich die Welt damit komplizierter machen, als sie schon ist? Gibt es einen einfacheren Lösungsweg?
Das ist mir ehrlich gesagt schon zu kompliziert zum Verstehen!
Ciao,
Martin
Hallo,
ah, da ist was dran. Diese "Einrastfunktion" für die Shift- Alt- und Ctrl-Tasten kann man in Windows auch global über die sogenannten Eingabehilfen haben. Mir gefällt's nicht, aber ich kann mir durchaus vorstellen, dass man sich daran gewöhnen kann. Blöd nur, wenn man dann mal wieder an einem Rechner arbeiten muss, wo's "normal" ist.
Ne, systemweit wollte ich auch keine Einrastfunktion auf alt haben. Für das eine Projekt finde ich das super.
Du weißt, dass du die Standardreaktion auf ein Event unterdrücken kannst, indem dein Eventhandler false zurückgibt? Nein, anscheinend nicht. Dann weißt du's jetzt. ;-)
Super! Ich bin zuerst auf http://de.selfhtml.org/javascript/sprache/operatoren.htm#void@title=void gestoßen. Ich habe dass dann um den eventhandler gepackt:void(document.onkeypress = Taste);
Das hat aber nicht geklapt. Danach habe ich "return false" gefunden und dass einfach ans Ende der Funktion geschrieben, die nach onkeypress ausgeführt wird. Das hat geklappt. Vielen Dank für den super Tip!
Das ist mir ehrlich gesagt schon zu kompliziert zum Verstehen!
:) - ich finde diese Objektorientierung (?) und diese Schreibweise mit den ganzen Punkten ganz schön schwer nachzuvollziehen!
Besten Gruß und eine gute Nacht,
Moritz