views:

31

answers:

2

I am using jquery validate with a form. I want to submit the form using ajax. When I put the ajax call in validate's submitHandler() The browser hangs. What's going on?

The error message I get when I enable the validate method's debug is:

uncaught exception: [Exception... "Illegal operation on WrappedNative prototype object" nsresult: "0x8057000c (NS_ERROR_XPC_BAD_OP_ON_WN_PROTO)" location: "JS frame :: http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js :: f :: line 132" data: no]

Which is too arcane for me to make sense of.

Some code:

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

});

The form is a very vanilla form. Submitting via a standard POST works fine. Also, the validation works fine... it's just the submitting with ajax part that fails me.

+1  A: 

You'll probably want to serialise that form before sending it - you probably don't want to send a DOM object

edit RE:comment - to select only some inputs and serialize -

$(form).find(":input[name=inp1] :input[name=inp2]").serialize()
tobyodavies
How would I do this (and why)?
rg88
because you don't want to send the dom object any more than you want to send the first link on the page - it just doesn't make sense. _You want to send the key-value pairs of what the user has entered_, which is just a very small part of the information in the DOM (which includes the CSS properties, position on the page, child nodes, parent nodes and anything else you can access through javascript to do with the DOM). The easiest way to serialize a form is to use `$(form).serialize()`
tobyodavies
This seems to be working! Do you know how to access only certain elements of the serialized data?
rg88
+1  A: 

Just to elaborate of tobyodavies answer. You might want to change your submission to

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

The ajax function expects the data option to be a string (not entirely true but for this case it's fine) while your passing in the forms dom object.

Toby
Thanks for the answer. Do you know how to access only certain elements of the serialized data?
rg88
I'm not exactly sure what you mean. If you only want to serialize a subset of the form elements then you can select those a serialise that instead i.e $('#name,#email,#phonenumber').serialize() will serialize the name, email and phonenumber form elements
Toby