我想将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
,然后跳转到textarea。 / p>
为什么第二种方式不起作用?还有什么方法可以实现这个目标吗?
答案 0 :(得分:1)
按预期工作。首先,你的一半代码是无关紧要的。 :P
$('inout').keydown(function(e) {
$('textarea').keydown()[0].focus();
});
相当于
$('inout').keydown(function(e) {
$('textarea').keydown(); // doesn't do anything sensible
$('textarea')[0].focus();
});
并在keyhandler解析之前将焦点转移到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%肯定你想要的东西。
编辑:好的:如果它只是Ctrl / Shift /另一个修饰键,则返回true,以便默认处理程序将其选中。如果它是Ctrl-C(即设置C
的{{1}}键(Mac上为ctrlKey
),请执行超时操作(以便metaKey
在input
之前捕获它});如果没有,立即移动焦点(所以focus
抓住它)。这不是微不足道的,我现在想不出更好的方法。
答案 1 :(得分:0)
为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
});