2011-05-10 106 views
9

我需要将键盘上的“输入”键绑定到特定的javascript方法,但只有当某个文本字段处于焦点状态时。将文本框绑定到“输入”键

<input id="post" type="text" style="width:400px;"/> 

我该怎么做?

我知道你可以使用表单和提交动作的东西来做到这一点,但是当上面的input字段处于焦点时,我可以将“输入”键绑定到特定函数吗?

回答

18
$("#post").focus(function() { 
    $(this).data("hasfocus", true); 
}); 

$("#post").blur(function() { 
    $(this).data("hasfocus", false); 
}); 

$(document.body).keyup(function(ev) { 
    // 13 is ENTER 
    if (ev.which === 13 && $("#post").data("hasfocus")) { 
     ... 
    } 
}); 

我建议你,而不是绑定的ENTER keyup事件您$("#post")直接输入而不是整个页面上的事件监听。

+0

如果您使用的是功能做别的事情,好像我是记得在函数调用之前抛出一个'e.preventDefault();'来防止表单被提交。 – Pachonk 2014-03-25 20:01:32

+1

你建议只绑定#post然后写一个代码来听整个文档?我甚至没有... – user151496 2016-04-28 09:12:28

12

只需将onkeyup事件绑定到有问题的输入即可。您根本不必担心检查焦点,因为根据定义,输入只有在焦点时才会接收键盘事件。

我认为jQuery是OK,因为你包括在你的问题的标签,所以在您的文档准备好处理程序做这样的事情:

$("#IDforyourcontrol").keyup(function(ev) { 
    // 13 is ENTER 
    if (ev.which === 13 && /*whatever other conditions you care about*/) { 
     // do something 
    } 
}); 
+0

“根据定义,输入只能在聚焦时接收键控事件”并不严格。事件也可以通过编程方式进行调度,这样输入可以在焦点事件没有焦点时接收到(并且其他元素上的许多事件也有冒泡和捕捉阶段)。但是,向输入添加密钥监听器应该足以满足OP的要求。 – RobG 2011-05-10 01:03:18

+0

好吧,当然,我没有考虑以编程方式触发的事件,但似乎不太可能有人想要以编程方式触发输入键的键控并区分用户操作。不过,我认为我的主要观点是有效的,为此目的,您通常不需要担心检查焦点在哪里。 Raynos的答案解释了如何允许焦点,所以我猜想它会更完全地回答OP,尽管我不会将事件绑定到document.body(但我从来不需要为这种类型的事情检查焦点)。 – nnnnnn 2011-05-10 01:26:07

+0

好的答案,隐含的,高性能的。我在输入本身上使用它'',然后'myFunction(e){if(e.which === 13 ....}' – 2015-11-24 08:08:19