【问题标题】:Pressing enter on any textbox invokes my Save button click event?在任何文本框上按 enter 会调用我的保存按钮单击事件?
【发布时间】:2010-11-13 13:08:10
【问题描述】:

我有一个标准的 asp.net 网络表单,上面有多个文本框 (Autopostback=False) 和一个保存按钮。
在任何文本框中按 ENTER 会导致调用保存按钮的服务器端单击事件。如果我打破并查看调用堆栈,单击事件是唯一列出的事件。我没有为表单设置默认按钮。 如果我在保存按钮上方放置另一个按钮,那么它会在文本框上按回车键时调用其单击事件。

任何想法为什么会发生这种情况,以及如何让它停止?

【问题讨论】:

    标签: asp.net


    【解决方案1】:

    这是除文本区域之外的大多数字段的默认行为。

    要解决这个问题,您可以在提交表单之前调用 javascript 函数来检查按键。

    <script type="text/javascript">
      function allowSubmission() {
      return !(window.event && window.event.keyCode == 13); }
    </script>
    

    那么提交表单的唯一方法就是点击提交。然而,正如许多人所提到的,回车键提交表单是预期行为,因此您可以随时更改功能以对字段进行基本验证,如果已填写所有必填字段,则允许回车键提交表单。

    <script type="text/javascript">
      function allowSubmission() {
      return !(window.event && window.event.keyCode == 13) || validateInput(); }
    </script>
    

    编辑:您将在提交按钮的 OnClientClick 方法上调用此函数。比如:

    <asp:Button id="SubmitBtn" runat="server" OnClientClick="return allowSubmission()"/>
    

    【讨论】:

    • 如果我不是鼠标用户,并且想要切换到按钮并按下回车键,会发生什么?我知道我可以按空格键,但我敢打赌,我 99% 的最终用户不会考虑使用空格键...
    • 只要表单验证通过就可以。我没有写出 validateInput 函数,因为我不知道 OP 想要它做什么,但如果你填写了必填字段,检查就会通过。
    【解决方案2】:

    对于任何网络表单都是如此:如果您在输入字段具有焦点时按 Enter,则表单将被提交(textareas 除外)。为了阻止这种情况,您需要一些 JavaScript 来捕获该事件并阻止提交表单。但请注意,按 Enter 提交是许多用户的预期行为!

    【讨论】:

      【解决方案3】:

      确保您的文本框设置为多行作为 TextMode,如果没有输入键正在执行导致回发的命令按钮。

      <asp:TextBox ID="TextBox1" runat="server" TextMode="MultiLine"></asp:TextBox>
      

      如果你不希望你的文本框是多行的,你可以拦截 JavaScript 中的按键命令,当输入被按下时什么都不做。

      这是一个例子

      function hookUpToEnterKey()
      {
          // Hook up to read enter key
          document.onkeydown = processEntryKey;
      }
      
      function processEntryKey(e)
      {
      
          if( !e ) 
          {
              if( window.event ) 
              {
              //Internet Explorer
              e = window.event;
              } 
              else 
              {
              // Cannot get the even return.
              return;
              }
          }
      
          if( typeof( e.keyCode ) == 'number'  ) 
          {
              //DOM
              e = e.keyCode;
          } 
          else 
              if( typeof( e.which ) == 'number' ) 
              {
                  //NS 4 compatible
                  e = e.which;
              } 
              else 
                  if( typeof( e.charCode ) == 'number'  ) 
                  {
                      //also NS 6+, Mozilla 0.9+
                      e = e.charCode;
                  } 
                  else 
                  {
                      //total failure, we have no way of obtaining the key code
                      return;
                  }
      
            if(e == 13) 
            {
               // Do nothing
               return false;
            }
      }
      

      【讨论】:

      • 不要忘记许多人希望输入键来提交表单。您应该对控件进行客户端验证,以防止表单以未完成状态提交。
      • 你是对的。我通常不这样做,但似乎提出问题的人想要阻止 Enter 键执行任何操作。
      • 你说得对。实际上,理想情况下,我希望它执行一个选项卡。
      【解决方案4】:

      我遇到了完全相同的问题:我有一个数据绑定的网格视图、一个文本框和一个按钮。文本框用于过滤网格内容,作为搜索框。该按钮用于完全不同的操作。在放置按钮之前,在文本框上按回车键会导致网格被过滤,这是预期的行为。但是,一旦我放置按钮,在将焦点放在文本框上时按 Enter 会导致调用按钮的 onclick 事件。我只是通过将文本框的 autopostback 属性设置为 true 来修复它。我不明白为什么,但它以某种方式覆盖了文本框的表单提交行为。希望对你有帮助

      【讨论】:

      • 我在按钮 onclick 方法上打印一条消息(通过设置一些标签的 text 属性)。当我在聚焦文本框时按 Enter 键时不会显示此消息,所以不,在文本框上按 Enter 不会导致浏览器或其他任何人单击按钮
      • 我刚刚给了这个赞。我真的不同意使用这种技术,但用户描述了我的确切问题并且解决方案有效。我试图以多种方式拦截回车键,但这是唯一成功的方法。只是想我会说声谢谢。
      【解决方案5】:

      您的浏览器正试图成为一个好人并为您单击按钮,即使您没有将其设置为“默认”(它会在输入时“单击”表单中的第一个按钮)。

      就像大卫说的,如果你想让回车键在文本框中引起换行,它需要是多行的

      【讨论】:

        猜你喜欢
        • 2018-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-19
        • 1970-01-01
        • 2021-04-12
        • 1970-01-01
        相关资源
        最近更新 更多