通过按Enter键阻止用户提交表单

时间:2009-05-21 21:09:25

标签: jquery html forms form-submit

我在网站上进行了一项调查,用户点击输入时出现了一些问题(我不知道为什么),并且在没有点击提交按钮的情况下意外提交调查(表单)。有办法防止这种情况吗?

我在调查中使用HTML,PHP 5.2.9和jQuery。

33 个答案:

答案 0 :(得分:793)

您可以使用

等方法
$(document).ready(function() {
  $(window).keydown(function(event){
    if(event.keyCode == 13) {
      event.preventDefault();
      return false;
    }
  });
});

在阅读原始帖子的评论时,为了使其更有用,并允许人们按 Enter ,如果他们已完成所有字段:

function validationFunction() {
  $('input').each(function() {
    ...

  }
  if(good) {
    return true;
  }
  return false;
}

$(document).ready(function() {
  $(window).keydown(function(event){
    if( (event.keyCode == 13) && (validationFunction() == false) ) {
      event.preventDefault();
      return false;
    }
  });
});

答案 1 :(得分:541)

禁止在任何地方输入密钥

如果表单中没有<textarea>,请将以下内容添加到<form>

<form ... onkeydown="return event.key != 'Enter';">

或者使用jQuery:

$(document).on("keydown", "form", function(event) { 
    return event.key != "Enter";
});

这将导致在key上检查表单内的每个按键。如果不是Enter,那么它将返回true,并且一切都会照常继续。如果是Enter,则会返回false,任何内容都会立即停止,因此不会提交表单。

keydown事件优先于keyup,因为keyup为时已晚,无法阻止表单提交。从历史上看,还有keypress,但这已被弃用,KeyboardEvent.keyCode也是如此。您应该使用KeyboardEvent.key而不是返回正在按下的键的名称。选中Enter后,这将检查13(正常输入)和108(小键盘输入)。

请注意$(window)在其他一些答案而不是$(document)中的建议不适用于IE&lt; = 8中的keydown / keyup,因此这不太好选择,如果你也想覆盖那些可怜的用户。

仅允许在textareas上输入密钥

如果表单中有<textarea>(当然 接受Enter键),则将keydown处理程序添加到不是{{ 1}}。

<textarea>

为了减少样板,最好用jQuery完成:

<input ... onkeydown="return event.key != 'Enter';">
<select ... onkeydown="return event.key != 'Enter';">
...

如果你在那些输入元素上附加了其他事件处理程序函数,你也想因为某种原因调用enter键,那么只能阻止事件的默认行为而不是返回false,所以它可以正确地传播给其他处理程序

$(document).on("keydown", ":input:not(textarea)", function(event) {
    return event.key != "Enter";
});

允许在textareas上输入密钥并仅提交按钮

如果您还想在提交按钮$(document).on("keydown", ":input:not(textarea)", function(event) { if (event.key == "Enter") { event.preventDefault(); } }); 上允许输入密钥,那么您始终可以按以下方式优化选择器。

<input|button type="submit">

请注意,其他一些答案中建议的$(document).on("keydown", ":input:not(textarea):not(:submit)", function(event) { // ... }); 不会涵盖那些HTML5非文本输入,因此这不是一个好的选择器。

答案 2 :(得分:64)

我必须抓住与按键相关的所有三个事件,以防止提交表单:

    var preventSubmit = function(event) {
        if(event.keyCode == 13) {
            console.log("caught ya!");
            event.preventDefault();
            //event.stopPropagation();
            return false;
        }
    }
    $("#search").keypress(preventSubmit);
    $("#search").keydown(preventSubmit);
    $("#search").keyup(preventSubmit);

您可以将以上所有内容组合成一个精美的紧凑版本:

    $('#search').bind('keypress keydown keyup', function(e){
       if(e.keyCode == 13) { e.preventDefault(); }
    });

答案 3 :(得分:44)

如果您使用脚本进行实际提交,那么您可以将“return false”行添加到onsubmit处理程序中,如下所示:

<form onsubmit="return false;">

从JavaScript调用表单上的submit()不会触发事件。

答案 4 :(得分:40)

W3C HTML5规范的

Section 4.10.22.2 Implicit submission说:

  

form元素的默认按钮submit button中的第一个tree order,其form owner是该form元素。      

如果用户代理支持让用户隐式提交表单(例如,在某些平台上,当文本字段集中隐式提交表单时,按下“ enter”键),则对{{3 }}已定义default button,必须使用户代理在该activation behaviorrun synthetic click activation steps

     
    

注意:因此,如果禁用default button,则在使用这种隐式提交机制时不会提交表单。 (禁用时,按钮没有default button。)

  

因此,禁用任何形式的隐式提交的符合标准的方法是将禁用的提交按钮放置为表单中的第一个提交按钮:

<form action="...">
  <!-- Prevent implicit submission of the form -->
  <button type="submit" disabled style="display: none" aria-hidden="true"></button>

  <!-- ... -->

  <button type="submit">Submit</button>
</form>

此方法的一个不错的功能是,它可以在没有JavaScript的情况下正常工作;无论是否启用JavaScript,都需要使用符合标准的Web浏览器以防止隐式提交表单。

答案 5 :(得分:22)

使用:

$(document).on('keyup keypress', 'form input[type="text"]', function(e) {
  if(e.keyCode == 13) {
    e.preventDefault();
    return false;
  }
});

此解决方案适用于网站上的所有表单(也适用于使用Ajax插入的表单),仅在输入文本中阻止 Enter 。将它放在文档就绪功能中,并终生忘记这个问题。

答案 6 :(得分:20)

而不是阻止用户按 Enter (这可能看起来不自然),您可以保留表单并添加一些额外的客户端验证:当调查未完成时,结果不会被发送到服务器和用户得到一个很好的消息,告诉你需要完成什么来完成表单。如果您使用的是jQuery,请尝试使用Validation插件:

http://docs.jquery.com/Plugins/Validation

这需要比抓住 Enter 按钮更多的工作,但肯定会提供更丰富的用户体验。

答案 7 :(得分:18)

我还不能评论,所以我会发一个新的答案

接受的答案是ok-ish,但它没有停止提交numpad enter。至少在当前版本的Chrome中。我不得不改变键码条件,然后才能工作。

if(event.keyCode == 13 || event.keyCode == 169) {...}

答案 8 :(得分:17)

一个简单的小jQuery解决方案:

$("form").bind("keypress", function (e) {
    if (e.keyCode == 13) {
        return false;
    }
});

答案 9 :(得分:12)

达到目标是我的解决方案, 它干净而有效。

$('form').submit(function () {
  if ($(document.activeElement).attr('type') == 'submit')
     return true;
  else return false;
});

答案 10 :(得分:9)

完全不同的方法:

  1. Enter 即可激活表单中的第一个<button type="submit">
  2. 即使按钮隐藏了style="display:none;
  3. ,也是如此
  4. 该按钮的脚本可以返回false,这会中止提交过程。
  5. 您仍然可以使用另一个<button type=submit>来提交表单。只需返回true即可级联提交内容。
  6. 在关注真实提交按钮时按 Enter 将激活真实提交按钮。
  7. <textarea>或其他表单控件中按 Enter 将表现正常。
  8. <input>表单控件中按 Enter 将触发第一个<button type=submit>,返回false,因此没有任何反应。
  9. 因此:

    <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>
    

答案 11 :(得分:8)

给表单一个'javascript:void(0);'的动作似乎可以做到这一点

<form action="javascript:void(0);">
<input type="text" />
</form>
<script>
$(document).ready(function() {
    $(window).keydown(function(event){
        if(event.keyCode == 13) {
    alert('Hello');
        }
    });
});
</script>

答案 12 :(得分:6)

我只需要阻止提交的特定输入,所以我使用了一个类选择器,让它成为我需要它的“全局”功能。

<input id="txtEmail" name="txtEmail" class="idNoEnter" .... />

这个jQuery代码:

$('.idNoEnter').keydown(function (e) {
  if (e.keyCode == 13) {
    e.preventDefault();
  }
});

或者,如果keydown不足:

$('.idNoEnter').on('keypress keydown keyup', function (e) {
   if (e.keyCode == 13) {
     e.preventDefault();
   }
});

一些注意事项:

在这里修改各种好的答案, Enter 键似乎适用于所有浏览器上的keydown。对于替代方案,我将bind()更新为on()方法。

我是班级选择者的忠实粉丝,权衡所有利弊和绩效讨论。我的命名约定是'idSomething',表示jQuery使用它作为id,将它与CSS样式分开。

答案 13 :(得分:6)

  1. 请勿使用 type =“submit”作为输入或按钮。
  2. 使用 type =“button”并使用js [Jquery / angular / etc]将表单提交给服务器。

答案 14 :(得分:5)

您可以创建一个JavaScript方法来检查 Enter 键是否被点击,如果是,则停止提交。

<script type="text/javascript">
  function noenter() {
  return !(window.event && window.event.keyCode == 13); }
</script>

只需在提交方法上调用它即可。

答案 15 :(得分:4)

不提交提交按钮就可以了。只需将脚本放入输入(type =按钮)或添加eventListener,如果您希望它在表单中提交数据。

而是使用此

<input type="button">

而不是使用此

<input type="submit">

答案 16 :(得分:2)

我认为它涵盖了所有答案,但如果您使用带有一些JavaScript验证代码的按钮,您可以为Enter设置表单的onkeypress以按预期调用您的提交:

<form method="POST" action="..." onkeypress="if(event.keyCode == 13) mySubmitFunction(this); return false;">

onkeypress JS可以是你需要做的任何事情。没有必要进行更大规模的全球变革。如果您不是从头开始编写应用程序的人,并且您已经被修复到其他人的网站而不将其撕开并重新测试它,则尤其如此。

答案 17 :(得分:2)

keys_unsorted[]

它运作完美!

答案 18 :(得分:2)

我有一个类似的问题,我有一个带有“ajax textfields”(Yii CGridView)的网格和一个提交按钮。每次我在文本字段上搜索并点击输入提交的表单。我不得不用按钮做一些事情,因为它是视图之间唯一的常用按钮(MVC模式)。我所要做的就是删除type="submit"并放置onclick="document.forms[0].submit()

答案 19 :(得分:1)

这里已经有很多不错的答案,我只是想从UX的角度做出一些贡献。表单中的键盘控件非常重要。

问题是如何禁止按键Enter上的提交。不是如何在整个应用程序中忽略Enter。因此,请考虑将处理程序附加到表单元素而不是窗口。

禁用Enter进行表单提交仍应允许以下操作:

  1. 焦点对准“提交”按钮时,通过Enter提交表单。
  2. 填写所有字段后提交表单。
  3. 通过Enter与未提交按钮的交互。

这只是样板,但它符合所有三个条件。

$('form').on('keypress', function(e) {
  // Register keypress on buttons.
  $attr = $(e.target).attr('type);
  if ($attr === 'button' || $attr === 'submit') {
    return true;
  }

  // Ignore keypress if all fields are not populated.
  if (e.which === 13 && !fieldsArePopulated(this)) {
    return false;
  }
});

答案 20 :(得分:1)

您还可以使用javascript:void(0)阻止表单提交。

<form action="javascript:void(0)" method="post">
    <label for="">Search</label>
    <input type="text">
    <button type="sybmit">Submit</button>
</form>

<form action="javascript:void(0)" method="post">
    <label for="">Search</label>
    <input type="text">
    <button type="sybmit">Submit</button>
</form>

答案 21 :(得分:1)

仅阻止提交,而不是输入密钥的其他重要功能,例如在<textarea>中创建新段落:

&#13;
&#13;
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
}
&#13;
input,
textarea {
  display: inline-block;
  margin-bottom: 1em;
  border: 1px solid #6f6f6f;
  padding: 5px;
  border-radius: 2px;
  width: 90%;
  font-size: 14px;
}

input[type=submit] {
  background: lightblue;
  color: #fff;
}
&#13;
<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><br/>
  <p>Sample textfield (try enter key):</p>
  <input type="text" placeholder="" />
  <br/>
  <input type="submit" value="Save" />
  <h3 id="log"></h3>
</form>
&#13;
&#13;
&#13;

答案 22 :(得分:0)

进入您的css并将其添加到其中,然后只要您不想再提交,只要您已经提交了输入,就可以自动阻止提交配方器,您可以删除它或输入activate和{{1} }代替

deactivate

答案 23 :(得分:0)

这会禁用页面上所有表单的 Enter 键,并且不会阻止在 textarea 中输入。

    // disable form submit with enter

    $('form input:not([type="submit"])').keydown((e) => {
        if (e.keyCode === 13) {
            e.preventDefault();
            return false;
        }
        return true;
    });

答案 24 :(得分:0)

这是一种完美的方法,您将不会从页面上重定向

$('form input').keydown(function (e) {
if (e.keyCode == 13) {
    e.preventDefault();
    return false;
}
});

答案 25 :(得分:0)

我没有看到的东西在这里回答:当你浏览页面上的元素时,当你到达提交按钮时按 Enter 将触发表单上的onsubmit处理程序,但它会记录该事件作为MouseEvent。这是我的简短解决方案,涵盖了大多数基础:

这不是与jQuery相关的答案

HTML

<form onsubmit="return false;" method=post>
  <input type="text" /><br />
  <input type="button" onclick="this.form.submit()" value="submit via mouse or keyboard" />
  <input type="button" onclick="submitMouseOnly(event)" value="submit via mouse only" />
</form>

的JavaScript

window.submitMouseOnly=function(evt){
    let allow=(evt instanceof MouseEvent) && evt.x>0 && evt.y>0 && evt.screenX > 0 && evt.screenY > 0;
    if(allow)(evt.tagName=='FORM'?evt.target:evt.target.form).submit();
}

找一个有效的例子:https://jsfiddle.net/nemesarial/6rhogva2/

答案 26 :(得分:0)

我想添加一些CoffeeScript代码(不经过现场测试):

$ ->
    $(window).bind 'keypress', (event) ->
        if event.keyCode == 13
            unless {'TEXTAREA', 'SELECT'}[event.originalEvent.srcElement.tagName]
                event.preventDefault()

(我希望你喜欢在除非条款中的好处。)

答案 27 :(得分:0)

这对我有用

jQuery.each($("#your_form_id").find('input'), function(){
    $(this).bind('keypress keydown keyup', function(e){
       if(e.keyCode == 13) { e.preventDefault(); }
    });
});

答案 28 :(得分:0)

在我的具体情况下,我不得不停止ENTER提交表单,并模拟单击提交按钮。这是因为提交按钮上有一个点击处理程序,因为我们在一个模态窗口内(继承了旧代码)。在任何情况下,这是我的组合解决方案。

    $('input,select').keypress(function(event) {
        // detect ENTER key
        if (event.keyCode == 13) {
            // simulate submit button click
            $("#btn-submit").click();
            // stop form from submitting via ENTER key press
            event.preventDefault ? event.preventDefault() : event.returnValue = false;
        }
    });

此用例对使用IE8的人特别有用。

答案 29 :(得分:-1)

使用 JavaScript (不检查任何输入字段):

<script>
window.addEventListener('keydown', function(e) {
    if (e.keyIdentifier == 'U+000A' || e.keyIdentifier == 'Enter' || e.keyCode == 13) {
        e.preventDefault();
        return false;
    }
}, true);
</script>

如果有人要在特定字段上应用此内容,例如输入文本:

<script>
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>

这对我来说很好。

答案 30 :(得分:-2)

在我的情况下,我在表单中有几个jQuery UI自动填充字段和textareas,所以我绝对希望他们接受 Enter 。因此,我从表单中删除了type="submit"输入,并添加了锚<a href="" id="btn">Ok</a>。然后我将其设置为按钮并添加以下代码:

$( '#btn' ).click( function( event ){
    event.preventDefault();
    if ( validateData() ){
        $( 'form#frm' ).append( '<input type="submit" id="frm-submit" style="display:none;"></input>' );
        setTimeout( function(){ $( '#frm-submit' ).click(); }, 500 );
    }
    return false;
});

如果用户填写了所有必填字段,validateData()成功并且表单提交。

答案 31 :(得分:-2)

在对其他解决方案感到非常沮丧之后,这对我来说在所有浏览器中都有用。 name_space外部函数只是为了远离声明全局变量,我也建议这样做。

$(function() {window.name_space = new name_space();}); //jquery doc ready
function name_space() {
    this.is_ie = (navigator.userAgent.indexOf("MSIE") !== -1);

    this.stifle = function(event) {
        event.cancelBubble;
        event.returnValue = false;
        if(this.is_ie === false) {
            event.preventDefault();
        }
        return false;
    }

    this.on_enter = function(func) {
        function catch_key(e) {
            var enter = 13;
            if(!e) {
                var e = event;
            }
            keynum = GetKeyNum(e);
            if (keynum === enter) {
                if(func !== undefined && func !== null) {
                    func();
                }
                return name_space.stifle(e);
            }
            return true; // submit
        }

        if (window.Event) {
            window.captureEvents(Event.KEYDOWN);
            window.onkeydown = catch_key;
        }
        else {
            document.onkeydown = catch_key;
        }

        if(name_space.is_ie === false) {
            document.onkeypress = catch_key;    
        }
    }
}

样品使用:

$(function() {
    name_space.on_enter(
        function () {alert('hola!');}
    );
});

答案 32 :(得分:-2)

使用:

// 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>