我想将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
,然后跳到文本区域。
这是一个演示,看看我的意思
为什么第二种方法不起作用?还有什么方法可以做到这一点吗?
按预期工作。首先,您的代码有一半是不相关的p
$('inout').keydown(function(e) {
$('textarea').keydown()[0].focus();
});
相当于
$('inout').keydown(function(e) {
$('textarea').keydown(); // doesn't do anything sensible
$('textarea')[0].focus();
});
并且它在密钥处理程序解析之前将焦点转移到CCD_ 3。密钥最终在textarea
中。而CCD_ 5甚至看不到它(假设代码说的是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(即设置了ctrlKey
的C
键(Mac上的metaKey
),则执行超时操作(因此input
在focus
之前捕获它);如果没有,请立即移动焦点(以便textarea
捕捉到它)。这不是小事,我现在想不出更好的方法了。
为setTimeout
延迟传递足够的时间
$('input').keydown(function(e) {
setTimeout(function() { $('textarea').keydown()[0].focus(); }, 700); // 0.7 seconds
});
textarea
上的keydown
事件没有意义,可以移除;
$('input').keydown(function(e) {
setTimeout(function() { $('textarea').focus(); }, 700); // 0.7 seconds
});