【问题标题】:Submitting a form with an onSubmit使用 onSubmit 提交表单
【发布时间】:2013-03-13 06:39:21
【问题描述】:

我的表单onSubmit 正在调用:

onsubmit="validate(this); return false;"

validate();如下:

function validate(obj) {
    $.ajax({
        url : "ajax/validate_check.php",
        type : "POST",
        data : $("#" + obj.id).serialize(),
        success : function(data) {
            $('#' + obj.id + ' :input.form_errors').removeClass('form_errors')
            data = $.parseJSON(data);
            if(data['error_count'] >= 1) {
                $.each(data, function(i, item) {
                    $('#' + i).addClass('form_errors');
                });
            } else {
                $('#' + obj.id).submit();
            }
        }
    });
}

当我遇到0 错误时,它会尝试提交表单,但我遇到了无限循环。我意识到它正在发生,因为我的onSubmit 再次调用了该函数。准备好后如何实际提交表单?

编辑:

我只是在寻找解决此问题的最佳方法。我想验证onSubmit 以便快速响应用户,然后我想以我知道数据去向的方式实际提交表单(例如 register.php 将注册用户)。

这就是我不执行组合操作/验证脚本的原因,因为我不知道我要提交哪个表单。我可能需要重新安排我这样做的方式。

【问题讨论】:

  • 不要使用侵入式 JS。
  • 为什么要重复提交表单?为什么不向组合的验证操作脚本提交一次?

标签: javascript jquery onsubmit


【解决方案1】:

我不会在你的 else 分支中再次提交,而是返回一个真值。

在你的 onsubmit 我会做 onsubmit="return validate(this);"

【讨论】:

  • 使用异步 ajax 调用返回 true 是行不通的。 submit 应该在 success 函数中调用。正如@moonwave99 所建议的那样,应避免使用onsubmit 属性。由于我们看不到 OP 的问题是否有提交按钮,因此我们几乎没有解决方案的选择。迄今为止,@balexandre 拍得最好。
【解决方案2】:

不要再次使用提交调用submit它,正如你所说,你会陷入循环......只需像提交一样发布所有内容:

将您的$('#' + obj.id).submit(); 行更改为submitForm() 并添加

function submitForm() {
    var form = $("#my_form"),
        url = form.attr("action"),
        dt = form.serialize();

    $.post(url, dt, function(data) {
       // your form was post'd successfully
    });
}

既然你知道如何工作,为什么还要发明井?

您为什么不使用jQuery Validateremote validation 为您完成这项工作?

【讨论】:

    【解决方案3】:

    这应该有效:在重新提交之前取消绑定事件。

    代替

    function validate(obj) {
        $.ajax({
            url : "ajax/validate_check.php",
            type : "POST",
            data : $("#" + obj.id).serialize(),
            success : function(data) {
                $('#' + obj.id + ' :input.form_errors').removeClass('form_errors')
                data = $.parseJSON(data);
                if(data['error_count'] >= 1) {
                    $.each(data, function(i, item) {
                        $('#' + i).addClass('form_errors');
                    });
                } else {
                    $('#' + obj.id).submit();
                }
            }
        });
    }
    

    试试

    function validate(obj) {
        $.ajax({
            url : "ajax/validate_check.php",
            type : "POST",
            data : $("#" + obj.id).serialize(),
            success : function(data) {
                $('#' + obj.id + ' :input.form_errors').removeClass('form_errors')
                data = $.parseJSON(data);
                if(data['error_count'] >= 1) {
                    $.each(data, function(i, item) {
                        $('#' + i).addClass('form_errors');
                    });
                } else {
                    $('#' + obj.id).unbind('submit').submit();
                }
            }
        });
    }
    

    【讨论】:

      【解决方案4】:

      在你的街区

         } else {
              $('#' + obj.id).submit();
         }
      

      实际的表单提交不是使用另一个 ajax 调用将数据发送到表单操作端点:

      } else {
      
          $.ajax({
              url : obj.action
              ,type : obj.method
              ,data : $(obj).serialize()
              ,success : function() {
                  // show success message/close window/ etc
              }
              , error: function() {
                  // show error saving form message
              }
          });
      }
      

      这样,如果表单提交出现问题,您将能够更好地捕捉结果。

      【讨论】:

        【解决方案5】:

        删除onsubmit="validate(this); return false;"

        并使用以下函数:

        $('form').submit(function(e){
            e.preventDefault();
            var $form = $(this),
                $formId = $form.attr('id'),
                $formName = $form.attr('name');
        
            $.ajax({
                url : "ajax/validate_check.php",
                type : "POST",
                data : $("#" + $formId).serialize(),
                success : function(data) {
                    $('#' + $formId + ' :input.form_errors').removeClass('form_errors')
                    data = $.parseJSON(data);
                    if(data['error_count'] >= 1) {
                        $.each(data, function(i, item) {
                            $('#' + i).addClass('form_errors');
                        });
                    } else {
                        document.forms[$formName].submit();
                    }
                }
            });
        });
        

        您可以使用idname 形式进行测试的小提琴:http://jsfiddle.net/67rvg/3/

        【讨论】:

        • 谢谢!这更像是我正在寻找的。我在提交时遇到问题。我收到错误Uncaught TypeError: Property 'submit' of object #<HTMLFormElement> is not a function。我尝试改用$('#' + $formId).submit(),但后来我再次陷入无限循环。有什么想法吗?
        • @SeanWM 表单提交可能是浏览器问题。试试修改后的答案。
        • @SeanWM 使用idname 提交检查forminput 元素。这可能会导致您的错误。见stackoverflow.com/questions/12540953/…
        • 谢谢,我回家试试看。
        • 我把提交按钮的名字去掉了,因为它被命名为submit。您的链接有帮助!非常感谢。
        【解决方案6】:
        1. 不要使用 onsubmit 属性,它会将 JavaScript 混合到 html 标记中,并且违背了最佳实践。
        2. 为什么不将验证部分作为注册功能(服务器端)。这样一来,您的往返次数就不会是您需要的两倍。遵循最佳实践,您应该尽可能少地发出 http 请求。您可以根据功能将 php 脚本组织到文件夹中。更容易分辨正在提交什么表单。这样,为每个表单提交创建一个唯一的验证脚本也会容易得多。您还可以使用 REQUEST_URI 服务器变量来判断您要提交的表单。

        See here for instructions on accessing the REQUEST URI of the request within a php script.

        如果您对提交的每个表单都进行了共同验证,您可以将其移动到单独的 php 文件中,并将其导入将使用该函数的所有文件中。然后,该函数将在您将其导入的脚本中可用。

        See here for instructions on including files in php.

        然后您可以为每个单独的脚本添加自定义验证。有一天,您很可能需要对某些表单进行自定义验证。

        • util/validation_util.php
        • ajax/user/register.php
        • ajax/user/login.php
        • ajax/user/logout.php
        • ajax/product/search.php
        • ajax/product/detail.php
        • ajax/product/addToCart.php
        • 等等……

          $('#formId').on('submit', function (event) {
          
          event.preventDefault();
          
          $.ajax({
              url : "ajax/user/register.php",
              type : "POST",
              data : $(this).serialize(),
              success : function(data) {
                  $('#' + obj.id + ' :input.form_errors').removeClass('form_errors')
                  data = $.parseJSON(data);
                  if(data['error_count'] >= 1) {
                      $.each(data, function(i, item) {
                          $('#' + i).addClass('form_errors');
                      });
                  }
              }
          });
          });
          

        【讨论】:

          猜你喜欢
          • 2011-12-05
          • 2018-11-22
          • 1970-01-01
          • 2013-10-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多