禁用表单的回车键

80

我一直在尝试禁用表单中的Enter键。我现在使用的代码如下所示。但是不知道为什么,按下回车键仍然会触发提交操作。这段代码位于我的head部分,并且根据其他来源来看似乎是正确的。

disableEnterKey: function disableEnterKey(e){
        var key;      
        if(window.event)
            key = window.event.keyCode; //IE
        else
            key = e.which; //firefox      

        return (key != 13);
    },

你是将它附加到表单、提交按钮还是窗口? - cwharris
所以你给我们一个你知道能工作的代码...然后问为什么它不工作?附注:这个fiddle证明它可以工作,所以请尝试提供更多关于你的问题的数据。这个函数是否被执行了? - Khez
16个回答

135

如果你使用jQuery,那么它非常简单。这里是代码:

$(document).keypress(
  function(event){
    if (event.which == '13') {
      event.preventDefault();
    }
});

3
可以这样实现,但如果你需要在代码的特定区域禁用它呢?例如:你想在表单中禁用回车键,但希望在顶部导航栏的搜索框中保持可用。 - ManelPNavarro
2
选择器可以是任何你想要的东西。$(document) 是选择器。你可以有 $("#IDofYourElement"),它将选择任何具有 id="IDofYourElement" 的元素。学习 JQuery 选择器,这样你就可以轻松地可视化正在发生的事情。否则,你将继续问这种问题,比如“如何选择 div 标签?如何选择 section?”学习规则并应用它是关键。 - Alexey Shevelyov
这个很好用,在一个有多个(asp.net)按钮的.NET页面上,输入某些内容会触发错误的函数,现在已经稳定了页面,谢谢! - visual
只是一点小提示 - 你也可以使用箭头函数.. $(document.keypress((event)=>{ if (event.which == '13') { event.preventDefault(); } }); - jpgerb

64
大部分的答案都是使用jQuery。你可以完全使用纯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>

这段代码非常好用,因为它只禁用了输入类型为'text'的文本框中的“Enter”按键事件。这意味着访问者仍然可以在文本区域和整个网页中使用“Enter”键。他们仍然可以通过使用“Tab”键到达“提交”按钮并按下“Enter”来提交表单。

以下是一些亮点:

  1. 它是纯JavaScript编写的(不需要库)。
  2. 它不仅检查按下的键,还确认是否在输入类型为'text'的表单元素上按下了“Enter”键。(这导致了最多的错误表单提交)
  3. 除此之外,用户可以在任何其他地方使用“Enter”键。
  4. 它简短、干净、快速且直截了当。

如果您想禁用其他操作的“Enter”键,可以添加console.log(e);进行测试,并在Chrome中按F12,转到“控制台”选项卡,然后在页面上按“退格”键并查看其中返回的值,然后您可以针对所有这些参数进一步增强上面的代码以适应您对"e.target.nodeName""e.target.type"等的需求...


6
实际上应该是 e.target.nodeName === 'INPUT' && e.target.type !== 'textarea'。使用指定的代码将允许在单选框或复选框获得焦点时提交表单。 - afnpires
你如何将其限制为仅适用于ID输入?即仅在<input id="noenter">上工作。 - NuclearApe
搞定了,将 e.target.type=='text' 后面加上 &&e.target.id=='noenter' - NuclearApe
你可能只想在文本区域和按钮上按回车键,所以代码应该是:e.target.type != 'textarea' && e.target.type != 'submit' && e.target.type != 'button' - Pluto

52
在您的表单标记中,只需粘贴以下内容:
onkeypress="return event.keyCode != 13;"

例子

<input type="text" class="search" placeholder="search" onkeypress="return event.keyCode != 13;">

如果您希望在键入时搜索并忽略回车,则此功能可能很有用。

/// Grab the search term
const searchInput = document.querySelector('.search')
/// Update search term when typing
searchInput.addEventListener('keyup', displayMatches)

3
请注意,根据 MDN 的说法,onkeypress 现在被视为废弃的方法,应该使用 keydown 代替。 - mochsner
对于那些来到这里的人,请注意这将阻止文本区域内的换行。 - Shane Reustle

28

试试这个 ^^

$(document).ready(function() {
        $("form").bind("keypress", function(e) {
            if (e.keyCode == 13) {
                return false;
            }
        });
    });
希望这能帮到你。

3
这是比当前选定的解决方案更好的解决方法,因为它只会选择指定的表单。我建议给表单添加一个ID或类并通过这种方式进行选择。我可以看到另一个开发人员开发他们自己的表单时,当按下回车键时他们会感到沮丧,因为他们的表单不起作用。可以使用 $("#id-of-form") 或者更好的 $("form.form--disable-enter-key") 进行选择。 - StingeyB

10
对于非 JavaScript 解决方案,请将 <button disabled>Submit</button> 放入表单中,在任何其他提交按钮/输入之前定位。我建议在 <form> 开始标签之后立即放置它(并使用 CSS 将其隐藏,accesskey='-1' 以使其退出 Tab 序列等)。
据我所知,当输入框中按下 ENTER 键时,用户代理会查找第一个提交按钮,如果该按钮被禁用,则停止查找其他按钮。

表单元素的默认按钮是树顺序中第一个其表单所有者为该表单元素的提交按钮。

如果用户代理支持隐式提交表单(例如,在某些平台上,当文本字段获得焦点时,按“enter”键会隐式提交表单),则对于具有定义的激活行为的默认按钮的表单,必须导致用户代理在该默认按钮上运行合成点击激活步骤。

因此,如果默认按钮被禁用,则在使用此类隐式提交机制时不会提交表单。(禁用时,按钮没有激活行为。)

https://www.w3.org/TR/html5/forms.html#implicit-submission

但是,我知道 Safari 10 MacOS 在此处行为不当,即使默认按钮被禁用也会提交表单。
因此,如果您可以使用 JavaScript,请插入 <button onclick="return false;">Submit</button>。在按下 ENTER 键时,将调用 onclick 处理程序,并且由于它返回 false,提交过程停止。我测试过的浏览器甚至不会执行浏览器验证操作(聚焦第一个无效的表单控件,显示错误消息等)。

1
谢谢,这应该是被选中的答案!不需要复杂的代码,不依赖于像jQuery这样的框架,也不需要将表单(或至少提交)改为解决方法。对我来说,第一个控件<input type="submit" disabled onclick="return false" style="display:none"></input>就可以解决问题。...而且我不需要在我的表单中做任何改变。有时候阅读说明书(在这种情况下是规格)真的很有帮助。 - Michael
这似乎完全禁用了按钮,但这似乎不是作者想要的?如果他们和我一样,只是想将其从回车键中取消映射。 - mochsner
@mochsner,您可以拥有多个提交按钮。第一个将被<kbd>ENTER</kbd>定位(即使它是隐藏的),任何其他按钮都可以被点击。因此,从技术上讲,不是取消映射<kbd>ENTER</kbd>,而是映射到死亡提交按钮。同样的结果。 - Erics

9
解决方案非常简单: 将"type"属性的值从"Submit"改为"button"。
<input type="button" value="Submit" onclick="this.form.submit()" />

这个解决方案会完全破坏那些禁用JavaScript的用户的表单。但是,通过使用JavaScript来覆盖Enter键,可以使非JavaScript浏览器和使用辅助工具的人仍然能够使用默认行为。 - John Y

8

这是纯JavaScript实现的。

        document.addEventListener('keypress', function (e) {
            if (e.keyCode === 13 || e.which === 13) {
                e.preventDefault();
                return false;
            }
            
        });


6
这里有一个使用jQuery实现的简单方法,可以将其限制在适当的输入元素中:
//prevent submission of forms when pressing Enter key in a text input
$(document).on('keypress', ':input:not(textarea):not([type=submit])', function (e) {
    if (e.which == 13) e.preventDefault();
});

感谢这个答案:https://dev59.com/NnNA5IYBdhLWcg3wmfO5#1977126

3
只需在HTML代码的标签中添加以下代码,即可使所有表单字段在按下回车键时进行表单提交。
<script type="text/javascript">
    function stopEnterKey(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 = stopEnterKey;
</script>

2
如果您使用jQuery,可以尝试以下方法。
$("form").bind("keydown", function(e) {
   if (e.keyCode === 13) return false;
 });

这将等待按键事件,如果是Enter键,它将不做任何操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接