【问题标题】:onsubmit="return false" has no effect on Internet Explorer 7/8 (form is still submitted)onsubmit="return false" 对 Internet Explorer 7/8 无效(仍提交表单)
【发布时间】:2010-11-02 13:42:16
【问题描述】:

我有一个表单,它将由标记的“onsubmit”中触发的 javascript 代码提交。适用于所有浏览器 - 但不适用于 IE7/IE8。

我能做什么?

<form action="/dosomething.htm" method="GET" onsubmit="submitmyform();return false">
  [...]
  <input type="submit" value="Go">
</form>

【问题讨论】:

  • return false; 没有理由不能正常工作。我们需要查看您的代码以更好地了解正在发生的事情。 编辑我们需要查看submitmyform() 的代码,因为很可能发生了阻止return false; 执行的错误。

标签: javascript forms internet-explorer-8 internet-explorer-7 onsubmit


【解决方案1】:

我要挑剔这个。如果你想处理表单提交,那就是提交的目的。如果用户在您的某个字段中点击输入,您的 onclick 处理程序将完全避免。这是一个以不显眼的方式执行此操作的基本示例。

<form name="myform">
  <input type="submit" />
</form>
<script>
  document.myform.onsubmit = function(){
    alert('handled');
    return false;
  }
</script>

使用 jQuery 可以使这变得更简单,形式相同...

$("form[name=myform]").bind('submit',function(){
   alert('handled');
   return false;
});

【讨论】:

  • 这也不是不引人注目的,如果你有一种机制,你可以在不知道任何具体实现细节的情况下自动将事件绑定到函数,那么你就是。 IE。拥有document.myformform[name=myform] 与在HTML 中拥有onsubmit 属性就像 一样突兀,除非方向相反。您需要的是一种发现表单的方法,发现它的验证功能(可能通过命名约定validateMyForm()),从而自动和通用地绑定。如果你真的想不突兀。它也可以重复使用。
  • 如果您在一个页面上有 2 个表单并且每个表单都需要不同的提交逻辑,那么您必须有某种方式来表示哪个表单获得哪个功能。我认为这基本上是通过 name 属性在这个答案中所做的。您还可以使用 data-* 属性。我认为对于这样的情况,'unobtrusive JavaScript' 是指不在标记中使用 js 内联,而不是严格解耦标记和 JavaScript。
【解决方案2】:

这里提出的几个想法是可行的(因为它们使用不同的方式来编写正确的代码),但是有一个更简单的答案

OP 写道:

onsubmit="submitmyform();"

而不是:

onsubmit="return submitmyform();"

就是这样。

