按Enter键时不提交表格

Dut*_*432 28 html javascript forms submit dom-events

我有以下HTML/JS/jQuery代码.此代码表示一个登录表单,以模态方式呈现给用户以允许他们登录.问题是,当我按Enter键时,表单似乎没有执行"onsubmit"事件.当我单击按钮作为表单的底部(其实际上与onsubmit事件具有相同的代码)时,它完美地工作.我想知道是否有人可以告诉我为什么这个表格没有提交..?任何援助将不胜感激.

显示登录模式的jQuery代码:

showDivAndFocus('loginModal','loginaccount'); 

function showDivAndFocus(v,t){

    if (api)
        if (api.isOpened)
            api.close();

    api = $('#'+v).overlay({
        mask: {color: '#000000'}, 
        top:'0px',
        api: true,
        autoScrollToActive: false,
        autoScrollOffset: 0 
    }).load();

    document.getElementById(t).focus();
}
Run Code Online (Sandbox Code Playgroud)

HTML代码

<div class="modal" id="loginModal">
    <h2>User Login</h2>
    <br />

    <form action="javascript:void(0);" onsubmit="return(doLogin());"  name="loginForm" id="loginForm">
        <table width="95%" cellpadding="4" cellspacing="4">
        <tr>
        <td class="regw" align="left"><b>Account Number:</b></td>
        <td class="regw" align="left"><input type="text" maxlength="10" size="10" name="loginaccount" id="loginaccount" /></td>
        </tr>

        <tr>
        <td class="regw" align="left"><b>Username:</b></td>
        <td class="regw" align="left"><input type="text" maxlength="20" size="20" name="loginusername" id="loginusername" /></td>
        </tr>

        <tr>
        <td class="regw" align="left"><b>Password:</b></td>
        <td class="regw" align="left"><input type="password" maxlength="20" size="20" name="loginpassword" id="loginpassword" /></td>
        </tr>  

        <tr>
        <td class="regw" align="left"><b>Remember Me:</b></td>
        <td class="regw" align="left"><input type="checkbox" name="loginremember" id="loginremember" /></td>
        </tr>  

        <tr><td colspan="2">
            <div>  
                <center>
                    <table><tr><td width="50" valign="middle">
                        <div id="loginLoading" style="height:24px;width:24px;"></div>   
                    </td><td>
                        <button onclick="doLogin();" type="button" class="ok">Submit</button>
                    </td><td>
                        <button onclick="api.close();" type="button" class="cancel">Cancel</button>
                    </td><td width="50">&nbsp;</td></tr></table>
                </center>
            </div>
        </td></tr> 
        </table>
    </form>
</div>
Run Code Online (Sandbox Code Playgroud)

AJAX呼叫

function doLogin(){
    var ajax = getXmlObject();
    var f = getFormVariables();
    var url= '/login.php?f=' + encodeURIComponent(f);
    if (ajax.readyState == 4 || ajax.readyState == 0) {
        ajax.open("POST", url, true);
        ajax.onreadystatechange = function () {
            if (ajax.readyState == 4) {
                var a = ajax.responseText;
                if (a=="OK"){...} else {...}
            }
        };
        ajax.send(null);
      }
      return false;
 }
Run Code Online (Sandbox Code Playgroud)

Aar*_*ine 33

我在同样的问题上苦苦挣扎; 我的一个表单是在文本字段中按"输入"时提交没有问题; 对于我的生活,在同一页面上的另一个类似的表格根本不会提交.

这两个字段都没有提交按钮,也没有使用javascript进行任何提交.

我发现,就是当只有在形式的单个文本字段,在文本框中会自动提交按下"ENTER"键; 但如果有多个(常规(即单行)文本输入)字段,它什么都不做,除非还有某种"提交"按钮.

显然,这是HTML 2.0规范的一部分:

如果表单中只有一个单行文本输入字段,则用户代理应接受该字段中的Enter作为提交表单的请求.

这是一个陈旧但显然仍然有效且有趣的进一步讨论.

...显然是一种提交简单查询的便捷方式,但是在复杂的形式上降低风险,在尝试填写它时过早地提交它.许多浏览器实现者(例如Netscape,Opera,各种版本的Lynx,. ..)遵循这个建议,虽然似乎有不同的解释.

我做了一个JSFiddle来演示.据我所知(懒惰只是用Chrome测试),如果只有一个文本字段,或者如果有一个提交按钮,表单将在"Enter"上提交,即使它是隐藏的.

(编辑:我后来发现,如果有其他输入字段不是常规的单行文本输入,例如textareas,选择等,它似乎也有效 - 感谢@ user3292788获取该信息.更新了JSFiddle来反映这一点).

<h2>Form with one text field only, no submit button</h2>
<p>Seems to submit automatically when pressing 'enter' in the first text field</p>
<form action="" method="post">
  <div>
    <label for="pt-search-input">Search</label>
    <div>
      <input name="term" type="text" placeholder="Example: budapest amsterdam" /> <a href="#pt-search-bar">cancel</a></div>
  </div>
</form>

