【发布时间】:2010-10-09 18:45:27
【问题描述】:
如何防止 ENTER 按键在基于 Web 的应用程序中提交表单?
【问题讨论】:
标签: javascript events
如何防止 ENTER 按键在基于 Web 的应用程序中提交表单?
【问题讨论】:
标签: javascript events
我认为,您可以在 javascript 中的表单上捕获 keydown 并防止冒泡。网页上的ENTER基本上只是提交当前选中控件所在的表单。
【讨论】:
ENTER 键仅激活表单的默认提交按钮,这将是第一个
<input type="submit" />
浏览器在表单中找到。
因此没有提交按钮,而是类似
<input type="button" value="Submit" onclick="submitform()" />
编辑:回应 cmets 中的讨论:
如果您只有一个文本字段,这将不起作用 - 但在这种情况下,这可能是所需的行为。
另一个问题是这依赖于 Javascript 来提交表单。从可访问性的角度来看,这可能是一个问题。这可以通过使用 javascript 编写 <input type='button'/> 来解决,然后将 <input type='submit' /> 放入 <noscript> 标记中。这种方法的缺点是,对于禁用 javascript 的浏览器,您将在 ENTER 上提交表单。在这种情况下,由 OP 决定所需的行为是什么。
我根本不知道不调用 javascript 就无法做到这一点。
【讨论】:
你必须调用这个函数,它只会取消表单的默认提交行为。您可以将其附加到任何输入字段或事件。
function 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();
}
}
【讨论】:
[修订版 2012,无内联处理程序,保留 textarea 输入处理]
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;
}
现在您可以在表单上定义按键处理程序:
document.querySelector('form').onkeypress = checkEnter;
【讨论】:
只需从 onsubmit 处理程序返回 false
<form onsubmit="return false;">
或者如果你想在中间有一个处理程序
<script>
var submitHandler = function() {
// do stuff
return false;
}
</script>
<form onsubmit="return submitHandler()">
【讨论】:
submit 按钮提交表单,这不是一个好主意
<form> 提交根本就是把婴儿和洗澡水一起扔出去。
这是一个 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;
});
});
【讨论】:
stopSubmitOnEnter (e) {
var eve = e || window.event;
var keycode = eve.keyCode || eve.which || eve.charCode;
if (keycode == 13) {
eve.cancelBubble = true;
eve.returnValue = false;
if (eve.stopPropagation) {
eve.stopPropagation();
eve.preventDefault();
}
return false;
}
}
然后在你的表格上:
<form id="foo" onkeypress="stopSubmitOnEnter(e);">
不过,最好不要使用突兀的 JavaScript。
【讨论】:
charCode。我还在 if 块中移动了 return false。很好的收获。
在我的例子中,这个 jQuery JavaScript 解决了这个问题
jQuery(function() {
jQuery("form.myform").submit(function(event) {
event.preventDefault();
return false;
});
}
【讨论】:
<input> 字段启用 enter 键?
怎么样:
<asp:Button ID="button" UseSubmitBehavior="false"/>
【讨论】:
此链接提供的解决方案适用于我在 Chrome、FF 和 IE9 以及 IE9 开发工具 (F12) 附带的 IE7 和 8 模拟器。
【讨论】:
<script type="text/javascript"> function stopRKey(evt) { var evt = (evt) ? evt : ((event) ? event : null); var node = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null); if ((evt.keyCode == 13) && (node.type=="text")) {return false;} } document.onkeypress = stopRKey; </script>
//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 将达到相同的目的,但允许事件到达父元素中的处理程序。仍然会阻止默认操作(表单汇总)
阻止“ENTER”提交表单可能会给您的一些用户带来不便。因此,如果您按照以下步骤进行操作会更好:
在表单标签中写入“onSubmit”事件:
<form name="formname" id="formId" onSubmit="return testSubmit()" ...>
....
....
....
</form>
编写Javascript函数如下:
function testSubmit(){
if(jQuery("#formId").valid())
{
return true;
}
return false;
}
(OR)
是什么原因,如果你想阻止按Enter键提交表单,你可以在javascript中编写以下函数:
$(document).ready(function() {
$(window).keydown(function(event){
if(event.keyCode == 13) {
event.preventDefault();
return false;
}
});
});
谢谢。
【讨论】:
另一种方法是仅在应该提交时将提交输入按钮附加到表单,并在填写表单时将其替换为简单的 div
【讨论】:
只需将此属性添加到您的 FORM 标签:
onsubmit="return gbCanSubmit;"
然后,在您的 SCRIPT 标记中,添加以下内容:
var gbCanSubmit = false;
然后,当您制作按钮或出于任何其他原因(例如在函数中)您最终允许提交时,只需翻转全局布尔值并执行 .submit() 调用,类似于此示例:
function submitClick(){
// error handler code goes here and return false if bad data
// okay, proceed...
gbCanSubmit = true;
$('#myform').submit(); // jQuery example
}
【讨论】:
将此标签添加到您的表单 - onsubmit="return false;"
然后你只能用一些 JavaScript 函数提交你的表单。
【讨论】:
我花了一些时间为 IE8、9、10、Opera 9+、Firefox 23、Safari (PC) 和 Safari(MAC) 制作这款跨浏览器
JSFiddle 示例: http://jsfiddle.net/greatbigmassive/ZyeHe/
基本代码 - 通过附加到表单的“onkeypress”调用此函数并将“window.event”传递给它。
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;
}
}
}
}
【讨论】:
我在此主题、此处或其他帖子中找到的所有答案都有一个缺点,那就是它也阻止了表单元素上的实际更改触发器。因此,如果您运行这些解决方案,onchange 事件也不会被触发。为了克服这个问题,我修改了这些代码并为自己开发了以下代码。我希望这对其他人有用。 我为我的表单“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");
}
});
});
【讨论】:
放入javascript外部文件
(function ($) {
$(window).keydown(function (event) {
if (event.keyCode == 13) {
return false;
}
});
})(jQuery);
或body标签内的某处
<script>
$(document).ready(function() {
$(window).keydown(function(event) {
alert(1);
if(event.keyCode == 13) {
return false;
}
});
});
</script>
【讨论】:
我遇到了同样的问题(包含大量文本字段和不熟练用户的表单)。
我是这样解决的:
function chkSubmit() {
if (window.confirm('Do you want to store the data?')) {
return true;
} else {
// some code to focus on a specific field
return false;
}
}
在 HTML 代码中使用它:
<form
action="go.php"
method="post"
accept-charset="utf-8"
enctype="multipart/form-data"
onsubmit="return chkSubmit()"
>
这样ENTER 键按计划工作,但需要确认(通常是第二次ENTER)。
如果用户决定留在表单上,我将请求发送给用户的脚本发送到他按下ENTER 的字段中。
【讨论】:
这对我有用。
onkeydown="return !(event.keyCode==13)"
<form id="form1" runat="server" onkeydown="return !(event.keyCode==13)">
</form>
【讨论】:
请查看这篇文章How to prevent ENTER keypress to submit a web form?
$(“.pc_prevent_submit”).ready(function() {
$(window).keydown(function(event) {
if (event.keyCode == 13) {
event.preventDefault();
return false;
}
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form class=”pc_prevent_submit” action=”” method=”post”>
<input type=”text” name=”username”>
<input type=”password” name=”userpassword”>
<input type=”submit” value=”submit”>
</form>
【讨论】:
在纯 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>
这只会禁用 input type='text' 的“Enter”按键操作。访问者仍然可以在整个网站上使用“Enter”键。
如果您还想禁用其他操作的“Enter”,您可以添加 console.log(e);出于您的测试目的,并在 chrome 中按 F12,转到“控制台”选项卡并在页面上按“退格键”并查看其内部以查看返回的值,然后您可以定位所有这些参数以进一步增强代码以上以满足您对 "e.target.nodeName"、"e.target.type" 和还有很多...
【讨论】:
e.target.nodeName === 'INPUT' && e.target.type !== 'textarea'。使用指定的代码,如果选中单选框或复选框,它将允许提交表单。
要防止在textarea 或input 字段中按enter 时提交表单,请检查提交事件以查找发送事件的元素类型。
<button type="submit" form="my-form">Submit</button>
<form id="my-form">
...
</form>
$(document).on('submit', 'form', function(e) {
if (e.delegateTarget.activeElement.type!=="submit") {
e.preventDefault();
}
});
更好的解决方案是,如果您没有提交按钮并使用普通按钮触发事件。这更好,因为在第一个示例中触发了 2 个提交事件,但在第二个示例中仅触发了 1 个提交事件。
<button type="button" onclick="$('#my-form').submit();">Submit</button>
<form id="my-form">
...
</form>
$(document).on('submit', 'form', function(e) {
if (e.delegateTarget.activeElement.localName!=="button") {
e.preventDefault();
}
});
【讨论】:
activeElement 被提交,即使您单击它也是如此。因此,在 Safari 上,它会阻止表单被提交。
过去,我总是使用上述按键处理程序来完成此操作,但今天找到了一个更简单的解决方案。回车键只是触发表单上第一个未禁用的提交按钮,所以实际上所需要的只是拦截试图提交的按钮:
<form>
<div style="display: none;">
<input type="submit" name="prevent-enter-submit" onclick="return false;">
</div>
<!-- rest of your form markup -->
</form>
就是这样。按键将由浏览器/字段/等照常处理。如果触发了输入-提交逻辑,则浏览器将找到隐藏的提交按钮并触发它。然后 javascript 处理程序将阻止提交。
【讨论】:
hidden 放在输入上会更短。不错的技巧:)
你会发现这更简单有用:D
$(document).on('submit', 'form', function(e){
/* on form submit find the trigger */
if( $(e.delegateTarget.activeElement).not('input, textarea').length == 0 ){
/* if the trigger is not between selectors list, return super false */
e.preventDefault();
return false;
}
});
【讨论】:
我自己也遇到过这个问题,因为我有多个具有不同“名称”值的提交按钮,因此提交时它们在同一个 php 文件上执行不同的操作。 enter / return 按钮打破了这一点,因为这些值没有提交。
所以我在想,enter / return 按钮会激活表单中的第一个提交按钮吗?
这样,您可以拥有一个隐藏的“香草”提交按钮,或者具有将执行的 php 文件返回到其中包含表单的页面的“名称”值。
或者,按键激活的默认(隐藏)“名称”值,并且提交按钮用它们自己的“名称”值覆盖。
只是一个想法。
【讨论】:
怎么样:
<script>
function isok(e) {
var name = e.explicitOriginalTarget.name;
if (name == "button") {
return true
}
return false;
}
</script>
<form onsubmit="return isok(event);">
<input type="text" name="serial"/>
<input type="submit" name="button" value="Create Thing"/>
</form>
只需正确命名您的按钮,它仍会提交,但文本字段,即当您按回车键时的显式原始目标,将没有正确的名称。
【讨论】:
我会这样做:
window.addEventListener('keydown', function(event)
{
if (event.key === "Enter" && event.target.tagName !== 'TEXTAREA')
{
if(event.target.type !== 'submit')
{
event.preventDefault();
return false;
}
}
});
【讨论】:
<textarea> 排除在外。
enter 提交表单。你认为最合适的方法是什么?如果可用,我认为最好的方法是如果<form> 元素具有一个属性来防止所有子元素上的这种默认行为,同时还具有在每个子元素上设置一个属性以覆盖表单级别的粒度如果需要,属性。我不知道这些属性是否存在。你认为什么是最好的?
如果这些答案都不适合你,试试这个。在实际提交表单的按钮之前添加一个提交按钮,并且对事件不执行任何操作。
HTML
<!-- The following button is meant to do nothing. This button will catch the "enter" key press and stop it's propagation. -->
<button type="submit" id="EnterKeyIntercepter" style="cursor: auto; outline: transparent;"></button>
JavaScript
$('#EnterKeyIntercepter').click((event) => {
event.preventDefault(); //The buck stops here.
/*If you don't know what this if statement does, just delete it.*/
if (process.env.NODE_ENV !== 'production') {
console.log("The enter key was pressed and captured by the mighty Enter Key Inceptor (⌐■_■)");
}
});
【讨论】: