1

我的表格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 将注册用户)。

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

4

6 回答 6

1

消除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();
            }
        }
    });
});

小提琴,您可以使用表单id或进行测试:http name: //jsfiddle.net/67rvg/3/

于 2013-03-26T01:54:08.800 回答
0

在你的街区

   } 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
        }
    });
}

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

于 2013-03-25T15:41:12.390 回答
0

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

代替

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();
            }
        }
    });
}
于 2013-03-25T13:59:50.157 回答
0

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

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

于 2013-03-23T12:28:57.363 回答
0

不要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 Validate远程验证来为你完成这项工作?

于 2013-03-23T12:39:54.390 回答
0
  1. 不要使用 onsubmit 属性,它将 JavaScript 混合到 html 标记中,并且违背了最佳实践。
  2. 为什么不将验证部分作为注册功能(服务器端)。这样一来,您的往返次数就不会是您需要的两倍。遵循最佳实践,您应该尽可能少地发出 http 请求。您可以根据功能将 php 脚本组织到文件夹中。更容易分辨正在提交什么表单。这样,为每个表单提交创建一个唯一的验证脚本也会容易得多。您还可以使用 REQUEST_URI 服务器变量来判断您正在提交哪个表单。

有关在 php 脚本中访问请求的 REQUEST URI 的说明,请参见此处。

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

有关在 php.ini 中包含文件的说明,请参见此处。

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

  • 实用程序/validation_util.php
  • ajax/用户/register.php
  • ajax/用户/login.php
  • ajax/用户/logout.php
  • ajax/product/search.php
  • ajax/product/detail.php
  • ajax/product/addToCart.php
  • ETC...

    $('#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');
                });
            }
        }
    });
    });
    
于 2013-03-26T18:20:00.757 回答