Получить нажатие клавиш с помощью события буфера обмена?Jquery

Программирование на jquery
Ответить
Anonymous
 Получить нажатие клавиш с помощью события буфера обмена?

Сообщение Anonymous »

У меня есть текстовая область, куда пользователи могут вставлять текст из буфера обмена.
Вставленный текст clipboarddata.getData('text') изменяется.Однако мне нужен переключатель, который при нажатии CTRL SHIFT V вместо CTRL V вставленный текст не изменяется.
Я пытался перехватить клавишу Shift с помощью клавиши Down/Keyup:

Код: Выделить всё

$('textarea').on('keyup', function(e)
{
shiftkey_down = e.shiftKey;
});
а затем попробуйте прочитать логическую переменную в обработчике события вставки:

Код: Выделить всё

$('textarea').on('paste', function(e)
{
if (shiftkey_down)
{
// ...
}
});
но событие вставки происходит после нажатия клавиши и нажатия клавиши. Поэтому я не могу прочитать, какая клавиша была нажата. А сдвигkey_down всегда имеет значение false внутри обработчика вставки.
Как правильно с этим справиться?
Единственная идея, которая у меня возникла, - сохранить последнюю нажатую комбинацию клавиш внутри события нажатия клавиши, а затем проверить последнюю нажатую комбинацию внутри обработчика вставки. Но, похоже, это тоже не работает.

Обновление:
Я пробовал использовать небольшой таймаут, чтобы логическая переменная keydown не перезаписывалась немедленно:

Код: Выделить всё

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);
});
И внутри обработчика вставки я печатаю значение с помощью console.log('>>> ' +shiftkey_paste);.
Результат:

Код: Выделить всё

> false
>> false
> true
>> true
> false
>> false
>>> false
Также неверно, хотя таймаут должен был помочь.

Обновление 2:
✔️ Ого, это работает с таймаутом 100мс вместо 10мс (!)

Обновление 3:
Я обнаружил, что setTimeout срабатывает несколько раз, когда пользователь удерживает нажатой клавишу CTRL SHIFT и, таким образом, устанавливает для логического значения значение false, даже если клавиши удерживаются нажатыми. Решение состоит в том, чтобы очистить settimeout следующим образом:

Код: Выделить всё

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);
});
Это решение работает очень хорошо.

Подробнее здесь: https://stackoverflow.com/questions/781 ... oard-event
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Jquery»