如何防止ENTER键提交Web表单?

use*_*722 198 javascript events

如何防止ENTER按键在基于Web的应用程序中提交表单?

Koo*_*Inc 96

[ 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;
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以在表单上定义一个按键处理程序:
<form [...] onkeypress ="return checkEnter(event)">

document.querySelector('form').onkeypress = checkEnter;
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一句:您可以在checkEnter函数中添加对输入类型的检查(通过事件源)以排除textarea的. (3认同)

the*_*man 55

这是一个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;
 });
});
Run Code Online (Sandbox Code Playgroud)

  • 用最简单的方法:$("#myinput").keydown(function(e){if(e.which == 13)e.preventDefault();}); 关键是一起使用"keydown"和event.preventDefault().它不适用于"keyup". (12认同)

Pau*_*jan 46

只需从onsubmit处理程序返回false

<form onsubmit="return false;">
Run Code Online (Sandbox Code Playgroud)

或者如果你想在中间处理一个处理程序

<script>
var submitHandler = function() {
  // do stuff
  return false;
}
</script>
<form onsubmit="return submitHandler()">
Run Code Online (Sandbox Code Playgroud)

  • @Paul,这是如何获得38票的?完全停止提交"<form>"****将婴儿扔出洗澡水. (39认同)
  • 如果您希望通过按"提交"按钮提交表单,这不是一个好主意 (22认同)
  • Doesn't work because the submit button no longer submits the form (13认同)
  • @Pacerier在SPA的上下文中,您几乎总是希望手动处理表单提交.在这种情况下,始终阻止浏览器提交表单(并刷新页面,重新启动应用程序)是合理的. (6认同)
  • 这似乎是最简单的答案.我在谷歌浏览器上试过它,它运行正常.你在每个浏览器中测试过这个吗? (5认同)
  • 很棒的主意我们不需要从页面移动 (3认同)

mtn*_*ner 44

//Turn off submit on "Enter" key

$("form").bind("keypress", function (e) {
    if (e.keyCode == 13) {
        $("#btnSearch").attr('value');
        //add more buttons here
        return false;
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 这非常有效.`e.preventDefault()`而不是`return false`将实现相同的结束,但允许事件到达父元素中的处理程序.仍将阻止默认操作(表单加载) (5认同)

has*_*ash 24

您将不得不调用此函数,它将取消窗体的默认提交行为.您可以将其附加到任何输入字段或事件.

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 你能解释一下这个函数的调用位置和方法吗? (9认同)
  • e应该是一个参数,然后你应该检查window.event.此外,您应该从事件中获取密钥代码.最后,你应该返回false. (2认同)

Dan*_*man 16

ENTER键仅激活表单的默认提交按钮,这将是第一个

<input type="submit" />
Run Code Online (Sandbox Code Playgroud)

浏览器在表单中找到.

因此,没有提交按钮,但有类似的东西

<input type="button" value="Submit" onclick="submitform()" /> 
Run Code Online (Sandbox Code Playgroud)

编辑:回应评论中的讨论:

如果您只有一个文本字段,则这不起作用 - 但在这种情况下可能是所需的行为.

另一个问题是,这依赖于Javascript来提交表单.从可访问性的观点来看,这可能是一个问题.这可以通过写来解决<input type='button'/>使用JavaScript,然后放了<input type='submit' />一个内<noscript>标签.这种方法的缺点是,对于禁用javascript的浏览器,您将在ENTER上提交表单.在这种情况下,由OP决定什么是期望的行为.

我知道在没有调用javascript的情况下无法做到这一点.

  • 可访问性太糟糕了?也许.然而它确实*回答了他们的问题,这就是SO的用途......也许编辑答案指出可访问性问题是一个很好的妥协? (5认同)
  • 通过一个文本输入和一个输入按钮测试了所有这些以及Opera:所有仍然在Enter上提交了表单.您显然需要JavaScript来"解决"Enter问题,但诀窍是这样做,同时不会使页面在JS不可用时完全无法运行. (2认同)

Tar*_*rik 12

简单回答纯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>
Run Code Online (Sandbox Code Playgroud)

这仅禁用输入type ='text'的"Enter"按键操作.访问者仍然可以在整个网站上使用"Enter"键.

如果你想为其他动作禁用"Enter",你可以添加console.log(e); 为了您的测试目的,并在Chrome中点击F12,转到"控制台"选项卡并点击页面上的"退格"并查看其中的内容以查看返回的值,然后您可以定位所有这些参数以进一步增强代码以上是为了满足你对"e.target.nodeName","e.target.type"以及更多......的需求......

请在此处查看我的详细答案

  • 实际上应该是`e.target.nodeName ==='INPUT'&& e.target.type!=='textarea'`.使用指定的代码,如果聚焦了广播或复选框,它将允许提交表单. (3认同)

小智 9

我在这个主题,这里或其他帖子中找到的所有答案都有一个缺点,那就是它也阻止了表单元素上的实际更改触发器.因此,如果您运行这些解决方案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");
        }
    });
});
Run Code Online (Sandbox Code Playgroud)


aco*_*ton 6

过去,我总是使用上面的按键处理程序来完成此操作,但今天遇到了一个更简单的解决方案。回车键仅触发表单上的第一个未禁用的提交按钮,因此实际上所需要做的就是拦截试图提交的按钮:

<form>
  <div style="display: none;">
    <input type="submit" name="prevent-enter-submit" onclick="return false;">
  </div>
  <!-- rest of your form markup -->
</form>
Run Code Online (Sandbox Code Playgroud)

而已。按键操作将由浏览器/ fields / etc等照常处理。如果触发了“输入-提交”逻辑,则浏览器将找到该隐藏的“提交”按钮并将其触发。然后javascript处理程序将阻止该细分。

  • 删除 div 并在输入上添加 attr `hidden` 会更短。不错的黑客:) (4认同)
  • 通常我不喜欢黑客,但这个确实很有效。 (3认同)

Ada*_*dam 5

我花了一些时间为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;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Nei*_*ell 1

我认为,您可以在 JavaScript 中捕获表单上的 keydown 并防止均匀冒泡。网页上的 ENTER 基本上只是提交当前所选控件所在的表单。