将keydown传递给另一个元素

时间:2012-02-16 18:50:35

标签: javascript jquery keyboard keydown

我想将keydown事件传递给另一个元素。一路上我发现:

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

有效:

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

不起作用。至少在Chrome中。

无论如何,我想用第二种方法做到这一点,因为我希望它首先能够对选择了文本的输入执行ctrl+cctrl+x,然后跳转到textarea。 / p>

Here's a DEMO to see what I mean.

为什么第二种方式不起作用?还有什么方法可以实现这个目标吗?

2 个答案:

答案 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的输入,然后调用延迟函数并更改焦点。什么都没发生。

我不知道如何“重复”或“重新抛出”键盘事件,以防你想在inputtextarea中获得相同的按键(如果这是你想要的;我不是100%肯定你想要的东西。

编辑:好的:如果它只是Ctrl / Shift /另一个修饰键,则返回true,以便默认处理程序将其选中。如果它是Ctrl-C(即设置C的{​​{1}}键(Mac上为ctrlKey),请执行超时操作(以便metaKeyinput之前捕获它});如果没有,立即移动焦点(所以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
});