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

982

我有一个调查网站,在用户填写问卷时,似乎存在按下回车键(原因未知)并且在没有点击提交按钮的情况下,意外提交了问卷表单的问题。是否有方法可以防止这种情况发生?

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


3
不要使用表单标签,自定义ajax请求。但是当然,你可以继续使用按键监听和预防措施,那就是我会做的事情。 - jancha
我不使用表单标签,因为我更喜欢通过非传统的方式(例如:在字段失去焦点时提交某些字段等)通过ajax请求处理表单。您还可以创建一个特殊的监听器来捕获Enter键并仅在需要时处理它。 - Juan
36个回答

6
如果您正在使用Alpine,可以使用以下内容来防止按下Enter提交表单:
<div x-data>
  <form x-on:keydown.prevent.enter="">...</form>
</div>

或者,您可以使用.window修饰符在页面的根window对象上注册事件侦听器,而不是在元素上注册。

<form>
  <div x-data>
    <input x-on:keydown.window.prevent.enter="" type="text">
  </div>
</form>

你真是个救命稻草... - undefined

5

只禁止提交而不影响其他重要的回车键功能,例如在 <textarea> 中创建新段落:

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


想知道是谁以及为什么会踩这个 :| 我的解决方案有什么问题吗? - mate.gvo
赞成您的贡献。被接受的答案会破坏大多数表单UI,防止“enter”在整个应用程序中被注册。不好。我认为允许在表单元素中处理enter键是一个好主意,特别是按钮,所以我喜欢您正在探索的路径。我认为这可以在没有超时的情况下实现。例如,在事件处理程序中查看元素属性。允许“button”和“submit”。 - png
1
第一行有一个错别字。应该是function(event)而不是function(e)。除此之外,对我来说它可以工作。谢谢。 - Guillermo Prandi
为什么 setTimeout(function() { pressedEnter = false; }, 100) 不在 event.keyCode == 13 的条件语句内? - user151496
2
这是一个绝对的救星,因为其他所有东西都阻止我正确处理像网格内联编辑这样的输入保存事件。唯一的建议是根本不要使用 'setTimeout'。我认为这就是人们对这个答案的问题所在。它太过挑剔了。相反,在事件中执行以下操作: on("keydown", function(event) { enterPressed = true; } 然后在提交事件中执行以下操作: on("submit", function(e) { if (pressedEnter == true) { pressedEnter = false; e.preventDefault(); return false;} 这将确保它可以在任何延迟下工作。 - Curtis Snowden
显示剩余2条评论

3
如果使用Vue,请使用以下代码防止用户通过按下“Enter”键提交表单:
<form @submit.prevent>...</form>

<input ... @keypress.enter.prevent /> 也可以使用(Y) - undefined

3
$(document).on("keydown","form", function(event)
{
   node = event.target.nodeName.toLowerCase();
   type = $(event.target).prop('type').toLowerCase();

   if(node!='textarea' && type!='submit' && (event.keyCode == 13 || event.keyCode == 169))
   {
        event.preventDefault();
        return false;
    }
});

它完美地工作了!


有趣的是,哪个键盘按键会触发事件键码169? - Jez

2

我觉得已经有了很好的回答,但如果您正在使用带有一些JavaScript验证代码的按钮,则可以将表单的 onkeypress 设置为按预期调用您的提交:

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

onkeypress JS可以是您需要执行的任何操作。如果不是从头开始编写应用程序,并且已被引入修复其他人的网站而不必拆开并重新测试它,则没有必要进行更大的全局更改。


我意识到这是Tom Hubbard答案的变体,我+1了它,因为这实际上是我今天在搜索其他想法之前所做的。 - dubmojo

2

我曾遇到类似问题,我的网格有“ajax文本字段”(Yii CGridView),只有一个提交按钮。每次我在文本框上进行搜索并按回车键时,表单就会被提交。因为它是视图之间唯一的共同按钮(MVC模式),所以我不得不对按钮进行修改。我所做的只是删除type="submit"并添加onclick="document.forms[0].submit()


1

这里有一个我没有看到答案的问题:当您在页面上通过元素进行制表时,当您到达提交按钮并按下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/


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>

这在我的情况下运行良好。

1
这会禁用页面上所有表单的回车键,但不会阻止在文本区域中使用回车键。
    // disable form submit with enter

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

1
进入你的CSS并添加此代码,它会自动阻止提交表单,只要你有提交输入。如果你不再需要它,可以删除它或者输入activatedeactivate
 input:disabled {
        background: gainsboro;
      }
      input[value]:disabled {
        color: whitesmoke;
      }

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