【讨论】:

    【解决方案3】:

    我认为你的 return false 永远不会达到,因为它是在你的函数返回的内容之后发生的。

    <form action="/dosomething.htm" method="GET" onsubmit="submitmyform();return false">
    

    请确保您在“submitmyform()”函数中返回 false,否则,它可能会在表单 obsubmit 事件中返回 true。

    【讨论】:

      【解决方案4】:
      <script type="text/javascript">
      <!--
      
      function submitHandler()
      {
        alert(0);
        return false;
      }
      
      window.onload=function(){document.getElementById("formid").attachEvent("onsubmit", submitHandler);}
      -->
      </script>
      
      <form action="/dosomething.htm" method="GET" id="formid">
        [...]
        <input type="submit" value="Go">
      </form>
      

      附加事件方法仅适用于 IE7/8。如果您想要一个可靠的跨浏览器解决方案,您应该使用 addEventListener 作为替代方案。

      希望对你有帮助

      【讨论】:

        【解决方案5】:

        试试这个。 为我工作。

        onSubmit="javascript:return false"

        【讨论】:

          【解决方案6】:

          要取消旧版 IE 中的事件,您需要将 returnValue 设置为 false。简单地返回false 是不行的。不知道微软为什么要这样实现。

          function validateForm(evt) {
          //  if form is not valid
              if(!condition) {
              //  if evt has preventDefault
                  if(evt.preventDefault)
                      { event.preventDefault(); }
              //  if evt has returnValue
                  else if(evt.returnValue)
                      { evt.returnValue = false; }
              //  fallback
                  else
                      { return false; }
              }
          }
          
          //  assume form is reference to your form
          form.attachEvent('onsubmit',validateForm);
          

          【讨论】:

            【解决方案7】:

            我们的解决方案是将 javascript 事件从表单的“onsubmit”移动到提交按钮的“onclick”。

            <form action="/dosomething.htm" method="GET">
              [...]
              <input type="submit" value="Go" onclick="submitmyform();return false">
            </form>
            

            【讨论】:

            • 这只会阻止通过单击或按该提交按钮上的回车键进行的表单提交。在表单内的输入控件中按 enter 键可以解决这个问题。
            • 我也认为会是这样。但是……这不是我在这里看到的。
            • @AndyE 实际上,即使按回车键,它也会阻止...检查一下
            • @yohal:在发布此类 cmets 之前,您确实应该在更多浏览器中进行测试;-) 我刚刚在我的 linux 机器上测试了最新的 Firefox 和 IE8,并且没有为我触发提交按钮的 onclick 事件。虽然 Chrome 确实如此,但它表明你真的不能相信浏览器会在某些事情上达成一致,除非它们写在规范中。
            • @AndyE 对不起,我没有在 linux 上测试过,但是在 windows 上我已经在所有主流浏览器(IE9、FF、Chrome、Safari 和 Opera)上测试过,关于规范也没有关于 onsubmit 的规范,见stackoverflow.com/questions/128923/…
            【解决方案8】:

            我遇到了同样的错误,当我打开控制台时,它从来没有出现过。所以我想通了,这是控制台,只要它被关闭,Internet Explorer 就不会知道它。只需使用以下代码在窗口中添加一个虚拟控制台(如果还没有的话):

            var myconsole = {log : function(param){}}
            window.console = window.console || myconsole;
            

            如果你想拥有微软的javascript控制台,你可能会遇到麻烦。然后将这些行注释掉。但是现在,控制台对象在整个站点上不再是未定义的了。

            【讨论】:

              【解决方案9】:
              <form action="/dosomething.htm" method="GET" onsubmit="return submitmyform(this)">
                   [...]
                   <input type="submit" value="Go">
                 </form>
              

              这工作正常...函数必须返回真或假

              【讨论】:

                【解决方案10】:

                事实上,因为你写了submitmyform();return false,所以只有submitmyform被评估。

                如果有两个命令,您必须像这样将它们放在大括号之间

                {submitmyform();return false;}
                

                以便对两者都进行评估。

                【讨论】:

                  【解决方案11】:

                  我认为问题在于 return false 你需要从你的'onsubmit'函数中返回它

                  参见示例。

                  此表单也永远不会在 IE 7/8 中提交。

                   <form action="acknowledgement.html" method="get" onsubmit="verify();">
                          <input type="submit" name="submit"
                           VALUE="Submit"> 
                          </form>
                  
                  <script language="javscript">
                  function verify(){
                  
                  return false;
                  }
                  </script>
                  

                  丹尼。

                  【讨论】:

                  • 这行不通。 verify()函数将控制权返回给onsubmit函数,所以需要返回false来取消默认动作的是onsubmit函数。
                  【解决方案12】:

                  它有效 - 检查 W3Scools 示例(取自 ) http://www.w3schools.com/js/js_form_validation.asp

                  <html>
                  <head>
                  <script type="text/javascript">
                  function validate_required(field,alerttxt)
                  {
                  with (field)
                    {
                    if (value==null||value=="")
                      {
                      alert(alerttxt);return false;
                      }
                    else
                      {
                      return true;
                      }
                    }
                  }
                  
                  function validate_form(thisform)
                  {
                  with (thisform)
                    {
                    if (validate_required(email,"Email must be filled out!")==false)
                    {email.focus();return false;}
                    }
                  }
                  </script>
                  </head>
                  
                  <body>
                  <form action="submit.htm" onsubmit="return validate_form(this)" method="post">
                  Email: <input type="text" name="email" size="30">
                  <input type="submit" value="Submit">
                  </form>
                  </body>
                  
                  </html>
                  

                  【讨论】:

                    【解决方案13】:

                    如果您希望 IE 符合标准,您必须在声明中告诉它它应该遵守哪个标准。

                    如果没有它,让它做你想做的事将是无穷无尽的挫折。有了一个,大部分的挫败感都消失了,因为它开始像其他所有浏览器一样工作。

                    【讨论】:

                      【解决方案14】:
                      document.forms.userFormRegisterr.onsubmit =  function(e){
                          return false;
                      };
                      

                      【讨论】:

                        猜你喜欢
                        • 2012-03-21
                        • 1970-01-01
                        • 1970-01-01
                        • 2021-03-29
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多