window.addEventListener('keydown', function(event) {
//set default value for variable that will hold the status of keypress
pressedEnter = false;
//if user pressed enter, set the variable to true
if (event.keyCode == 13)
pressedEnter = true;
//we want forms to disable submit for a tenth of a second only
setTimeout(function() {
pressedEnter = false;
}, 100)
})
//find all forms
var forms = document.getElementsByTagName('form')
//loop through forms
for (i = 0; i < forms.length; i++) {
//listen to submit event
forms[i].addEventListener('submit', function(e) {
//if user just pressed enter, stop the submit event
if (pressedEnter == true) {
updateLog('Form prevented from submit.')
e.preventDefault();
return false;
}
updateLog('Form submitted.')
})
}
var log = document.getElementById('log')
updateLog = function(msg) {
log.innerText = msg
}
<form>
<p>Sample textarea (try enter key):</p>
<textarea rows="4">Hit enter, a new line will be added. But the form won't submit</textarea>
<p>Sample textfield (try enter key):</p>
<input type="text" placeholder="" />
<input type="submit" value="Save" />
<h3 id="log"></h3>
</form>
<form action="...">
<!-- insert this next line immediately after the <form> opening tag -->
<button type=submit onclick="return false;" style="display:none;"></button>
<!-- everything else follows as normal -->
<!-- ... -->
<button type=submit>Submit</button>
</form>
61
一个很好的简单的小jQuery解决方案:
$("form").bind("keypress", function (e) {
if (e.keyCode == 13) {
return false;
}
});
// Validate your form using the jQuery onsubmit function... It'll really work...
$(document).ready(function(){
$(#form).submit(e){
e.preventDefault();
if(validation())
document.form1.submit();
});
});
function validation()
{
// Your form checking goes here.
}
<form id='form1' method='POST' action=''>
// Your form data
</form>
27 回答
这对我有用
您可以创建一个JavaScript方法来检查Enter键是否被命中,如果是,则停止提交 .
只需在提交方法上调用它即可 .
这里有很多好的答案,我只是想从UX的角度做出贡献 . 表单中的键盘控件非常重要 .
问题是如何在keypress
Enter
上禁用提交 . 不是如何在整个应用程序中忽略Enter
. 因此,请考虑将处理程序附加到表单元素,而不是窗口 .禁用
Enter
表单提交仍应允许以下内容:当提交按钮聚焦时,通过
Enter
提交表单 .填写所有字段时的表单提交 .
通过
Enter
与非提交按钮交互 .这只是样板,但它遵循所有三个条件 .
您可以按原样保留表单,并添加一些额外的客户端验证,而不是阻止用户按Enter键,当调查未完成时,结果不会发送到服务器,用户会收到一条好消息告诉你需要完成什么来完成表格 . 如果您使用的是jQuery,请尝试使用Validation插件:
http://docs.jquery.com/Plugins/Validation
这需要比捕获Enter按钮更多的工作,但肯定会提供更丰富的用户体验 .
给表单一个'javascript:void(0);'的动作似乎可以做到这一点
我还不能评论,所以我会发一个新的答案
接受的答案是ok-ish,但它并没有停止提交numpad enter . 至少在当前版本的Chrome中 . 我不得不改变键码条件,然后它工作 .
只有BLOCK SUBMIT而不是其他重要的输入键功能,例如在
<textarea>
中创建一个新段落:我有一个类似的问题,我有一个网格"ajax textfields"(Yii CGridView)和一个提交按钮 . 每次我在文本字段上搜索并点击输入提交的表单 . 我不得不对按钮做一些事情,因为它是视图之间唯一的常用按钮(MVC模式) . 我所要做的就是删除
type="submit"
然后放onclick="document.forms[0].submit()
在对其他解决方案感到非常沮丧之后,这在所有浏览器中都适用于我 . name_space外部函数只是为了远离声明全局变量,我也建议这样做 .
样品用途:
我必须捕获与按键相关的所有三个事件,以防止提交表单:
您可以将以上所有内容组合成一个精美的紧凑版本:
一种完全不同的方法:
The first <button type="submit"> in the form will be activated on pressing Enter.
即使使用
style="display:none;
隐藏按钮也是如此The script for that button can return false, which aborts the submission process.
您仍然可以使用另一个
<button type=submit>
来提交表单 . 只需返回true
即可级联提交内容 .在关注真实提交按钮时按Enter键将激活真实提交按钮 .
在
<textarea>
或其他表单控件中按Enter键将正常运行 .在
<input>
表单控件中按Enter键将触发第一个<button type=submit>
,返回false
,因此没有任何反应 .从而:
一个很好的简单的小jQuery解决方案:
如果您使用脚本进行实际提交,那么您可以将“return false”行添加到onsubmit处理程序,如下所示:
从JavaScript调用表单上的submit()不会触发该事件 .
你可以使用诸如的方法
在阅读原始帖子的评论时,为了使其更有用,并允许人们在完成所有字段后按Enter键:
我没有看到的东西在这里回答:当你浏览页面上的元素时,当你到达提交按钮时按Enter将触发表单上的onsubmit处理程序,但它会将事件记录为MouseEvent . 这是我的简短解决方案,涵盖了大多数基础:
This is not a jQuery-related answer
HTML
JavaScript
要找到一个有效的例子:https://jsfiddle.net/nemesarial/6rhogva2/
不提交提交按钮就可以了 . 只需将脚本放入输入(type =按钮)或添加eventListener,如果您希望它在表单中提交数据 .
而是使用它
而不是使用这个
W3C HTML5规范的Section 4.10.22.2 Implicit submission说:
因此,禁用任何隐式提交表单的符合标准的方法是将禁用的提交按钮作为表单中的第一个提交按钮:
这种方法的一个很好的特点是没有JavaScript就可以工作;无论是否启用JavaScript,都需要符合标准的Web浏览器来防止隐式表单提交 .
这是我达到目标的解决方案,它很干净有效 .
在我的具体情况下,我不得不停止ENTER提交表单,并模拟单击提交按钮 . 这是因为提交按钮上有一个点击处理程序,因为我们在一个模态窗口内(继承了旧代码) . 在任何情况下,这是我的组合解决方案 .
此用例对使用IE8的人特别有用 .
禁止在任何地方输入密钥
如果表单中没有
<textarea>
,只需将以下内容添加到<form>
:或者使用jQuery:
这将导致在keyCode上检查表单内的每个按键 . 如果它不是13(Enter键),那么它将返回true并且任何内容都将按预期运行 . 如果它是13(Enter键),那么它将返回false并且任何东西将立即停止,因此表单将不会被提交 .
keypress
事件优先于keydown
,因为只有在实际插入字符时才会触发此事件 . 按下任何键时会触发keydown
(和keyup
),包括控制键 . 并且_358336_的keyCode
代表插入的实际字符,而不是所使用的物理密钥 . 这样您就不需要显式检查Numpad Enter键(108)是否也被按下 .keyup
为时已晚,无法阻止表单提交 .请注意,在其他一些答案而不是
$(document)
中建议的$(window)
对IE <= 8中的keydown
/keypress
/keyup
不起作用,因此's not a good choice if you'也喜欢覆盖那些不良用户 .仅允许在textareas上输入密钥
如果表单中有
<textarea>
(当然应接受Enter键),则将keypress处理程序添加到不是<textarea>
的每个输入元素 .为了减少样板,最好用jQuery完成:
如果您在这些输入元素上附加了其他事件处理程序函数,由于某种原因您还要在输入键上调用,那么只能阻止事件的默认行为而不是返回false,因此它可以正确地传播到其他处理程序 .
允许在textareas上输入密钥并仅提交按钮
如果您还想在提交按钮
<input|button type="submit">
上同时输入密钥,那么您始终可以按如下方式优化选择器 .请注意,
input[type=text]
正如其他一些答案所建议的那样't cover those HTML5 non-text inputs, so that'不是一个好的选择器 .我想添加一些CoffeeScript代码(不经过现场测试):
(我希望你喜欢除非条款中的好处 . )
不要将 type="submit" 用于输入或按钮 .
使用 type="button" 并使用js [Jquery / angular / etc]将表单提交给服务器 .
我认为它涵盖了所有答案,但是如果你使用带有一些JavaScript验证代码的按钮,你可以设置表单的onkeypress for Enter来按预期调用你的提交:
onkeypress JS可以是你需要做的任何事情 . 没有必要进行更大规模的全球变革 . 如果您不是从头开始编写应用程序的人,并且您已经被修复到其他人的网站而不将其拆开并重新测试它,则尤其如此 .
使用:
此解决方案适用于网站上的所有表单(也适用于使用Ajax插入的表单),仅防止输入文本中的输入 . 将它放在文档就绪功能中,并终生忘记这个问题 .
在我的情况下,我在表单中有几个jQuery UI自动填充字段和textareas,所以我绝对希望他们接受Enter . 所以我从表单中删除了
type="submit"
输入并添加了一个锚<a href="" id="btn">Ok</a>
. 然后我将其设置为按钮并添加以下代码:如果用户填写所有必填字段,
validateData()
成功并且表单提交 .使用:
我需要防止提交的特定输入,所以我使用了一个类选择器,让它成为一个“全局”功能,无论我需要它 .
而这个jQuery代码:
或者,如果keydown不足:
一些说明:
在这里修改各种好的答案,Enter键似乎适用
keydown
在所有浏览器上 . 作为替代方案,我将bind()
更新为on()
方法 .我是 class 选择者的忠实粉丝,权衡所有利弊和绩效讨论 . 我的命名约定是'idSomething',表示jQuery使用它作为id,将它与CSS样式分开 .