Using jQuery validate to upload a form, using ajax in the submitHandler()... not working
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_na开发者_如何学编程me: {
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.
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()
call ajax method with php function
<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'));?>
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.
精彩评论