我有一个包含“email”等常见字段的表单。我有javascript捕获返回键(13)并提交表单,但在主机面板上使用defaultButton属性时观察到相同的效果。
如果用户在IE上并且正在键入他的电子邮件地址,则通过按Enter键从浏览器的内联自动完成中选择一个项目,不会向Javascript发送按键。 GOOD。
在Firefox上,文本框会收到ENTER按键,并希望提交表单,但不完整。
除了禁用自动完成功能外,是否有人知道如何阻止此操作?我无法找到一种方法来检测按键实际上来自自动完成列表框。
我正在使用asp.net和jQuery。
编辑 - 澄清: 在自动填充中按下输入项不应提交表单。 IE行为是正确的(一次!)。
我的事件处理程序本身就是:
on key up(尝试过按键) - if(e.which == 13)submitForm();
问题是,我不知道如何检测到ENTER按下实际来自自动完成控件
答案 0 :(得分:2)
您可以在按键上存储字段的值,然后在按键上再次检查。如果字符串中的一个字符与一个键按下的字符数不同,则可以安全地假设选择了自动填充项目并且应该忽略输入。
唯一不适用的情况是当你有一个像:email@test.co这样的字段并且你选择的是一个只添加了最后一个字母的自动完成项时,回车键会无意中提交表格。
希望至少让我们开始。我也试图找出一个防弹解决方案。如果找到,我会更新。
修改
拧上面。把它整理出来。如果您在按键上检查输入键,并且按键/向上键的输入字段值不同,则可以假设选择了自动完成项。
var loginCurrentInput = '';
$('input').keydown(function(e) {
loginCurrentInput = $(this).val();
}
$('input').keyup(function(e) {
//if enter key pressed
if(e.keyCode == 13) {
//check for changed input value
if($(this).val() != loginCurrentInput) {
loginCurrentInput = $(this).val();
return false;
}
$('#button').trigger('click');
}
}
答案 1 :(得分:1)
按回车键,您可以检查焦点上的当前元素:
$("*:focus")
如果元素没有附加完全填充,那么您可以提交表单。 看看: How to select an element that has focus on it with jQuery
答案 2 :(得分:0)
您可以使用两种(简单的)技巧:
1。)[Enter]不会生成input event
…
2。)自动完成keydown
和keyup
的用户是“同步的”
解决方案(我将两者结合在一起):
在[输入] keydown
上,期望真实击键(true_enter=true
)和“ setTimeout
”(0延迟!)提交时检查您是否仍为{{1 }}
在true_enter
和keyup
上清除input
说明:
使用自动完成功能,true_enter=false
和keydwon
是同步的,或者-在排队时-直接在后面;
与keyup
和输入事件相同
使用setTimeout,您可以将Enter-action置于这些事件之后。
(几乎)真正的击键从未如此快地达到目标。我的比率是20分之一,正在努力。
缺点:
自动测试会出现问题。
我在coffeescript中的解决方案:(对不起,我的JavaScript不好)
keydwon