按键上下文的JavaScript检测(表单历史选择与表单提交)
-
03-07-2019 - |
题
我正在使用jQuery编写一个半通用的表单插件,以加快我正在开发的项目的开发。
计划是 jTemplates 模板包含字段,我的插件通过模板查找任何字段所需的多语言资源,从服务器请求它们,然后将所有内容打包成一个JavaScript对象,然后将其传递给“submit”上的自定义函数。
一切都运行良好,除了标准“按下输入时,提交表格”伪造表单时需要执行的代码:
opts.coreElement.find('input[type=text]').keypress(function(evt) {
if ((evt.keyCode || evt.which) == 13) {
opts.coreElement.find('.saveButton').click();
}
});
问题是在Firefox中(至少;我还没有检查过其他浏览器),如果您之前在类似命名的文本框中输入了信息,则会获得表单历史记录。如果您通过按Enter键选择其中一个建议值,则会提交表单。如果您正在浏览页面上的第一个输入,那就太好了。实际上真的很讨厌。
显而易见的解决方案似乎是在字段周围插入一个表单元素,并通过jQuery停止任何可能的虚拟表单提交。幸运的是,我有这样的奢侈,因为我在ASP.NET MVC,但如果我不是?如果我的插件不知道它是否已经在一个表单中并且因此必须保持自己怎么办?如果我在标准的WebForms ASP.NET中,并且我已经手动“定位”,那会怎么样?每个输入的返回键到正确的提交按钮?
有没有办法,也许通过事件对象本身来检测按键的上下文,所以我可以过滤掉表单历史项的选择?
解决方案
将文本字段中的 autocomplete
属性设置为 off
:
opts.coreElement.find('input[type=text]').each(function() {
$(this).attr('autocomplete', 'off');
});
这适用于所有主流浏览器(Safari,Firefox,IE)。
其他提示
我发现为了防止[enter]或[tab]键事件的默认操作,你必须监听keydown事件并处理/取消它。
在触发keyup或keypress时,keydown的默认值已经发生。
武隆的答案有效,但并没有完全回答这个问题。 建议的解决方案是禁用输入文本字段的历史记录。 但有没有办法知道来自输入文本或来自历史的关键事件?