Работает как положено. Прежде всего, половина вашего кода не имеет значения. : Р
$('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
ловит его). Не тривиально, и я не могу придумать лучшего метода в данный момент.