Javascript 停止输入/返回键提交表单

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

我有一张表格里的桌子。该表包含一些表单字段,但表外也有表单字段(但仍在表单内)

我知道传统上使用Enter和Return通过键盘提交表单,但我想停止表中字段的这种行为。例如,如果我聚焦表中的一个字段并点击Enter/Return,则什么也不会发生。如果我将焦点放在表外(但仍在表单内)的一个字段上,则它将正常提交

我有一个针对这个表的jQuery插件。简而言之,这就是我迄今为止所尝试的:

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、 停止传播()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>