Werden beim Clipboard-Ereignis Tasten gedrückt?Jquery

JQuery-Programmierung
Guest
 Werden beim Clipboard-Ereignis Tasten gedrückt?

Post by Guest »

Ich habe einen Textbereich, in den Benutzer Text aus der Zwischenablage einfügen können.
Der eingefügte Text clipboarddata.getData('text') wird geändert.Allerdings benötige ich einen Schalter, der beim Drücken von STRG UMSCHALT V anstelle von STRG aktiviert V Der eingefügte Text wird nicht geändert.
Ich habe versucht, die Umschalttaste mit keydown/keyup:
zu fangen

Code: Select all

$('textarea').on('keyup', function(e)
{
shiftkey_down = e.shiftKey;
});
und versuchen Sie dann, die boolesche Variable im Paste-Ereignishandler zu lesen:

Code: Select all

$('textarea').on('paste', function(e)
{
if (shiftkey_down)
{
// ...
}
});
aber das Paste-Ereignis kommt nach keydown und keyup. Daher kann ich nicht erkennen, welche Taste gedrückt wurde. Und „shiftkey_down“ ist im Paste-Handler immer „false“.
Was wäre der richtige Weg, damit umzugehen?
Die einzige Idee, die ich hatte, ist, die zuletzt gedrückte Tastenkombination im Keydown-Ereignis zu speichern und dann die zuletzt gedrückte Tastenkombination im Paste-Handler zu überprüfen. Aber es scheint auch nicht zu funktionieren.

Update:
Ich habe es versucht um eine kleine Zeitüberschreitung zu verwenden, damit die boolesche Variable „keydown“ nicht sofort überschrieben wird:

Code: Select all

var shiftkey_paste = false;

$('textarea').on('keydown', function(e)
{
if (!shiftkey_paste)
{
shiftkey_paste = e.shiftKey && e.ctrlKey;

console.log('> '+shiftkey_paste);

setTimeout( function()
{
// set false again after timeout so paste event has chance to pick up a true value
shiftkey_paste = false;
}, 10);
}

console.log('>> ' + shiftkey_paste);
});
Und innerhalb des Paste-Handlers drucke ich den Wert mit console.log('>>> ' + shiftkey_paste);.
Ergebnis:

Code: Select all

> false
>> false
> true
>> true
> false
>> false
>>> false
Auch falsch, obwohl das Timeout hätte helfen sollen.

Update 2:
✔️ Wow, es funktioniert mit einem Timeout von 100 ms statt 10 ms (!)

Update 3:
Ich habe herausgefunden, dass setTimeout mehrmals ausgelöst wird, wenn der Benutzer STRG UMSCHALT gedrückt hält und somit den booleschen Wert auf „false“ setzt, obwohl die Tasten gedrückt gehalten werden. Die Lösung besteht darin, den Settimeout wie folgt zu löschen:

Code: Select all

var shiftkey_paste = false;
var shiftkey_timeout = null;

$('textarea').on('keydown', function(e)
{
if (!shiftkey_paste)
{
clearTimeout(shiftkey_timeout);

shiftkey_paste = e.shiftKey && e.ctrlKey;

console.log('> ' + shiftkey_paste);

shiftkey_timeout = setTimeout( function()
{
// set false again after timeout so paste event has chance to pick up a true value
shiftkey_paste = false;

shiftkey_timeout = null;

},
500); // 500 ms for timeout to set back boolean to false
}

console.log('>> ' + shiftkey_paste);
});
Diese Lösung funktioniert ziemlich gut.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post