如何防止在基于Web的应用程序中按下ENTER键提交表单?
[修订 2012年,无内联处理程序,保留文本区域回车处理]
function checkEnter(e){
e = e || event;
var txtArea = /textarea/i.test((e.target || e.srcElement).tagName);
return txtArea || (e.keyCode || e.which || e.charCode || 0) !== 13;
}
现在你可以在表单上定义一个按键处理程序:
<form [...] onkeypress="return checkEnter(event)">
document.querySelector('form').onkeypress = checkEnter;
以下是一个jQuery处理程序,可用于阻止回车提交和后退键->后退。在“keyStop”对象中的(keyCode:selectorString)对用于匹配不应触发其默认操作的节点。
请记住,网络应该是一个无障碍的地方,这会打破键盘用户的期望。尽管如此,在我的情况下,我正在工作的Web应用程序也不喜欢返回按钮,因此禁用其快捷键是可以的。 “应该输入 - >提交”讨论很重要,但与实际提问的问题无关。
以下是代码,由您思考可访问性以及为什么要这样做!
$(function(){
var keyStop = {
8: ":not(input:text, textarea, input:file, input:password)", // stop backspace = back
13: "input:text, input:password", // stop enter = submit
end: null
};
$(document).bind("keydown", function(event){
var selector = keyStop[event.which];
if(selector !== undefined && $(event.target).is(selector)) {
event.preventDefault(); //stop event
}
return true;
});
});
只需从onsubmit处理程序中返回false即可。
<form onsubmit="return false;">
或者如果您想在中间使用一个处理程序。<script>
var submitHandler = function() {
// do stuff
return false;
}
</script>
<form onsubmit="return submitHandler()">
<form>
的提交就像是连婴儿一起倒掉。 - Pacerier//Turn off submit on "Enter" key
$("form").bind("keypress", function (e) {
if (e.keyCode == 13) {
$("#btnSearch").attr('value');
//add more buttons here
return false;
}
});
e.preventDefault()
而不是return false
可以达到同样的效果,但允许事件传递到父元素的处理程序。默认操作(表单提交)仍将被阻止。 - willscriptedfunction doNothing() {
var keyCode = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;
if( keyCode == 13 ) {
if(!e) var e = window.event;
e.cancelBubble = true;
e.returnValue = false;
if (e.stopPropagation) {
e.stopPropagation();
e.preventDefault();
}
}
短而简单的回答是使用纯Javascript:
<script type="text/javascript">
window.addEventListener('keydown', function(e) {
if (e.keyIdentifier == 'U+000A' || e.keyIdentifier == 'Enter' || e.keyCode == 13) {
if (e.target.nodeName == 'INPUT' && e.target.type == 'text') {
e.preventDefault();
return false;
}
}
}, true);
</script>
这只是禁用了 type='text' 的输入框中的 "Enter" 按键行为。访问者仍然可以在整个网站上使用 "Enter" 键。
如果您想禁用其他操作的 "Enter" 键,可以添加 console.log(e)进行测试,并在 Chrome 中按 F12,在“控制台”选项卡中单击页面上的“退格”并查看内部以查看返回的值,然后您可以针对所有这些参数来进一步改进上述代码以适应您需要的 "e.target.nodeName"、"e.target.type" 等等...
e.target.nodeName === 'INPUT' && e.target.type !== 'textarea'
。使用指定的代码,如果聚焦在单选框或复选框上,它将允许提交表单。 - afnpires按下回车键只会激活表单的默认提交按钮,该按钮通常是表单中第一个可提交的按钮。
<input type="submit" />
浏览器会在表单内查找提交按钮。
因此,不需要一个提交按钮,而是像这样的内容
<input type="button" value="Submit" onclick="submitform()" />
编辑:根据评论讨论:
如果您只有一个文本字段,则此方法无法使用 - 但在这种情况下可能是期望的行为。
另一个问题是,此方法依赖JavaScript提交表单。这可能从可访问性角度来看是个问题。可以通过使用javascript编写<input type='button'/>
,然后将<input type='submit' />
放置在<noscript>
标记中来解决这个问题。这种方法的缺点是对于禁用了javascript的浏览器,您将在按ENTER时进行表单提交。对于此情况下的期望行为,由OP决定。
我不知道在不涉及javascript的情况下如何实现此操作。
过去我总是用类似上面的按键处理程序来完成它,但今天找到了一个更简单的解决方案。回车键只会触发表单上第一个非禁用的提交按钮,所以实际上需要拦截尝试提交的那个按钮:
<form>
<div style="display: none;">
<input type="submit" name="prevent-enter-submit" onclick="return false;">
</div>
<!-- rest of your form markup -->
</form>
就是这样。按键将像往常一样由浏览器/字段等处理。如果触发了回车提交逻辑,那么浏览器将找到隐藏的提交按钮并触发它。然后,JavaScript 处理程序将防止提交。
hidden
属性,而不是删除 div
标签,这样会更短。不错的技巧 :) - Nik我在这个主题中找到的所有答案,无论是在这里还是在其他帖子中,都有一个缺点,那就是它也会阻止表单元素实际更改触发。因此,如果您运行这些解决方案,onchange事件也不会被触发。为了克服这个问题,我修改了这些代码,并为自己开发了以下代码。我希望这对他人有用。我给我的表单加了一个class名叫"prevent_auto_submit",并添加了以下JavaScript:
$(document).ready(function()
{
$('form.prevent_auto_submit input,form.prevent_auto_submit select').keypress(function(event)
{
if (event.keyCode == 13)
{
event.preventDefault();
$(this).trigger("change");
}
});
});
function stopEnterSubmitting(e) {
if (e.keyCode == 13) {
var src = e.srcElement || e.target;
if (src.tagName.toLowerCase() != "textarea") {
if (e.preventDefault) {
e.preventDefault();
} else {
e.returnValue = false;
}
}
}
}