|
|
@@ -1,9 +1,9 @@
|
|
|
/*!
|
|
|
- * jQuery Validation Plugin v1.19.5
|
|
|
+ * jQuery Validation Plugin v1.20.0
|
|
|
*
|
|
|
* https://jqueryvalidation.org/
|
|
|
*
|
|
|
- * Copyright (c) 2022 Jörn Zaefferer
|
|
|
+ * Copyright (c) 2023 Jörn Zaefferer
|
|
|
* Released under the MIT license
|
|
|
*/
|
|
|
(function( factory ) {
|
|
|
@@ -774,6 +774,9 @@ $.extend( $.validator, {
|
|
|
val = this.elementValue( element ),
|
|
|
result, method, rule, normalizer;
|
|
|
|
|
|
+ // Abort any pending Ajax request from a previous call to this method.
|
|
|
+ this.abortRequest( element );
|
|
|
+
|
|
|
// Prioritize the local normalizer defined for this element over the global one
|
|
|
// if the former exists, otherwise user the global one in case it exists.
|
|
|
if ( typeof rules.normalizer === "function" ) {
|
|
|
@@ -960,14 +963,23 @@ $.extend( $.validator, {
|
|
|
error.removeClass( this.settings.validClass ).addClass( this.settings.errorClass );
|
|
|
|
|
|
// Replace message on existing label
|
|
|
- error.html( message );
|
|
|
+ if ( this.settings && this.settings.escapeHtml ) {
|
|
|
+ error.text( message || "" );
|
|
|
+ } else {
|
|
|
+ error.html( message || "" );
|
|
|
+ }
|
|
|
} else {
|
|
|
|
|
|
// Create error element
|
|
|
error = $( "<" + this.settings.errorElement + ">" )
|
|
|
.attr( "id", elementID + "-error" )
|
|
|
- .addClass( this.settings.errorClass )
|
|
|
- .html( message || "" );
|
|
|
+ .addClass( this.settings.errorClass );
|
|
|
+
|
|
|
+ if ( this.settings && this.settings.escapeHtml ) {
|
|
|
+ error.text( message || "" );
|
|
|
+ } else {
|
|
|
+ error.html( message || "" );
|
|
|
+ }
|
|
|
|
|
|
// Maintain reference to the element to be placed into the DOM
|
|
|
place = error;
|
|
|
@@ -1113,6 +1125,10 @@ $.extend( $.validator, {
|
|
|
return !$.validator.methods.required.call( this, val, element ) && "dependency-mismatch";
|
|
|
},
|
|
|
|
|
|
+ elementAjaxPort: function( element ) {
|
|
|
+ return "validate" + element.name;
|
|
|
+ },
|
|
|
+
|
|
|
startRequest: function( element ) {
|
|
|
if ( !this.pending[ element.name ] ) {
|
|
|
this.pendingRequest++;
|
|
|
@@ -1148,6 +1164,25 @@ $.extend( $.validator, {
|
|
|
}
|
|
|
},
|
|
|
|
|
|
+ abortRequest: function( element ) {
|
|
|
+ var port;
|
|
|
+
|
|
|
+ if ( this.pending[ element.name ] ) {
|
|
|
+ port = this.elementAjaxPort( element );
|
|
|
+ $.ajaxAbort( port );
|
|
|
+
|
|
|
+ this.pendingRequest--;
|
|
|
+
|
|
|
+ // Sometimes synchronization fails, make sure pendingRequest is never < 0
|
|
|
+ if ( this.pendingRequest < 0 ) {
|
|
|
+ this.pendingRequest = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ delete this.pending[ element.name ];
|
|
|
+ $( element ).removeClass( this.settings.pendingClass );
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
previousValue: function( element, method ) {
|
|
|
method = typeof method === "string" && method || "remote";
|
|
|
|
|
|
@@ -1588,7 +1623,7 @@ $.extend( $.validator, {
|
|
|
data[ element.name ] = value;
|
|
|
$.ajax( $.extend( true, {
|
|
|
mode: "abort",
|
|
|
- port: "validate" + element.name,
|
|
|
+ port: this.elementAjaxPort( element ),
|
|
|
dataType: "json",
|
|
|
data: data,
|
|
|
context: validator.currentForm,
|
|
|
@@ -1599,7 +1634,6 @@ $.extend( $.validator, {
|
|
|
validator.settings.messages[ element.name ][ method ] = previous.originalMessage;
|
|
|
if ( valid ) {
|
|
|
submitted = validator.formSubmitted;
|
|
|
- validator.resetInternals();
|
|
|
validator.toHide = validator.errorsFor( element );
|
|
|
validator.formSubmitted = submitted;
|
|
|
validator.successList.push( element );
|
|
|
@@ -1624,6 +1658,7 @@ $.extend( $.validator, {
|
|
|
|
|
|
// Ajax mode: abort
|
|
|
// usage: $.ajax({ mode: "abort"[, port: "uniqueport"]});
|
|
|
+// $.ajaxAbort( port );
|
|
|
// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()
|
|
|
|
|
|
var pendingRequests = {},
|
|
|
@@ -1634,9 +1669,7 @@ if ( $.ajaxPrefilter ) {
|
|
|
$.ajaxPrefilter( function( settings, _, xhr ) {
|
|
|
var port = settings.port;
|
|
|
if ( settings.mode === "abort" ) {
|
|
|
- if ( pendingRequests[ port ] ) {
|
|
|
- pendingRequests[ port ].abort();
|
|
|
- }
|
|
|
+ $.ajaxAbort( port );
|
|
|
pendingRequests[ port ] = xhr;
|
|
|
}
|
|
|
} );
|
|
|
@@ -1648,14 +1681,20 @@ if ( $.ajaxPrefilter ) {
|
|
|
var mode = ( "mode" in settings ? settings : $.ajaxSettings ).mode,
|
|
|
port = ( "port" in settings ? settings : $.ajaxSettings ).port;
|
|
|
if ( mode === "abort" ) {
|
|
|
- if ( pendingRequests[ port ] ) {
|
|
|
- pendingRequests[ port ].abort();
|
|
|
- }
|
|
|
+ $.ajaxAbort( port );
|
|
|
pendingRequests[ port ] = ajax.apply( this, arguments );
|
|
|
return pendingRequests[ port ];
|
|
|
}
|
|
|
return ajax.apply( this, arguments );
|
|
|
};
|
|
|
}
|
|
|
+
|
|
|
+// Abort the previous request without sending a new one
|
|
|
+$.ajaxAbort = function( port ) {
|
|
|
+ if ( pendingRequests[ port ] ) {
|
|
|
+ pendingRequests[ port ].abort();
|
|
|
+ delete pendingRequests[ port ];
|
|
|
+ }
|
|
|
+};
|
|
|
return $;
|
|
|
}));
|