Core: core.js, methods.js, Fix for #1567 - jquery-validation ignores data obj when validating, incorrectly returning previous status

This change determines if either the validated element's value OR one of the data properties has changed before aborting the remote request. If your remote validation is skipped due to being dependent on the value of another field, this fixes that issue.
This commit is contained in:
Christopher Bauer
2015-09-03 16:42:05 -04:00
parent 6129ab613e
commit 17a56baa6f
2 changed files with 40 additions and 4 deletions

View File

@@ -1291,7 +1291,7 @@ $.extend( $.validator, {
}
var previous = this.previousValue( element ),
validator, data;
validator, data, optionDataString;
if (!this.settings.messages[ element.name ] ) {
this.settings.messages[ element.name ] = {};
@@ -1300,12 +1300,12 @@ $.extend( $.validator, {
this.settings.messages[ element.name ].remote = previous.message;
param = typeof param === "string" && { url: param } || param;
if ( previous.old === value ) {
optionDataString = $.param( $.extend( { data: value }, param.data ) );
if (previous.old === optionDataString) {
return previous.valid;
}
previous.old = value;
previous.old = optionDataString;
validator = this;
this.startRequest( element );
data = {};

View File

@@ -470,6 +470,42 @@ asyncTest("remote extensions", function() {
strictEqual( v.element(e), true, "still invalid, because remote validation must block until it returns; dependency-mismatch considered as valid though" );
});
test("remote, data previous querystring", function() {
expect(4);
var change = true,
e = $("#username"),
v = $("#userForm").validate({
rules: {
username: {
required: true,
remote: {
url: "users.php",
type: "POST",
data: {
email: function() {
if ( change ) {
change = false;
return "email.com";
}
return "email2.com";
}
},
beforeSend: function(request, settings) {
if ( change ) {
deepEqual(settings.data, "username=asdf&email=email.com");
} else {
deepEqual(settings.data, "username=asdf&email=email2.com");
}
}
}
}
}
});
$("#username").val("asdf");
strictEqual( v.element(e), true, "new email value (email.com), new request; dependency-mismatch considered as valid though" );
strictEqual( v.element(e), true, "new email value (email2.com), new request; dependency-mismatch considered as valid though" );
});
module("additional methods");
test("phone (us)", function() {