通过点击Enter阻止用户提交表单
我在一个网站上有一个调查,似乎有一些问题与用户点击进入(我不知道为什么),并意外提交调查(表单),而不点击提交button。 有没有办法来防止这一点?
我在调查中使用HTML,PHP 5.2.9和jQuery。
您可以使用诸如
$(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; } }); });
禁止在任何地方input密钥
如果您的表单中没有<textarea>
,则只需将以下内容添加到<form>
:
<form ... onkeypress="return event.keyCode != 13;">
或者用jQuery:
$(document).on("keypress", "form", function(event) { return event.keyCode != 13; });
这将导致表单中的每个按键都将在keyCode上进行检查。 如果它不是13(Enter键),那么它将返回true,任何事情都会如预期的那样发生。 如果是13(回车键),那么它将返回false,任何东西都会立即停止,所以表单将不会被提交。
keypress
事件比keydown
更keydown
因为只有在实际插入字符时才会触发该事件。 当任何按键被按下时(包括控制键), keydown
(和keyup
)都会被触发。 而且, keypress
的keyCode
表示正在插入的实际字符,而不是所使用的物理键。 这样你就不需要明确地检查Numpad Enter键(108)是否被按下了。 keyup
表单提交已经太晚了,无法阻止表单提交。
请注意$(window)
build议在其他答案而不是$(document)
不适用于IE <= 8的keydown
/ keypress
/ keyup
,所以这不是一个好的select,如果你想覆盖那些不好的用户以及。
只允许在textareas上input密钥
如果你的表单中有一个<textarea>
(这当然应该接受回车键),那么将keypress处理程序添加到不是<textarea>
每个单独的input元素。
<input ... onkeypress="return event.keyCode != 13;"> <select ... onkeypress="return event.keyCode != 13;"> ...
为了减less样板,最好用jQuery来完成:
$(document).on("keypress", ":input:not(textarea)", function(event) { return event.keyCode != 13; });
如果在这些input元素上附加了其他的事件处理函数,那么您也需要在某些原因上input键,那么只能防止事件的默认行为,而不是返回false,以便能正确传播给其他处理程序。
$(document).on("keypress", ":input:not(textarea)", function(event) { if (event.keyCode == 13) { event.preventDefault(); } });
允许在textareas上input密钥并仅提交button
如果你想允许按下提交button<input|button type="submit">
,那么你总是可以细化select器如下。
$(document).on("keypress", ":input:not(textarea):not([type=submit])", function(event) { // ... });
请注意,在某些其他答案中build议的input[type=text]
不包括那些HTML5非文本input,所以这不是一个好的select器。
我必须捕获与按键相关的所有三个事件,以防止表单被提交:
var preventSubmit = function(event) { if(event.keyCode == 13) { 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(); } });
如果您使用脚本来执行实际的提交,那么您可以将“return false”行添加到onsubmit处理程序,如下所示:
<form onsubmit="return false;">
从JavaScript调用submit()将不会触发事件。
使用:
$(document).on('keyup keypress', 'form input[type="text"]', function(e) { if(e.keyCode == 13) { e.preventDefault(); return false; } });
此解决scheme适用于网站上的所有表单(也包含使用Ajax插入的表单),只在input文本中防止input。 把它放在一个文件准备好的function,忘记这个问题的生活。
而不是阻止用户按回车 ,这可能看起来不自然,你可以保持原样,并添加一些额外的客户端validation:当调查没有完成,结果不会发送到服务器,用户得到一个不错的消息告诉需要完成的表格。 如果您使用jQuery,请尝试validation插件:
http://docs.jquery.com/Plugins/Validation
这将需要比捕捉inputbutton更多的工作,但它肯定会提供更丰富的用户体验。
我不能commet,所以我会发布一个新的答案
接受的答案是好的,但它并没有停止提交数字键盘input。 至less在当前版本的Chrome中。 我不得不改变这个键码的条件,然后它的工作。
if(event.keyCode == 13 || event.keyCode == 169) {...}
一个不错的简单的小jQuery解决scheme:
$("form").bind("keypress", function (e) { if (e.keyCode == 13) { return false; } });
给表单一个“javascript:void(0)”的动作 似乎在做伎俩
<form action="javascript:void(0);"> <input type="text" /> </form> <script> $(document).ready(function() { $(window).keydown(function(event){ if(event.keyCode == 13) { alert('Hello'); } }); }); </script>
我只需要防止提交特定的input,所以我使用了一个类select器,让它成为我所需要的“全局”特性。
<input id="txtEmail" name="txtEmail" class="idNoEnter" .... />
而这个jQuery代码:
$('.idNoEnter').keydown(function (e) { if (e.keyCode == 13) { e.preventDefault(); } });
或者,如果keydown不够:
$('.idNoEnter').on('keypress keydown keyup', function (e) { if (e.keyCode == 13) { e.preventDefault(); } });
一些说明:
在这里修改各种好的答案, 回车键似乎在所有的浏览器keydown
工作。 另外,我更新了bind()
on()
方法。
我是选课人员的忠实粉丝,对所有的利弊和performance进行讨论。 我的命名约定是'idSomething'来表明jQuery使用它作为一个id,从CSS样式分离它。
您可以使用JavaScript方法检查Enter键是否被击中,如果是,则停止提交。
<script type="text/javascript"> function noenter() { return !(window.event && window.event.keyCode == 13); } </script>
只需在提交方法上调用它即可。
我有一个类似的问题,我有一个“ajax textfields”(Yii CGridView)和一个提交button的网格。 每次我在一个文本字段上进行search,然后点击input提交的表单。 我不得不做一些button,因为它是视图之间唯一的常用button(MVC模式)。 我所要做的就是删除type="submit"
并把onclick="document.forms[0].submit()
我认为它已经覆盖了所有的答案,但是如果你正在使用带有一些JavaScriptvalidation代码的button,你可以设置表单的onkeypress作为回车来调用你的提交如期:
<form method="POST" action="..." onkeypress="if(event.keyCode == 13) mySubmitFunction(this); return false;">
JS的onkeypress可以是你需要做的任何事情。 没有必要进行更大规模的全球变革。 如果您不是从头开始编写应用程序的人,那么这种情况尤其如此,并且您已经被引入修复其他人的网站,而不会将其拆分并重新testing。
一个完全不同的方法:
- 按下Enter键 ,表格中的第一个
<button type="submit">
将被激活。 - 即使该button被隐藏,
style="display:none;
- 该button的脚本可以返回
false
,从而中止提交过程。 - 你仍然可以有另一个
<button type=submit>
来提交表单。 只要返回到级联提交。 - 在真正的提交button被聚焦时按Enter键将激活实际的提交button。
- 按
<textarea>
Enter<textarea>
里面的<textarea>
或其他窗体控件将performance正常。 - 按下
<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>
达到目标是我的解决scheme,干净有效。
$('form').submit(function () { if ($(document.activeElement).attr('type') == 'submit') return true; else return false; });
- 不要使用type =“submit”作为input或button。
- 使用type =“button”并使用js [jquery / angular / etc]将表单提交给服务器。
在我的具体情况下,我不得不提交表单,并模拟点击提交button。 这是因为提交button上有一个点击处理程序,因为我们在一个模式窗口(inheritance旧代码)。 无论如何,这里是我的这个案例的组合解决scheme。
$('input,select').keypress(function(event) { // detect ENTER key if (event.keyCode == 13) { // simulate submit button click $("#btn-submit").click(); // stop form from submitting via ENTER key press event.preventDefault ? event.preventDefault() : event.returnValue = false; } });
这个用例对使用IE8的人特别有用。
这对我有用
jQuery.each($("#your_form_id").find('input'), function(){ $(this).bind('keypress keydown keyup', function(e){ if(e.keyCode == 13) { e.preventDefault(); } }); });
一个简单而优雅的方法是:
创build一个validate
函数,返回true或false(使用你的业务逻辑),并将这段代码添加到脚本中:
$(function() { $('your form selector').submit(function() { return validate(); }); });
在其他解决scheme受挫之后,这在所有浏览器中都适用。 name_space外部函数只是为了远离声明全局variables,我也build议。
$(function() {window.name_space = new name_space();}); //jquery doc ready function name_space() { this.is_ie = (navigator.userAgent.indexOf("MSIE") !== -1); this.stifle = function(event) { event.cancelBubble; event.returnValue = false; if(this.is_ie === false) { event.preventDefault(); } return false; } this.on_enter = function(func) { function catch_key(e) { var enter = 13; if(!e) { var e = event; } keynum = GetKeyNum(e); if (keynum === enter) { if(func !== undefined && func !== null) { func(); } return name_space.stifle(e); } return true; // submit } if (window.Event) { window.captureEvents(Event.KEYDOWN); window.onkeydown = catch_key; } else { document.onkeydown = catch_key; } if(name_space.is_ie === false) { document.onkeypress = catch_key; } } }
样品使用:
$(function() { name_space.on_enter( function () {alert('hola!');} ); });
在这里我还没有看到回答:当你浏览页面上的元素时,当你到达提交button时,按下Enter键将触发表单上的onsubmit处理程序,但是它会将事件logging为MouseEvent。 这里是我简要的解决scheme来覆盖大多数基地:
这不是一个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(); }
find一个工作的例子: https : //jsfiddle.net/nemesarial/6rhogva2/
我想添加一个小小的CoffeeScript代码(未经过现场testing):
$ -> $(window).bind 'keypress', (event) -> if event.keyCode == 13 unless {'TEXTAREA', 'SELECT'}[event.originalEvent.srcElement.tagName] event.preventDefault()
(我希望你喜欢在除外条款中的好戏。)
使用:
// Validate your form using the jQuery onsubmit function... It'll really work... $(document).ready(function(){ $(#form).submit(e){ e.preventDefault(); if(validation()) document.form1.submit(); }); }); function validation() { // Your form checking goes here. } <form id='form1' method='POST' action=''> // Your form data </form>
不要把提交button可以做。 只要将脚本放入input(type = button)或添加eventListener(如果您希望它提交表单中的数据)。
而是使用这个
<input type="button">
比使用这个
<input type="submit">
在我的情况下,我有一个窗体中的几个jQuery UI自动填充字段和textareas,所以我一定要他们接受回车 。 因此,我从表单中删除了type="submit"
input,并添加了一个锚点<a href="" id="btn">Ok</a>
。 然后我把它作为一个button,并添加下面的代码:
$( '#btn' ).click( function( event ){ event.preventDefault(); if ( validateData() ){ $( 'form#frm' ).append( '<input type="submit" id="frm-submit" style="display:none;"></input>' ); setTimeout( function(){ $( '#frm-submit' ).click(); }, 500 ); } return false; });
如果用户填写所有必填字段,则validateData()
成功并提交表单。