передача ключа другому элементу - PullRequest
3 голосов
/ 16 февраля 2012

Я хочу передать событие keydown другому элементу. По пути я обнаружил, что:

$('input').keydown(function(e) {
    $('textarea').keydown()[0].focus();
});

работает и это:

$('input').keydown(function(e) {
    setTimeout(function() { $('textarea').keydown()[0].focus(); }, 0);
});​

не работает. По крайней мере, в Chrome.

В любом случае я хочу сделать это вторым методом, так как я хочу, чтобы он сначала смог сделать ctrl+c или ctrl+x для ввода, для которого выделен текст, а затем перейти к текстовой области.

Вот ДЕМО, чтобы понять, что я имею в виду.

Почему не работает второй способ? И есть ли способ сделать это?

Ответы [ 2 ]

1 голос
/ 16 февраля 2012

Работает как положено. Прежде всего, половина вашего кода не имеет значения. : Р

$('inout').keydown(function(e) {
  $('textarea').keydown()[0].focus();
});

эквивалентно

$('inout').keydown(function(e) {
  $('textarea').keydown(); // doesn't do anything sensible
  $('textarea')[0].focus();
});

и переносит фокус на textarea до разрешения обработчика ключей. Ключ заканчивается в textarea. и input даже не видит этого. (предположим, что код говорит input, а не inout).

Второй пример:

$('input').keydown(function(e) {
  setTimeout(function() { $('textarea').keydown()[0].focus(); }, 0);
});​

эквивалентно:

$('input').keydown(function(e) {
  setTimeout(function() {
    $('textarea').keydown(); // doesn't do anything sensible
    $('textarea')[0].focus();
  }, 0);
});​

Итак, из-за тайм-аута, сначала завершается событие keydown, клавиша принимается в качестве ввода для input, а затем вызывается отложенная функция и меняет фокус. Больше ничего не происходит.

Я не знаю, как «повторить» или «сбросить» событие клавиатуры, если вы хотите получить одинаковое нажатие клавиш в input и textarea (если это то, что вы хотели; я не 100 % уверен, что вы хотели).

EDIT : Ладно: если это просто Ctrl / Shift / другая клавиша-модификатор, верните true, чтобы обработчик по умолчанию поднял ее. Если это Ctrl-C (т. Е. Клавиша C с установленным ctrlKey (metaKey на Mac), сделайте тайм-аут (так что input ловит его до focus), если нет, немедленно переместите фокус ( так что textarea ловит его). Не тривиально, и я не могу придумать лучшего метода в данный момент.

0 голосов
/ 16 февраля 2012

Пропускать достаточно времени для задержки setTimeout

$('input').keydown(function(e) {
    setTimeout(function() { $('textarea').keydown()[0].focus(); }, 700); // 0.7 seconds
});

событие keydown на textarea не имеет смысла и может быть удалено;

$('input').keydown(function(e) {
    setTimeout(function() { $('textarea').focus(); }, 700); // 0.7 seconds
});
...