我有一个有两个按钮的页面。一个是<button>元素,另一个是<input type="submit">元素。按钮按此顺序出现在页面上。如果我在表单中的任何一个文本字段中,并按下<Enter>,则会触发按钮元素的单击事件。我认为这是因为button元素放在前面。

我找不到任何看起来可靠的方法来设置默认按钮,我也不想在这一点上。在没有更好的东西的情况下,我已经捕获了窗体上的任何地方的一个按键,如果它是<Enter>键被按下,我只是否定它:

$('form').keypress( function( e ) {
  var code = e.keyCode || e.which;

  if( code === 13 ) {
    e.preventDefault();
    return false; 
  }
})

据我所知,到目前为止,它似乎是有效的,但感觉难以置信的笨拙。

有人知道更复杂的方法吗?

同样,这个解决方案是否存在我没有意识到的陷阱?

谢谢。


当前回答

您可以使用javascript阻止表单提交,直到适当的时间。举个简单的例子:

<form onsubmit='return false;' id='frmNoEnterSubmit' action="index.html">

    <input type='text' name='txtTest' />

    <input type='button' value='Submit' 
        onclick='document.forms["frmNoEnterSubmit"].onsubmit=""; document.forms["frmNoEnterSubmit"].submit();' />

</form>

按enter键仍然会触发表单提交,但javascript会阻止它实际提交,直到您实际按下按钮。

其他回答

我会像下面这样做:在处理按钮的onclick事件(不提交)检查事件对象的键码。如果是回车,我会返回false。

Dom示例

  <button onclick="anotherFoo()"> Add new row</button>
  <input type="text" name="xxx" onclick="foo(event)">

javascript

function foo(event){
   if(event.which == 13 || event.keyCode == 13) // for crossbrowser
   {
     event.preventDefault(); // this code prevents other buttons triggers use this
     // do stuff
   }
}

function anotherFoo(){
  // stuffs.
}

如果你不使用preventDefault(),其他按钮将被触发。

使用

<button type="button">Whatever</button>

应该能行。

原因是表单中的按钮隐式地设置了提交类型。正如zzzzBoz所说,Spec说在这种情况下触发的是第一个带有type="submit"的按钮或输入。如果你特别设置了type="button",那么它将从浏览器的考虑中删除。

通过在聚焦<input type="text">上按“Enter”,你在第一个定位的元素上触发“click”事件:<button>或<input type="submit">。如果你在<textarea>中按“Enter”,你只是创建了一个新的文本行。

请看这里的例子。

你的代码阻止在<textarea>中创建一个新的文本行,所以你必须捕捉键按下<input type="text">。

但是为什么需要在文本框中按Enter呢?如果你想通过按“Enter”来提交表单,但<按钮>必须保持在布局中的第一个位置,只需使用标记:将<input type="submit">代码放在<按钮>之前,并使用CSS保存你需要的布局。

捕获'Enter'并保存标记:

$('input[type="text"]').keypress(function (e) {
    var code = e.keyCode || e.which;
    if (code === 13) {
        e.preventDefault();
        // also submit by pressing Enter:
        $("form").submit();
    }
});

默认情况下,在表单的文本字段中按enter键将提交表单。如果您不希望它以这种方式工作,您必须捕获回车键并像您所做的那样使用它。这是没有办法的。即使表单中没有按钮,它也会以这种方式工作。