【发布时间】:2013-10-08 10:01:25
【问题描述】:
//...
<a href="#" id="foo-link">Foo</a>
<script type="text/javascript">
$('#foo-link').click(function(e) {
//...
}
</script>
//...
在 HTML 页面上使用 jQuery,上面定义的 click 处理程序被执行
- 当用户点击它和
- 当用户通过 Tab 导航到它并点击 Enter
(至少在 Firefox 中)传递给处理程序的点击事件之间似乎没有区别 - 原始键事件“神奇地”转换为点击事件。
有没有办法区分这两种情况?
详细说明为什么我需要区别对待这两种情况:在我的特定情况下,点击处理程序将焦点设置为文本输入字段。此文本输入字段注册了一个keyup 事件处理程序,它发送一个 AJAX 请求。当用户在链接上按 Enter 后触发点击处理程序时,现在聚焦的文本输入字段接收到 keyup 事件,并且错误地发送了 AJAX 请求。
【问题讨论】:
-
不确定这是否可行,但在点击处理程序中,您可以使用
event.keyCode来检查是否已使用某个键吗? -
那么在你描述的场景下,输入字段还是会是空的?那为什么不检查那个,在那种情况下不发出AJAX请求呢?
-
不,你无法区分,在这两种情况下,引发的事件都是 MouseEvent。您应该为 enter 键附加另一个侦听器,并在这种情况下阻止另一个侦听器
-
@CBroe 确实我通过检查文本字段是否为空来阻止发送 Ajax 请求。不想在问题中详细介绍,但我们开始吧:文本字段有一个红色边框,表示输入无效。但在这个阶段,用户在某种程度上是“无辜的”。
-
我认为你能做到的唯一方法是为一个键事件附加另一个监听器,然后,如果它是回车键,防止点击事件触发:jsfiddle.net/8m5js
标签: javascript jquery html dom