按 Enter 阻止用户提交表单

问:

我在网站上进行了一项调查,用户按 Enter 键(我不知道为什么)并在未单击提交按钮的情况下意外提交了调查(表单)似乎存在一些问题。有没有办法防止这种情况?

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

答1:

与HuntsBot一起,探索全球自由职业机会–huntsbot.com

您可以使用诸如

$(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;
    }
  });
});

我目前只是在寻找快速修复,没有时间实施验证项目。我感谢每个人的回答,但这是我要同时使用的答案。谢谢你。

此方法不理想,因为它会阻止用户在关注提交按钮时按 Enter 提交表单。最好的解决方案是下面的 BalusC,其中输入仅在仍专注于表单输入时被中断。

我见过需要绑定到 document 上的 keydown 而不是 window 的情况(仅限 Internet Explorer)才能使其工作。

您可能希望将 && !$(document.activeElement).is('textarea') 添加到条件中,否则 textarea 内的换行符将被阻止(至少在 IE 中)。

这对我有用。但这也阻止了在 textarea 中添加换行符。

答2:

huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式

禁止在任何地方输入键

如果您的表单中没有 ,则只需将以下内容添加到您的 :



或者使用 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<=8 中的 keydown/keyup,因此如果您想覆盖那些可怜的用户,这不是一个好的选择也是。

仅允许在 textareas 上输入键

如果您的表单中有 (当然应该接受 Enter 键),则将 keydown 处理程序添加到不是 的每个单独的输入元素。



...

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

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

如果您在这些输入元素上附加了其他事件处理函数,并且出于某种原因您还想在输入键上调用它们,那么只阻止事件的默认行为而不是返回 false,因此它可以正确传播到其他处理程序。

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

只允许在 textareas 上输入键和提交按钮

如果您也想在提交按钮 <input|button type=“submit”> 上允许输入键,那么您可以随时优化选择器,如下所示。

$(document).on("keydown", ":input:not(textarea):not(:submit)", function(event) {
    
    
    // ...
});

请注意,其他一些答案中建议的 input[type=text] 不涵盖那些 HTML5 非文本输入,因此这不是一个好的选择器。

这应该是一个很好的答案,因为它还处理包括 textarea 在内的表单并更好地解释事件传播

这可以防止输入键在除 textarea 之外的任何输入上起作用。这不是一个好的解决方案

这应该是正确的答案,因为它不会干扰其他输入键侦听器。 Bootstrap 标签之类的输入:bootstrap-tagsinput.github.io/bootstrap-tagsinput/examples

我选择了这个解决方案,因为它甚至不是我必须添加的一整行代码。所有的事情都是平等的,简短的答案更好。

下面是一个更简单的解决方案:stackoverflow.com/questions/895171/…

答3:

huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。

W3C HTML5 规范的 Section 4.10.22.2 Implicit submission 说:

表单元素的默认按钮是树形顺序中的第一个提交按钮,其表单所有者是该表单元素。如果用户代理支持让用户隐式提交表单(例如,在某些平台上,当文本字段聚焦时,按下“enter”键会隐式提交表单),那么对于默认按钮已定义激活的表单执行此操作行为必须导致用户代理在该默认按钮上运行合成点击激活步骤。注意:因此,如果禁用默认按钮,则在使用这种隐式提交机制时不会提交表单。 (按钮在禁用时没有激活行为。)

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


  
  

  

  Submit


这种方法的一个很好的特点是它可以在没有 JavaScript 的情况下工作。无论是否启用 JavaScript,都需要符合标准的 Web 浏览器来防止隐式提交表单。

一方面,它很简单,可以防止接受的答案提出的所有陷阱。另一方面,这感觉像是对标准的轻微利用。感谢包含 aria-* 属性。我很想听到更多关于此的反馈。

也可用作 ,您可以将页面大小减小几个字符。 :-P

IE 11 无论如何都会提交。

这在 Safari 上不起作用,其他浏览器似乎还可以

Safari 是新的 IE。

答4:

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

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

    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(); }
    });

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

您可以链接最后 3 个选择器,也可以使用 $("#search").bind('keypress keyup keydown',preventSubmit) 之类的一种方法绑定多个事件;

因为在 ASP.NET Web 表单中,所有内容都必须嵌套在 标记中,因此输入键 将 提交表单...此解决方案禁用了输入键并修复了问题,谢谢@戴夫!然后我通过 id 为某些字段启用了 enter 键。

