formvalidation
Version:
The best jQuery plugin to validate form fields. Support Bootstrap, Foundation, Pure, SemanticUI, UIKit and custom frameworks
145 lines (130 loc) • 5.3 kB
JavaScript
/**
* remote validator
*
* @link http://formvalidation.io/validators/remote/
* @author https://twitter.com/nghuuphuoc
* @copyright (c) 2013 - 2015 Nguyen Huu Phuoc
* @license http://formvalidation.io/license/
*/
(function($) {
FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, {
'en_US': {
remote: {
'default': 'Please enter a valid value'
}
}
});
FormValidation.Validator.remote = {
html5Attributes: {
crossdomain: 'crossDomain',
data: 'data',
datatype: 'dataType',
delay: 'delay',
message: 'message',
name: 'name',
type: 'type',
url: 'url',
validkey: 'validKey'
},
/**
* Destroy the timer when destroying the FormValidation (using validator.destroy() method)
*/
destroy: function(validator, $field, options) {
var ns = validator.getNamespace(),
timer = $field.data(ns + '.remote.timer');
if (timer) {
clearTimeout(timer);
$field.removeData(ns + '.remote.timer');
}
},
/**
* Request a remote server to check the input value
*
* @param {FormValidation.Base} validator Plugin instance
* @param {jQuery} $field Field element
* @param {Object} options Can consist of the following keys:
* - crossDomain {Boolean} [optional]
* - data {Object|Function} [optional]: By default, it will take the value
* {
* <fieldName>: <fieldValue>
* }
* - dataType {String} [optional]: The type of data which is returned by remote server.
* It can be json (default), text, script
* - delay {Number} [optional]
* - headers {String[]} [optional]: Additional headers
* - message {String} [optional]: The invalid message
* - name {String} [optional]: Override the field name for the request.
* - type {String} [optional] Can be GET or POST (default)
* - url {String|Function}
* - validKey {String} [optional]: The valid key. It's "valid" by default
* This is useful when connecting to external remote server or APIs provided by 3rd parties
* @returns {Deferred}
*/
validate: function(validator, $field, options) {
var ns = validator.getNamespace(),
value = validator.getFieldValue($field, 'remote'),
dfd = new $.Deferred();
if (value === '') {
dfd.resolve($field, 'remote', { valid: true });
return dfd;
}
var name = $field.attr('data-' + ns + '-field'),
data = options.data || {},
url = options.url,
validKey = options.validKey || 'valid';
// Support dynamic data
if ('function' === typeof data) {
data = data.call(this, validator);
}
// Parse string data from HTML5 attribute
if ('string' === typeof data) {
data = JSON.parse(data);
}
// Support dynamic url
if ('function' === typeof url) {
url = url.call(this, validator);
}
data[options.name || name] = value;
var ajaxOptions = {
data: data,
dataType: options.dataType || 'json',
headers: options.headers || {},
type: options.type || 'GET',
url: url
};
if (options.crossDomain !== null) {
ajaxOptions.crossDomain = (options.crossDomain === true || options.crossDomain === 'true');
}
function runCallback() {
var xhr = $.ajax(ajaxOptions);
xhr
.success(function(response) {
response.valid = (response[validKey] === true || response[validKey] === 'true')
? true
: (response[validKey] === false || response[validKey] === 'false' ? false : null);
dfd.resolve($field, 'remote', response);
})
.error(function(response) {
dfd.resolve($field, 'remote', {
valid: false
});
});
dfd.fail(function() {
xhr.abort();
});
return dfd;
}
if (options.delay) {
// Since the form might have multiple fields with the same name
// I have to attach the timer to the field element
if ($field.data(ns + '.remote.timer')) {
clearTimeout($field.data(ns + '.remote.timer'));
}
$field.data(ns + '.remote.timer', setTimeout(runCallback, options.delay));
return dfd;
} else {
return runCallback();
}
}
};
}(jQuery));