<h2>Form with two text fields, no submit button</h2>
<p>Won't submit when pressing 'enter' in the forms ...</p>
<form action="" method="post">
  <div>
    <label for="pt-search-input">Search</label>
    <div>
      <input name="term" type="text" placeholder="Example: budapest amsterdam" />
      <input name="term2" type="text" placeholder="Example: budapest amsterdam" /> <a href="#pt-search-bar">cancel</a></div>
  </div>
</form>



<h2>Form with two text fields and a submit button ...</h2>
<p>Now it submits with 'enter' key</p>
<form action="" method="post">
  <div>
    <label for="pt-search-input">Search</label>
    <div>
      <input name="term" type="text" placeholder="Example: budapest amsterdam" />
      <input name="term2" type="text" placeholder="Example: budapest amsterdam" /> <a href="#pt-search-bar">cancel</a>
      <input type="submit" />
    </div>
  </div>
</form>

<h2>Form with two text fields and a HIDDEN submit button ...</h2>
<p>Seems to work, even with submit hidden ...</p>
<form action="" method="post">
  <div>
    <label for="pt-search-input">Search</label>
    <div>
      <input name="term" type="text" placeholder="Example: budapest amsterdam" />
      <input name="term2" type="text" placeholder="Example: budapest amsterdam" /> <a href="#pt-search-bar">cancel</a>
      <input type="submit" />
    </div>
  </div>
</form>


<h2>Form with no action or method attribute, HIDDEN submit button ...</h2>
<p>Even this seems to work.</p>
<form>
  <div>
    <label for="search-input">Search</label>
    <div>
      <input name="term" type="text" placeholder="Example: budapest amsterdam" />
      <input name="term2" type="text" placeholder="Example: budapest amsterdam" /> <a href="#pt-search-bar">cancel</a>
      <input type="submit" />
    </div>
  </div>
</form>

<h2>Form with multiple fields, but only one text input, no submit button.</h2>
<p>This seems to work as well.</p>
<form action="" method="post">

  <p><input type="text" ></p>

  <textarea name="" id="" cols="30" rows="10"></textarea>

  <p>
    <select name="" id="">
      <option value="">Value</option>
    </select>
   </p>
</form>
Run Code Online (Sandbox Code Playgroud)

  • 我认为您错过了**单行文本输入字段**精度。如果其他字段不是_如上所述_单行文本输入字段,则即使提交的表单也包含多个字段。您可以快速查看[JSFiddle](https://jsfiddle.net/9L4oxrg2/)。顺便说一句,你的答案是正确的,帮助我解决了我的问题。 (2认同)

g.d*_*d.c 30

你有两个选择:

  1. 为enter按钮创建一个事件处理程序,并将其添加到绑定中.
  2. <input type=submit>在某处使用表单,这是获得您所追求的自动Enter键行为的原因.

  • 只是注意:如果表单没有提交按钮(`<input type ="submit"/>`或`<button type ="submit"> </ button>`)[它只会自动提交在输入时输入一个文本](http://www.alanflavell.org.uk/www/formquestion.html).表单*带*提交按钮*应该在输入时提交,无论文本输入的数量是多少(虽然现在我的形式上没有发生这种情况,我不知道为什么).此外,如果你的`<button>`元素没有`type`,它将在旧版本的IE中充当提交按钮. (10认同)
  • 我会选择`<input type = submit>`因为它在语义上更正确. (3认同)
  • @Dutchie432 - 据我所知(如果我弄错了,我希望有人纠正我)您在另一个表单上的行为要么是错误的,要么以某种方式将焦点转移到您之前的一个提交按钮上按回车键。HTML 表单只能在使用 `&lt;input type=submit&gt;` 时通过 Enter 键提交。但是,如果您实际上专注于某个按钮,则回车键可能会为您“单击”它。 (2认同)
  • 澄清@Pauld'Aoust 发表的评论 - `[Enter]` 仅在*只有*一个文本输入时才有效,而不是一个或多个。 (2认同)

DCo*_*oll 5

它也可以来自javascript绑定到<button>表单中的。例如,如果您有

<button id='button'>Reset</button>
<span id="textToReset">some info</span>

<script type="text/javascript">
$('#button').bind('click', function(){  
    $('#textToReset').text('');     
    return false;
})
</script>
Run Code Online (Sandbox Code Playgroud)

您的Enter按钮将被捕获,return false并且您的表单不会在Enter键下提交。正确的方法是将<button>ACT 指定为按钮。这条路 :

<button id='button' type="button">Reset</button>
Run Code Online (Sandbox Code Playgroud)

并将return false您放置在此处的按钮拖放到该按钮上,以防止该按钮提交表单。;-)

为了学习,<button>默认情况下,类型为Submit。如果希望它们充当表单的控件,则必须指定type="button"type="reset" 参阅w3.org


yab*_*aba 5

以防万一有人犯了和我一样的错误,也来这里寻找答案:

如果您的表单中有两个(或多个)提交按钮1,则按 Enter 键只会触发第一个提交,而不会触发第二个提交。


1正如 @paul-daoust 在他对 @gddc 的答案的评论中所指出的:两者<input type=submit><button type=submit>将用作提交按钮