使用回车键阻止表单提交

IT技术 javascript jquery html
2021-02-11 08:33:33

我刚刚写了这个漂亮的小函数,它适用于表单本身......

$("#form").keypress(function(e) {
    if (e.which == 13) {
        var tagName = e.target.tagName.toLowerCase(); 
        if (tagName !== "textarea") {
            return false;
        }
    }
});

在我的逻辑中,我想在输入文本区域期间接受回车。此外,将输入字段的回车键行为替换为跳转到下一个输入字段的行为(就像按下了 Tab 键一样)将是一个额外的好处。有没有人知道使用事件传播模型正确触发适当元素上的回车键的方法,但防止在其按下时提交表单?

6个回答

您可以模仿 Tab 键按下而不是像这样在输入上输入:

//Press Enter in INPUT moves cursor to next INPUT
$('#form').find('.input').keypress(function(e){
    if ( e.which == 13 ) // Enter key = keycode 13
    {
        $(this).next().focus();  //Use whatever selector necessary to focus the 'next' input
        return false;
    }
});

您显然需要弄清楚按下 Enter 时需要哪些选择器才能专注于下一个输入。

@AitazazKhan 您可以使用tabindex属性,但我认为您的光标最终会击中它。您也可以在只读输入聚焦时设置一个 jQuery 事件并强制聚焦到另一个元素......从未尝试过。
2021-03-17 08:33:33
我喜欢你如何用这个 return false 阻止整个输入;return false 必须移动到条件块中。否则必须使用 return true。
2021-03-18 08:33:33
如何避免光标在只读输入字段中聚焦,例如跳过只读字段
2021-03-31 08:33:33
需要添加——返回false;
2021-04-03 08:33:33
你可能会发现这$(this).nextAll('INPUT').first().focus();比 更合适$(this).next().focus();试试看,看看有什么不同。
2021-04-04 08:33:33

请注意,当按下 Enter 键时,总是会提交单个输入表单。防止这种情况发生的唯一方法是:

<form action="/search.php" method="get">
<input type="text" name="keyword" />
<input type="text" style="display: none;" />
</form>
绝对精彩!
2021-03-27 08:33:33
+1 提示:按下回车键时,总是会提交单个输入表单。
2021-03-30 08:33:33

这是我的函数的修改版本。它执行以下操作:

  1. 防止 enter 键作用于表单的任何元素,而不是 textarea、button、submit。
  2. 回车键现在就像一个选项卡。
  3. 在元素上调用 preventDefault(), stopPropagation() 很好,但在表单上调用似乎阻止了事件到达元素。

所以我的解决方法是检查元素类型,如果类型不是 textarea(允许输入)或按钮/提交(输入 = 单击),那么我们只需 Tab 到下一件事。

在元素上调用 .next() 没有用,因为其他元素可能不是简单的兄弟元素,但是因为 DOM 在选择时几乎保证顺序,所以一切都很好。

function preventEnterSubmit(e) {
    if (e.which == 13) {
        var $targ = $(e.target);

        if (!$targ.is("textarea") && !$targ.is(":button,:submit")) {
            var focusNext = false;
            $(this).find(":input:visible:not([disabled],[readonly]), a").each(function(){
                if (this === e.target) {
                    focusNext = true;
                }
                else if (focusNext){
                    $(this).focus();
                    return false;
                }
            });

            return false;
        }
    }
}
如果不清楚,preventEnterSubmit是表单keypress事件的处理程序
2021-03-15 08:33:33
出于某种原因,我只是 不能得到这个工作。 jQuery('#form_id').onkeypress(preventEnterSubmit(e);返回一个引用错误,说e找不到;与更多迂回方法相同,例如jQuery('#form_id').addEventListener('keypress', preventEnterSubmit(e)); 这里缺少什么?
2021-03-22 08:33:33
如果您也添加对选择的支持会更好
2021-04-14 08:33:33

从可用性的角度来看,更改输入行为以模仿选项卡是一个非常糟糕的主意。用户习惯于使用回车键提交表单。这就是互联网的运作方式。你不应该打破这个。

或者,如果您使用的是条码扫描仪,它们会在发送完条码编号后自动发送回车键。
2021-03-22 08:33:33
我总体上同意这一点,但是,这就是我在这里的原因......我有一个包含添加地图点的表单,我不希望使用邮政编码搜索的用户意外提交表单(地图搜索字段也作为表单的一部分保存,所以我不能完全把它拉出来),有时有些情况需要打破规则
2021-03-22 08:33:33
并且...当您尝试手动从列表中进行选择时,Safari 使用 Enter 进行选择 - 这很糟糕,但这就是它的作用
2021-03-29 08:33:33
不一定总是。如果很清楚需要填写另一个字段,那么强制制表符就可以了。只要确实需要填写下一个字段。
2021-04-04 08:33:33
我发现用户对这种行为感到惊讶。此外,jquery 验证不适用于输入键提交。
2021-04-11 08:33:33

文章 Enter Key as the Default Button 描述了如何设置 Enter 按键的默认行为。但是,有时,您需要在按下 Enter 键时禁用表单提交。如果你想完全阻止它,你需要在页面的标签上使用 OnKeyPress 处理程序。

<body OnKeyPress="return disableKeyPress(event)">

javascript 代码应该是:

<script language="JavaScript">

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

     return (key != 13);
}

</script>

如果要在输入字段中按下 Enter 键时禁用表单提交,则必须在输入字段的 OnKeyPress 处理程序上使用上述函数,如下所示:

<input type="text" name="txtInput" onKeyPress="return disableEnterKey(event)">

来源:http : //www.bloggingdeveloper.com/post/Disable-Form-Submit-on-Enter-Key-Press.aspx

@YevgeniyAfanasyev 我很高兴你发现我的解决方案有帮助:)
2021-03-25 08:33:33
这对我来说只是可行的解决方案。我的案例是带有自动填充选项的编辑,当您选择选项时按 Enter 键,对吗?在我的情况下,选择的选项没有传递给 js 函数,而是提交了表单。现在我可以通过这个小阻塞技巧来使用 google maps api。它也适用于谷歌浏览器。谢谢你。
2021-03-29 08:33:33