Javascript 停止输入/返回键提交表单
我有一张表格里的桌子。该表包含一些表单字段,但表外也有表单字段(但仍在表单内) 我知道传统上使用Enter和Return通过键盘提交表单,但我想停止表中字段的这种行为。例如,如果我聚焦表中的一个字段并点击Enter/Return,则什么也不会发生。如果我将焦点放在表外(但仍在表单内)的一个字段上,则它将正常提交 我有一个针对这个表的jQuery插件。简而言之,这就是我迄今为止所尝试的:Javascript 停止输入/返回键提交表单,javascript,jquery,forms,keyboard-events,jquery-events,Javascript,Jquery,Forms,Keyboard Events,Jquery Events,我有一张表格里的桌子。该表包含一些表单字段,但表外也有表单字段(但仍在表单内) 我知道传统上使用Enter和Return通过键盘提交表单,但我想停止表中字段的这种行为。例如,如果我聚焦表中的一个字段并点击Enter/Return,则什么也不会发生。如果我将焦点放在表外(但仍在表单内)的一个字段上,则它将正常提交 我有一个针对这个表的jQuery插件。简而言之,这就是我迄今为止所尝试的: base.on('keydown', function(e) { if (e.keyCode == 1
base.on('keydown', function(e) {
if (e.keyCode == 13) {
e.stopPropagation();
return false;
}
});
其中base
是表jQuery对象。这在我的插件的init
方法中。但是,按Enter键仍会提交表单
我哪里做错了
编辑:一些简化的HTML:
<form method="" action="">
<input type="text" /><!--this should still submit on Enter-->
<table>
<tbody>
<tr>
<td>
<input type="text" /><!--this should NOT submit on Enter-->
</td>
</tr>
</tbody>
</table>
</form>
e.preventDefault()
而不是e.stopPropagation()
。StopperPagation只会阻止它冒泡到更高的DOM节点,它不会阻止默认操作。我猜表单元素会触发提交事件,它不会在表中冒泡到表单上,请尝试以下说明:
$('input, select, textarea', base).on('keydown', function(e) {
if (e.keyCode == 13) {
return false;
}
});
请注意,我们还为选择器提供了上下文,因此此向下键将只在表中的元素(根据需要修改)上出现
正如gordan在另一篇评论中所说,return false同时执行.preventDefault()
和.stopPropagation()
或仅用于输入:
$(':input', base).keypress(function(e) {
var code = e.keyCode || e.which;
if(code == 13)
return false;
});
我发现这个Q/A试图整理出一个类似的情况,我有多个表单,但输入并不能满足我的需要。在我的具体案例中,我会动态添加一个新的
D1、D2、D3等,每个新的div都有一个表单,可以从创建它的同一个php代码中重新加载该div,也可以使用POST
第一个问题是我无法用每个div动态创建一个新函数,所以我将D1等描述符作为参数传递给Javascript函数:
<script type="text/javascript">
function formSubmit ( divid ) {
// post data
event.preventDefault();
$.post( "make-my-form-div.php",
$("#form"+divid).serialize(),
function(data){
$("#"+divid).html(data);
});
return false;
}
</script>
函数formSubmit(divid){
//发布数据
event.preventDefault();
$.post(“make-my-form-div.php”,
$(“#form”+divid).serialize(),
功能(数据){
$(“#”+divid).html(数据);
});
返回false;
}
您将看到必需的事件.preventDefault()
和返回false代码>用于此线程中的答案。这对我不起作用。如果我在任何一个表单中单击Submit,则该div将重新加载正确的数据。按enter键将导致默认操作并重新加载整个页面,只剩下1个div
:我需要不同表单的唯一ID和名称。起初,他们是,这对我来说很有效
$("input[type='text']").on('keypress', function(e) { return e.keyCode != 13; });
只需将下面的代码放在模板文件或页面标题中
<script type="text/javascript">
function stopRKey(evt) {
var evt = (evt) ? evt : ((event) ? event : null);
var node = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
if ((evt.keyCode == 13) && (node.type=="text")) {return false;}
}
document.onkeypress = stopRKey;
</script>
功能停止键(evt){
var evt=(evt)?evt:((事件)?事件:空);
var节点=(evt.target)?evt.target:((evt.srcement)?evt.srcement:null);
if((evt.keyCode==13)和(&&(node.type==“text”){return false;}
}
document.onkeypress=stopRKey;
的可能重复项,并且您应该提到什么是base
,它看起来像一个jquery对象,但它没有遵循@gdoron的命令。这是第一个代码块之后的第一句话!“其中base
是表jQuery对象。”@MartinBean。抱歉,但是命名约定是您真正想要遵循的。抱歉这么傻。@gdoron正如我所说,JavaScript被简化了,但是base
名称来自这个插件启动:return false
两者都有……所以如果我的代码中有return false
,为什么表单仍然提交?这不是针对你个人的,但是尽管这个答案被提升了,它是错误的<代码>返回false
=e.preventDefault();e、 停止传播()我认为你也需要重新考虑你的答案,格多伦。你的目标是任何表格中的任何表格,而我只想目标是我的插件应用到的表格中的输入。请重新阅读问题。我仍然希望默认行为在我的表之外的窗体控件上工作。因此,当按下enter键时,您需要检查表中的任何元素(输入)是否处于焦点pressed@gdoron我能不能从插件开始,而不是从表单开始?例如,我不希望它应用于任何带有表的表单的输入。@gdoron我希望停止在我的插件应用于的表中提交输入,而不仅仅是表单中带有input.Perfect的任何表。他最终到达了那里。我将我的keyup
事件名称更改为keypress
,现在我拥有了所需的功能。谢谢您需要将选择器仅限于表单\表内的输入。事实上是格多隆而不是戈丹…:)这就是选择器中的第二个参数base
,其中base
是作为jQuery对象的我的表。哎呀,我的坏名字错误:P,但它仅限于表,因为base
是表对象。
<script type="text/javascript">
function stopRKey(evt) {
var evt = (evt) ? evt : ((event) ? event : null);
var node = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
if ((evt.keyCode == 13) && (node.type=="text")) {return false;}
}
document.onkeypress = stopRKey;
</script>