@Upgradingdave你怎么能写“log()”而不是“console.log()”?

@radbyx ...很好,应该是console.log,我更新了我的答案。

请注意,使用 keypress keyup keydown 您会触发 if 条件中的任何代码两次。

答5:

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

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



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

在 Chrome 中为我工作,这也会禁用提交按钮,如果你想在提交按钮本身上触发 onlick 事件,这很好。 Ajax 提示:在 return 之前添加你的函数调用,用户仍然可以在不提交表单到页面的情况下按 enter 键。

在 Chrome、IE-11 和 Firefox 上为我工作,是实现的最简单的解决方案。正如一些答案所做的那样,在页面的整个部分禁用回车键似乎过于极端并且容易出现错误。

答6:

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

利用:

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

此解决方案适用于网站上的所有表单(也适用于使用 Ajax 插入的表单),仅防止输入文本中的 Enter。把它放在一个文件准备功能中,一辈子忘记这个问题。

huntsbot.com – 程序员副业首选,一站式外包任务、远程工作、创意产品分享订阅平台。

我认为原始答案 e.which 很好;无需将其更改为 e.keyCode。两者都为回车键返回值 13。请参阅 stackoverflow.com/a/4471635/292060 和 stackoverflow.com/a/18184976/292060

该解决方案涉及两个解决方案:1.)不要在输入时提交表单 2.)允许在 textareas 中输入

答7:

huntsbot.com – 高效赚钱,自由工作

您可以保留表单并添加一些额外的客户端验证,而不是阻止用户按 Enter 键,这可能看起来不自然告诉需要完成什么才能完成表格。如果您使用的是 jQuery,请尝试 Validation 插件:

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

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

这听起来不错,但可选字段有问题,用户可能会误按 Enter 并提交表单。除非您按要求填写每个字段(没有默认选项,不允许空白字段...),否则我不知道您将如何知道调查何时未完成

答8:

HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com

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

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

+1 我正在寻找一个 jQuery 替代品,而不是使用像 var key = event.keyCode || event.which; if (key == 13) return false; 这样的普通 JS

从技术上讲,这仍然是 POJ,只是带有一个更简单的 jquery 包装器。你给出的代码几乎是一样的。

答9:

huntsbot.com – 程序员副业首选,一站式外包任务、远程工作、创意产品分享订阅平台。

完全不同的方法:

表单中的第一个 将在按下 Enter 时激活。即使使用 style="display:none; 隐藏按钮也是如此;该按钮的脚本可以返回 false,这会中止提交过程。您仍然可以使用另一个 来提交表单。只需返回true 级联提交。在真正的提交按钮集中时按 Enter 将激活真正的提交按钮。在 或其他表单控件中按 Enter 将正常运行。在 表单控件中按 Enter 将触发第一个 < button type=submit>,它返回 false,因此什么也没有发生。

因此:

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

嗯,在 Chrome 和 Firefox 中,更短的版本是 ,它还有一个优点是不需要 JS 工作。 Safari 只是忽略该按钮,因此其他事情会照常发生。

我真的不喜欢“忽略 13 键码”的方式,所以我开始想一些简单而棘手的方式,这个想法浮现在我的脑海,当我向下滚动这个页面时,我看到了这个线程:)。加上一个共同的想法,当然是最好的解决方案。

对我来说完美的答案。我想要一个模拟 CLI 的表单,这样用户就可以为每个下一个字段按 Enter,然后在最后提交。

哦,太棒了,最后一个按钮可以这样,以防止快速点击时重复提交:<button onclick="this.disabled=true;this.form.submit();" type="submit"">submit</button>

@ArashMoosapour 如果提交按钮有焦点,请不要禁用它们 - 这样做会降低焦点并且对可访问性来说是一团糟。

答10:

打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!

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

接受的答案是好的,但它并没有停止在小键盘输入上提交。至少在当前版本的 Chrome 中。我必须将键码条件更改为此,然后它才能工作。

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

Enter 和 Return 之间的区别 - 许多销售点操作员专门使用数字键盘。 +1

现在(05-21-2015),对于普通输入和小键盘输入,keyCode 是 13 [Chrome 42,IE 11,FIreFox 36]

答11:

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

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

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

原文链接:https://www.huntsbot.com/qa/98k5/prevent-users-from-submitting-a-form-by-hitting-enter?lang=zh_CN&from=csdn

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

猜你喜欢

转载自blog.csdn.net/kalman2019/article/details/128732232