我有一个调查网站,在用户填写问卷时,似乎存在按下回车键(原因未知)并且在没有点击提交按钮的情况下,意外提交了问卷表单的问题。是否有方法可以防止这种情况发生?
我在调查中使用HTML、PHP 5.2.9和jQuery。
我有一个调查网站,在用户填写问卷时,似乎存在按下回车键(原因未知)并且在没有点击提交按钮的情况下,意外提交了问卷表单的问题。是否有方法可以防止这种情况发生?
我在调查中使用HTML、PHP 5.2.9和jQuery。
你可以使用类似于的方法
$(document).ready(function() {
$(window).keydown(function(event){
if(event.keyCode == 13) {
event.preventDefault();
return false;
}
});
});
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;
}
});
});
keydown
事件绑定到document
上,而非window
,才能使其正常工作。 - MartinHN&& !$(document.activeElement).is('textarea')
,否则文本框内的换行符会被阻止(至少在IE浏览器中是这样)。 - Flash如果你的表单中没有 <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)
来处理 keydown
/keyup
,但在 IE<=8 中这样做无效,因此如果您也想覆盖这些用户,则不是一个好选择。
W3C HTML5规范的第4.10.22.2节隐式提交指出:
form
元素的默认按钮是该form
元素拥有者为该form
元素的提交按钮中,在树顺序中的第一个。如果用户代理支持让用户隐式提交表单(例如,在某些平台上,当文本字段聚焦时按“Enter”键会隐式提交表单),那么对于具有已定义激活行为的默认按钮的表单进行隐式提交必须导致用户代理在运行合成点击激活步骤上对该默认按钮进行操作。
因此,一种符合标准的方法是在表单中放置一个已禁用的提交按钮作为第一个提交按钮,以禁用任何隐式提交表单的功能:
<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 是否启用,都需要符合标准的网络浏览器来防止隐式表单提交。
<input type="submit" disabled style="display: none" aria-hidden="true" />
,这样可以减少页面大小几个字符。 :-P - new name:
<form onsubmit="return false;">
为了防止表单被提交,我必须捕获与按键相关的三个事件:
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(); }
});
$("#search").bind('keypress keyup keydown',preventSubmit)
; - Moak<form>
标签中,所以回车键将提交表单...这个解决方案禁用了回车键并解决了问题,感谢@Dave!然后我通过id
启用了某些字段的回车键。 - Ian Campbellconsole.log
,我已经更新了我的答案。 - Upgradingdavekeypress keyup keydown
会触发 if 条件中的任何代码 两次。 - Avatar使用:
$(document).on('keyup keypress', 'form input[type="text"]', function(e) {
if(e.keyCode == 13) {
e.preventDefault();
return false;
}
});
这个解决方案适用于网站上的所有表单(包括通过Ajax插入的表单),只是防止在输入文本框中按下 Enter 键。将它放在一个文档就绪函数中,然后忘掉这个问题一辈子。
e.which
很好,不需要更改为 e.keyCode
。两者都返回回车键的值 13。请参见 https://dev59.com/o2855IYBdhLWcg3wNhd1#4471635 和 https://dev59.com/OXXYa4cB1Zd3GeqP7o96#18184976。 - goodeye我还不能评论,所以我会发表一个新回答。
被接受的答案还可以,但它无法在数字键盘输入中停止提交。至少在当前版本的Chrome中是如此。我不得不改变按键代码条件,然后它就能正常工作。
if(event.keyCode == 13 || event.keyCode == 169) {...}
与其阻止用户按下 Enter,这可能看起来很不自然,你可以保持表单不变并添加一些额外的客户端验证:当调查未完成时,结果不会发送到服务器,用户会收到一个好消息,告诉他们需要完成什么才能完成表单。如果您正在使用jQuery,请尝试使用Validation插件:
http://docs.jquery.com/Plugins/Validation
这将需要比捕获 Enter 按钮更多的工作,但肯定会提供更丰富的用户体验。
一个简单好用的jQuery解决方案:
$("form").bind("keypress", function (e) {
if (e.keyCode == 13) {
return false;
}
});
var key = event.keyCode || event.which; if (key == 13) return false;
。 - RaphaelDDL完全不同的方法:
<button type="submit">
将会在按下 Enter 键时被激活。style="display:none;
属性,也是如此。false
,以中止提交过程。<button type=submit>
提交表单。只需返回 true
即可级联提交。<textarea>
或其他表单控件内按下 Enter 将会按照正常方式执行。<input>
表单控件内按下 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>
<button onclick="this.disabled=true;this.form.submit();" type="submit"">提交</button>
。 - Arash