【问题标题】:Using jQuery validate to upload a form, using ajax in the submitHandler()... not working使用 jQuery 验证上传表单,在 submitHandler() 中使用 ajax ... 不工作
【发布时间】:2010-10-28 03:46:26
【问题描述】:

我正在使用带有表单的 jquery 验证。我想使用 ajax 提交表单。当我将 ajax 调用放入 validate 的 submitHandler() 时,浏览器挂起。怎么回事?

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

未捕获的异常:[异常... “对 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 :: line 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 提交部分。

【问题讨论】:

  • 你说浏览器挂了,我想知道那段时间发生了什么。你的服务器端代码在运行吗?还是我们仍然是客户端?您是否在处理此请求的服务器端代码中放置了某种调试器?

标签: javascript ajax jquery jquery-validate


【解决方案1】:

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

编辑 RE:comment - 只选择一些输入并序列化 -

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

【讨论】:

  • 我该怎么做(以及为什么)?
  • 因为您不想发送 dom 对象,就像您想发送页面上的第一个链接一样——这没有任何意义。 您要发送用户输入的键值对,这只是 DOM 中信息的一小部分(包括 CSS 属性、页面上的位置、子节点, 父节点和任何你可以通过 javascript 访问的与 DOM 相关的东西)。序列化表单最简单的方法是使用$(form).serialize()
  • 这似乎有效!你知道如何只访问序列化数据的某些元素吗?
【解决方案2】:

用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'));?>

【讨论】:

    【解决方案3】:

    只是为了详细说明 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 函数期望 data 选项是一个字符串(不完全正确,但在这种情况下它很好),而您传递表单 dom 对象。

    【讨论】:

    • 感谢您的回答。你知道如何只访问序列化数据的某些元素吗?
    • 我不太清楚你的意思。如果您只想序列化表单元素的子集,那么您可以选择那些序列化,而不是使用 $('#name,#email,#phonenumber').serialize() 将序列化名称、电子邮件和电话号码表单元素
    • 如果数据:$(form).serialize() 被使用,我无法接收文件。如何使用 ajax 上传文件。
    • @KetavChotaliya 你基本上不能。你需要特别处理这些。如果您的浏览器支持要求允许,可以使用 XHR2 处理文件上传,否则您通常会创建一个 iframe 并使用 iframe 作为目标提交表单(即 target="iframe-name")。不过,有相当多的库应该为您混淆这些细节。
    • @Toby 用这两行来完成。内容类型:假,过程数据:假,
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多