如何检测点击事件是否已由“Enter”触发
How to detect if click event has been triggered by 'Enter'?
//...
<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 请求。
有没有办法区分这两种情况?
是的,有(至少在Chrome中(:
$('#foo-link').click(function(event) {
if (event.originalEvent.detail === 0) {
// keyboard "click" event
} else {
// mouse "click" event
}
}
您可以查看原始事件的详细信息属性以获取点击次数。如果点击计数为 0,则知道"点击"来自键盘。如果点击计数大于 0,则您知道"点击"来自鼠标。
参考: https://developer.mozilla.org/en-US/docs/Web/API/UIEvent/detail
一种解决方案是处理"mouseup"而不是单击:
<a href="javascript:;" id="foo-link">Foo</a>
<script type="text/javascript">
$('#foo-link').mouseup(function (e) {
alert("Mouse click");
});
</script>
另一种解决方案是同时处理"单击"和"按键",如果按下"Enter"则返回 false:
<a href="javascript:;" id="foo-link">Foo</a>
<script type="text/javascript">
$('#foo-link').click(function (e) {
alert("Mouse click");
});
$('#foo-link').keypress(function (e) {
if (e.which == 13)
return false;
});
</script>
如果事件详细信息=== 0
,则由键盘触发。
$('#foo-link').click(function(e) {
// e.detail should be enough in the latest version of jQuery.
if (e.originalEvent.detail) {
$(this).val('Fired by mouse.');
} else {
$(this).val('Fired by keyboard.');
}
});
#foo-link {
width: 120px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="foo-link" type="button" value="Press me." />
处理这个问题的方法可能有点长,但这有效:http://jsbin.com/azATuHe/3 ( 检查控制台.log (
$('.txtB').on('keyup', function(e){
if ( $('#anSetF').data('enterpressed' ) == true ) {
console.log ( 'keyup triggered on TEXTBOX but suppressed' );
$('#anSetF').data('enterpressed', false )
return true;
}else{
console.log ( 'keyup triggered on TEXTBOX Fire AJAX now : ' + $('#anSetF').data('enterpressed' ) );
//Existing code to fire AJAX
}
});
$('#anSetF').on('keydown.Enter', function(e){
console.log('KEY UP: ' + e.which );
if ( e.which == 13 ){
$(this).data('enterpressed',true);
}
}).on('click', function(){
//Some code which you used to focus the textbox
$('.txtB').focus();
});
您可以检查是否存在鼠标坐标:
function handleClick(event) {
if (!event.originalEvent.clientX && !event.originalEvent.clientY) {
// Enter key pressed
}
}
唯一不起作用的情况是单击页面最左上角的像素。在大多数情况下,这应该不是问题。
我的脚本也有类似的东西。但我最终使用.keyup
而不是点击。它允许我检查单击了哪个按钮。
$("#searching").keyup(function () {
if (window.event.keyCode == 38 || window.event.keyCode == 40 || window.event.keyCode == 32) {
return false;
}
var mystring = document.getElementById('searching').value;
if (timeoutReference) clearTimeout(timeoutReference);
if (!mystring.match(/'S/)) {
$.ajax({
//Rest of code here..
这应该有效
$('#foo-link').keyup(function(e) {
if(e.which == 13)
console.log('Enter is pressed');
});
为您的链接制作outline:0
。现在,用户无法按 Tab 键查看链接上的大纲。所以,他不知道自己在哪个按钮上,所以他不会点击回车键,但focus
会在元素上,如果他按回车键,做你的事,做你的事,否则做你的事。即使不会设置outline:0
代码仍然可以工作,因为重点是它。
- 访问布局信息是否也会导致浏览器重排
- 当包含另一个asp文件时,是否也包含所有引用的样式和脚本页面
- 如何检测是否有溢出
- jQuery中是否内置了任何字符串格式化函数
- 是否有任何snippet或jQuery插件可以列出easylist.txt模式匹配的DOM中的所有元素
- 测试索引值是否等于某个数字的倍数
- Fancybox是否将Click事件静音
- 主干-不管怎样,检查事件以前是否绑定过
- YUI3 IO实用程序是否可以根据给定的内容类型标头值自动序列化数据
- 是否有一个JS/jQuery函数可以获取某个类的每个元素的ID
- 节点是否需要模块传递带有方括号的arg?这是个错误吗
- 是否有任何方法可以使用jQuery替换在数组中定义值的文本
- 是否可以将一个函数输入连接到另一个函数调用的文本
- 是否可以禁用jquery中的单个单选按钮
- 是否可以从父类访问子类的属性
- 是否可以控制获取哪些Google地图脚本(JavaScript API)
- 如何让程序检查所选单词中是否有按键
- 是否可以在 data.enter() 方法中使用 data.enter() 方法
- 如何检测点击事件是否已由“Enter”触发
- 是否有一种方法来禁用表单提交按下"enter"关键