使用jQuery验证上传表单,在submitHandler()中使用ajax ...无法正常工作

时间:2010-10-28 03:46:26

标签: javascript ajax jquery jquery-validate

我正在使用表单进行jquery验证。我想使用ajax提交表单。当我把ajax调用放在validate的submitHandler()时浏览器挂起。发生了什么事?

启用validate方法调试时收到的错误消息是:

  未被捕的例外:[例外......   “对WrappedNative的非法操作   原型对象“nsresult:   “0x8057000c   (NS_ERROR_XPC_BAD_OP_ON_WN_PROTO)”   位置:“JS框架::   http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js   :: f ::第132行“数据:否]

这对我来说太神秘了。

一些代码:

$(document).ready(function() {
$("#loginForm").validate({
        debug: true,
        errorLabelContainer: $('div.error'),
        wrapper: 'li',
        rules:  {
            last_name: {
                required: true
            }
        },
        messages: {
            last_name: {
                required: "Please enter your last name."
            }
        },
        submitHandler: function(form){
            $.ajax({
                type: "POST",
                url: "test.php",
                data: form,
                success: function(msg){
                    console.log( "Data Saved: " + msg );
                },
                error: function(msg){
                    console.log( "Error: " + msg);
                }
            });
        }
    });

});

表格非常香草形式。通过标准POST提交工作正常。此外,验证工作正常......只是提交ajax部分使我失望。

3 个答案:

答案 0 :(得分:3)

您可能希望在发送之前序列化该表单 - 您可能不想发送DOM对象

编辑RE:评论 - 仅选择一些输入并序列化 -

$(form).find(":input[name=inp1] :input[name=inp2]").serialize()

答案 1 :(得分:3)

使用php函数调用ajax方法

<script type="text/javascript" src="http://dev.jquery.com/view/trunk/plugins/validate/jquery.validate.js"></script>

class Ajax{
public function submitForm($data=array()){
    //form - name attribute
    //do   - ajax page do_
    // get - ajax result
    return '<script language="javascript" type="text/javascript">
                $(document).ready(function (data){
                    $(\'form[name='.$data['form'].']\').validate({
                            submitHandler: function(form) {
                                $.ajax({
                                    method : \'post\',
                                    url    : \'' . AJAX_PATH . ''. $data['do'].'\',
                                    data   : $(this).serialize(),
                                    dataType : \'html\',
                                    success : function(data){
                                        $(\'form[name='.$data['form'].']\').slideUp(1000);
                                        $(\''. $data['get'] .'\').html(data).fadeIn(1000);
                                        //$(\''. $data['get'] .'\').html(data).fadeIn(1000);
                                    },
                                    error : function(data) {alert(\'missing file\'); }
                                });
                                return false;
                             }
                    });
                });
            </script>';
}

}

$ajax = new Ajax();

<?php echo $ajax->submitForm(array('do'=>'do_register.php','form'=>'register','get'=>'#message'));?>

答案 2 :(得分:2)

只是详细说明tobyodavies的答案。您可能希望将提交更改为

        $.ajax({
            type: "POST",
            url: "test.php",
            data: $(form).serialize(),
            success: function(msg){
                console.log( "Data Saved: " + msg );
            },
            error: function(msg){
                console.log( "Error: " + msg);
            }
        });

ajax函数期望数据选项是一个字符串(不完全正确,但对于这种情况,它很好),而你传入表单dom对象。