Validation framework that let's you configure, rather than code, your validation logic.
I started writing this plugin back in 2009 and it has given me much joy over the years. But all good things must come to an end and now it's time for this plugin to pull in its oars and go down with history.
This plugin is no longer being developed! It supports jQuery v. 1.8 >= 2.2.4. No pull requests will become merged in but feel free to fork and do whatever you like!
Usage example
<form action="" method="POST">
<p>
Name (4 characters minimum):
<input name="user" data-validation="length" data-validation-length="min4" />
</p>
<p>
Birthdate (yyyy-mm-dd):
<input name="birth" data-validation="birthdate" />
</p>
<p>
Website:
<input name="website" data-validation="url" />
</p>
<p>
<input type="submit" />
</p>
</form>
<script src="https://github.com/victorjonsson/jQuery-Form-Validator/raw/master/js/jquery.min.js"></script>
<script src="https://github.com/victorjonsson/jQuery-Form-Validator/raw/master/js/form-validator/jquery.form-validator.min.js"></script>
<script>
$.validate({
modules : 'date, security'
});
</script>
This plugin can serve as a fallback solution for the validation attributes in the HTML5 spec. With the html5 module you can use the following native features:
Attributes: require, pattern, maxlength, min, max, placeholder
Input types: url, date, time, email, number
Elements: Use the element datalist
to create input suggestions
Read the documentation for the default features at #default-validators
Read the documentation for the security module at #security-validators
Read the documentation for the date module at #date-validators
Read the documentation for the location module at #location-validators
Read the documentation for the file module at #file-validators
Read the documentation for this module at /#logic
Read the documentation for this module at http://formvalidator.net/#sepa
Read the documentation for the Swedish module at http://formvalidator.net/#sweden-validators
Read the documentation for the UK module at http://formvalidator.net/#uk-validators
Read the documentation for the sanitation module at http://formvalidator.net/#data-sanitation
You can use the function $.formUtils.addValidator()
to add your own validation function. Here's an example of a validator
that checks if the input contains an even number.
<form action="" method="POST">
<p>
<input type="text" data-validation="even" />
</p>
...
</form>
<script src="https://github.com/victorjonsson/jQuery-Form-Validator/raw/master/js/jquery.min.js"></script>
<script src="https://github.com/victorjonsson/jQuery-Form-Validator/raw/master/js/form-validator/jquery.form-validator.min.js"></script>
<script>
// Add validator
$.formUtils.addValidator({
name : 'even',
validatorFunction : function(value, $el, config, language, $form) {
return parseInt(value, 10) % 2 === 0;
},
errorMessage : 'You have to answer an even number',
errorMessageKey: 'badEvenNumber'
});
// Initiate form validation
$.validate();
</script>
name - The name of the validator, which is used in the validation attribute of the input element.
validatorFunction - Callback function that validates the input. Should return a boolean telling if the value is considered valid or not.
errorMessageKey - Name of language property that is used in case the value of the input is invalid.
errorMessage - An alternative error message that is used if errorMessageKey is left with an empty value or isn't defined in the language object. Note that you also can use inline error messages in your form.
The validation function takes these five arguments:
A "module" is basically a javascript file containing one or more calls to $.formUtils.addValidator().
The module file must be placed in the same directory as jquery.form-validator.min.js
if you want it to load automatically via the setup function.
You can use the method $.formUtils.loadModules
if you want to load the module from a custom path.
$.formUtils.loadModules('customModule otherCustomModule', 'js/validation-modules/');
$.validate({
modules: 'security, date'
});
The first argument of $.formUtils.loadModules
is a comma separated string with names of module files, without
file extension.
The second argument is the path where the module files are located. This argument is optional, if not given the module files has to be located in the same directory as the core modules shipped together with this jquery plugin (js/form-validator/)
It is possible to display help information for each input. The information will fade in when input is focused and fade out when input looses focus.
<form action="" id="my_form">
<p>
<strong>Why not:</strong>
<textarea name="why" data-validation-help="Please give us some more information" data-validation="required"></textarea>
</p>
...
Read about how to customize this plugin over at http://formvalidator.net/#configuration
You can cause an element to be validated upon the firing of an event, by attaching an attribute to the form input element named data-validation-event="click"
. When the configuration settings have validateOnEvent : true
, the click event will trigger the onBlur validaton for that element. Possible use case: Checkboxes. Instead of waiting for the checkbox to lose focus (blur) and waiting for a validation to occurr, you can specify that elements validation should occur as soon as that checkbox element is clicked.
This plugin comes with translations for English, Polish, Romanian, Danish, Norwegian, Dutch, Czech, Catalan, Russian, Italian, French, German, Swedish and Portuguese. You can also choose to override the error dialogs yourself. Here you can read more about localization
<!-- Require an answer (can be applied to all types of inputs and select elements) -->
<input type="text" data-validation="required">
<input type="checkbox" name="agreement" data-validation="required">
<select name="answer" data-validation="required">
<option value=""> - - Answer - - </option>
<option>Yes</option>
<option>No</option>
</select>
<!-- Max 100 characters -->
<input type="text" data-validation="length" data-validation-length="max100">
<!-- Minimum 20 characters -->
<input type="text" data-validation="length" data-validation-length="min20">
<!-- No less than 50 characters and no more than 200 characters -->
<input type="text" data-validation="length" data-validation-length="50-200">
<!-- Require that atleast 2 options gets choosen -->
<select multiple="multiple" size="5" data-validation="length" data-validation-length="min2">
<option>A</option>
<option>B</option>
<option>C</option>
<option>D</option>
<option>E</option>
</select>
This plugin also supports the attributes "required" and "maxlength" by using the Html5 module.
<!-- Any numerical value -->
<input type="text" data-validation="number">
<!-- Only allowing float values -->
<input type="text" data-validation="number" data-validation-allowing="float">
<!-- Allowing float values and negative values -->
<input type="text" data-validation="number" data-validation-allowing="float,negative">
<!-- Validate float number with comma separated decimals -->
<input type="text" data-validation="number" data-validation-allowing="float"
data-validation-decimal-separator=",">
<!-- Only allowing numbers from 1 to 100 -->
<input type="text" data-validation="number" data-validation-allowing="range[1;100]">
<!-- Only allowing numbers from -50 to 30 -->
<input type="text" data-validation="number" data-validation-allowing="range[-50;30],negative">
<!-- Only allowing numbers from 0.05 to 0.5 -->
<input type="text" data-validation="number" data-validation-allowing="range[0.05;0.5],float">
You can also define the decimal separator when initializing the validation.
<p>
<strong>Average points</strong><br>
<input type="text" data-validation="number" data-validation-allowing="float">
</p>
....
</form>
<script>
$.validate({
decimalSeparator : ','
});
</script>
Inputs of type "number" will also become validated by loading the html5 module.
<input type="text" data-validation="email">
Inputs of type "email" will also become validated by loading the html5 module.
<input type="text" data-validation="url">
Inputs of type "url" will also become validated by loading the html5 module.
<!-- Validate date formatted yyyy-mm-dd -->
<input type="text" data-validation="date">
<!-- Validate date formatted yyyy-mm-dd but dont require leading zeros -->
<input type="text" data-validation="date" data-validation-require-leading-zero="false">
<!-- Validate date formatted dd/mm/yyyy -->
<input type="text" data-validation="date" data-validation-format="dd/mm/yyyy">
See the date module for further validators.
<!-- This input requires an answer that contains only letters a-z and/or numbers -->
<input type="text" data-validation="alphanumeric">
<!-- This input requires the same as the one above but it also allows hyphen and underscore -->
<input type="text" data-validation="alphanumeric" data-validation-allowing="-_">
If you want to allow any kind of letters (not only A-Z) you're looking for the letternumeric validator.
Validate qty of checkboxes in a group (same name) have been checked, using min, max or range. Only the first checkbox element in the group needs to have the validation attributes added.
<!-- Require checkboxes in this group, min1 -->
<input type="checkbox" name="newsletters[]" data-validation="checkbox_group" data-validation-qty="min1">
<!-- Require checkboxes in this group, max3 -->
<input type="checkbox" name="newsletters[]" data-validation="checkbox_group" data-validation-qty="max3">
<!-- Require checkboxes in this group, min1, max4 -->
<input type="checkbox" name="newsletters[]" data-validation="checkbox_group" data-validation-qty="1-4">
If your checkboxes group is generated by a server-side script and you don't want to add the validation attributes to each input element, you can use this javascript snippet before calling the validatorLoad() function
<!-- Add validation attributes to first input element in
checkboxes group, before loading validator -->
<script>
$("[name='newsletters[]']:eq(0)")
.valAttr('','validate_checkbox_group')
.valAttr('qty','1-2')
.valAttr('error-msg','chose 1, max 2');
</script>
Regexp
<!-- This input would only allow lowercase letters a-z -->
<input type="text" data-validation="custom" data-validation-regexp="^([a-z]+)$">
This plugin also supports the attribute "pattern" by using the Html5 module.
<p>
History (<span id="maxlength">50</span> characters left)
<textarea rows="3" id="area"></textarea>
</p>
<script>
$('#area').restrictLength($('#maxlength'));
</script>
<!-- This input will only be validated if a value is given -->
<input type="text" data-validation="url" data-validation-optional="true">
You can also use the logic module if you want the validation of an input depend on another input having a value.
It is possible to display help information beside each input. The text will fade in when the input gets focus on and fade out when the input looses focus. The container for the help text will have the class form-help. If you don't want this feature you can read the setup guide on how to disable it.
<form action="" id="some-form">
<p>
<strong>Why not?</strong>
<input name="why" data-validation-help="Please give us some more information">
</p>
...
</form>
By default each input will become validated immediately when the input looses focus. If you don't want this feature you can read the setup guide on how to disable it.
There are two ways you can give suggestions to the user while the user types.
1) Using attribute data-suggestions
<p>
What's your favorite color?
<input name="color" data-suggestions="White, Green, Blue, Black, Brown">
</p>
...
</form>
2) Using $.formUtils.suggest()
<script>
var largeArray = [];
largeArray.push('Something');
largeArray.push('Something else');
...
$.formUtils.suggest( $('#the-input'), largeArray );
</script>
This plugin also supports the data-list element by using the Html5 module.
Ignoring characters You can tell any validator to ignore certain characters by using the attribute data-validation-ignore (comma separated list).
<p>
How much do you want to donate?
<!-- Make it optional to end the amount with a dollar-sign -->
<input name="color" data-validation="number" data-validation-ignore="$">
</p>
This validator can be used to validate that the values of two inputs are the same. The first input should have a name suffixed with _confirmation and the second should have the same name but without the suffix.
<p>
Password (at least 8 characters)
<input name="pass_confirmation" data-validation="length" data-validation-length="min8">
Confirm password
<input name="pass" data-validation="confirmation">
</p>
<p>
E-mail
<input name="user-email" data-validation="email" />
Repeat e-mail
<input name="repeat" data-validation="confirmation" data-validation-confirm="user-email" />
</p>
Use this validator to make sure that your user has a strong enough password. Set attribute data-validation-strength
to 1, 2 or 3 depending on how strong password you require.
If you want the strength of the password to be displayed while the user types you call displayPasswordStrength()
in the end of the form.
<form action="">
<p>
<strong>Password:</strong>
<input name="pass" type="password" break=""
data-validation="strength" break="" data-validation-strength="2">
</p>
...
</form>
<script src="https://github.com/victorjonsson/jQuery-Form-Validator/raw/master//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script src="https://github.com/victorjonsson/jQuery-Form-Validator/raw/master//cdnjs.cloudflare.com/ajax/libs/jquery-form-validator/2.3.26/jquery.form-validator.min.js"></script>
<script>
$.validate({
modules : 'security',
onModulesLoaded : function() {
var optionalConfig = {
fontSize: '12pt',
padding: '4px',
bad : 'Very bad',
weak : 'Weak',
good : 'Good',
strong : 'Strong'
};
$('input[name="pass"]').displayPasswordStrength(optionalConfig);
}
});
</script>
By using this validator you can validate the value given by the user on the server before the form gets submitted. The validation function will send a POST request to the URL declared in data-validation-url
. The argument posted to the URL will have the same name as the input being validated.
The form will get the class validating-server-side while the server is being requested.
The response from the validation script must be a JSON formatted object, containing the properties "valid" and "message".
{
"valid" : true|false,
"message" : "String with text that should be displayed as error message"
}
<form action="">
<p>
<strong>User name:</strong>
<input name="user" data-validation="server" data-validation-url="/validate-input.php">
</p>
...
</form>
<?php
$response = array(
'valid' => false,
'message' => 'Post argument "user" is missing.'
);
if( isset($_POST['user']) ) {
$userRepo = new UserRepository( DataStorage::instance() );
$user = $userRepo->loadUser( $_POST['user'] );
if( $user ) {
// User name is registered on another account
$response = array('valid' => false, 'message' => 'This user name is already registered.');
} else {
// User name is available
$response = array('valid' => true);
}
}
echo json_encode($response);
Modifying the server request
The parameter containing the input value, sent to the server, will by default have the same name as the input. You can however set your own parameter name by using the attribute data-validation-param-name
. You can also send along other parameters to the server by using the attribute data-validation-req-params
.
<?php
$json = json_encode(array('user'=>$user->get('ID')));
?>
<p>
<strong>E-mail:</strong>
<input type="email" name="check-email" data-validation="server"
data-validation-url="/validate-form-input.php"
data-validation-param-name="email"
data-validation-req-params="<?php echo $json ?>" />
</p>
This validator makes it possible to validate any of the credit cards VISA, Mastercard, Diners club, Maestro, CJB, Discover and American express
<-- Accept credit card number from Visa, Mastercard and American Express -->
<p>
Credit card number
<input data-validation="creditcard" data-validation-allowing="visa, mastercard, amex" />
</p>
<p>
Security code (cvv)
<input name="cvv" data-validation="cvv" />
</p>
You can also let the user choose a credit card and programmatically change the allowed credit card on the input of the card number.
<p>
Credit card
<select name="credit-card" id="credit-card">
<option value="visa">VISA</option>
<option value="mastercard">Mastercard</option>
<option value="amex">American express</option>
<option value="diners_club">Diners club</option>
<option value="discover">Discover</option>
<option value="cjb">CJB</option>
<option value="maestro">Maestro</option>
</select>
</p>
<p>
Credit card number
<input name="creditcard_num" data-validation="creditcard" data-validation-allowing="visa" />
</p>
...
</div>
<script>
$.validate({
modules : 'security',
onModulesLoaded : function() {
// Bind card type to card number validator
$('#credit-card').on('change', function() {
var card = $(this).val();
$('input[name="creditcard_num"]').attr('data-validation-allowing', card);
});
}
});
</script>
<?php
session_start();
if( isset($_POST['captcha']) && isset($_SESSION['captcha'])) {
if( $_POST['captcha'] != ($_SESSION['captcha'][0]+$_SESSION['captcha'][1]) ) {
die('Invalid captcha answer'); // client does not have javascript enabled
}
// process form data
...
}
$_SESSION['captcha'] = array( mt_rand(0,9), mt_rand(1, 9) );
?>
<form action="">
<p>
What is the sum of <?=$_SESSION['captcha'][0]?> + <?=$_SESSION['captcha'][1]?>?
(security question)
<input name="captcha" data-validation="spamcheck"
data-validation-captcha="<?=( $_SESSION['capthca'][0] + $_SESSION['captcha'][1] )?>"/>
</p>
<p><input type="submit" /></p>
</form>
Use this validator if wanting to integrate the Google service reCAPTCHA.
<p>
<input data-validation="recaptcha" data-validation-recaptcha-sitekey="[RECAPTCHA_SITEKEY]">
</p>
You can also use the setup function to configure the recaptcha service.
$.validate({
reCaptchaSiteKey: '...',
reCaptchaTheme: 'light'
});
By using the validator letternumeric
you can validate that given input value only contains letters and/or numbers. This validator allows any type of character in contrast to the alphanumeric validator, which only allows letters A-Z.
<!-- This input requires an answer that contains only letters and/or numbers -->
<input type="text" data-validation="letternumeric">
<!-- This input requires the same as the one above but it also allows hyphen and underscore -->
<input type="text" data-validation="alphanumeric" data-validation-allowing="-_">
This validator is the same as the default date validator except that it only allows past dates and dates that is not older than 120 years.
<!-- Validate birth date formatted yyyy-mm-dd -->
<input type="text" data-validation="birthdate">
<!-- Validate birthdate formatted yyyy-mm-dd but dont require leading zeros -->
<input type="text" data-validation="birthdate" data-validation-require-leading-zero="false">
<!-- Validate birth date formatted dd/mm/yyyy -->
<input type="text" data-validation="birthdate" data-validation-format="dd/mm/yyyy">
<!-- Validate time formatted HH:mm -->
<input type="text" data-validation="time">
<!-- Validate country (english only) -->
<input type="text" data-validation="country"/>
<!-- Validate US state -->
<input type="text" data-validation="federatestate"/>
<!-- Validate longitude and latitude (eg 40.714623,-74.006605) -->
<input type="text" data-validation="longlat"/>
By using this function you'll make it easier for your visitor to input a country or state.
<form action="">
...
<p>
<strong>Which country are you from?</strong>
<input name="user_country" data-validation="country"/>
</p>
<p>
<strong>Which state do you live in?</strong>
<input name="user_home_state" data-validation="federatestate"/>
</p>
</form>
</div>
<script src="https://github.com/victorjonsson/jQuery-Form-Validator/raw/master//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script src="https://github.com/victorjonsson/jQuery-Form-Validator/raw/master//cdnjs.cloudflare.com/ajax/libs/jquery-form-validator/2.3.26/jquery.form-validator.min.js"></script>
<script>
$.validate({
modules : 'location',
onModulesLoaded : function() {
$('input[name="user_country"]').suggestCountry();
$('input[name="user_home_state"]').suggestState();
}
});
</script>
This validation is only supported by Internet Explorer 10, Mozilla FireFox v >= 3.6 and any of the later versions of webkit based browsers.
<!-- Validate that file isn't larger than 512 kilo bytes -->
<input type="file" data-validation="size" data-validation-max-size="512kb" />
<!-- Validate that file isn't larger than 3 mega bytes -->
<input type="file" data-validation="size" data-validation-max-size="3M" />
This validation will fall back on checking the file extension in older browsers. In modern browsers the validation will check that any of the extensions in data-validation-allowing
exists in the mime type declaration of the file. This means that data-validation-allowing="pdf"
will work in both modern browsers (checking against "application/pdf") and older browsers (checking the file extension ".pdf").
<!-- Validate that file is an image of type JPG, GIF or PNG and not larger than 2 mega bytes -->
<input type="file" data-validation="mime size" break0="" data-validation-allowing="jpg, png, gif" break=""
data-validation-max-size="2M" />
<!-- Validate that a file is given and that it has .txt as extension -->
<input type="file" data-validation="required extension" data-validation-allowing="txt" />
Validating multiple files (with separate error messages depending on failed validation):
<input type="file" multiple="multiple" name="images"
data-validation="length mime size"
data-validation-length="min2"
data-validation-allowing="jpg, png, gif"
data-validation-max-size="512kb"
data-validation-error-msg-size="You can not upload images larger than 512kb"
data-validation-error-msg-mime="You can only upload images"
data-validation-error-msg-length="You have to upload at least two images"
/>
Use the validator dimension
to check the dimension of an image (jpg, gif or png).
<!-- Validate that the image is no smaller than 100x100px -->
<input data-validation="dimension mime" data-validation-allowing="jpg" break="" data-validation-dimension="min100" />
<!-- Validate that the image is no smaller than 300x500 px (width/height) -->
<input data-validation="dimension mime" data-validation-allowing="jpg" break="" data-validation-dimension="min300x500" />
<!-- Validate that the image is no larger than 500x1000 px -->
<input data-validation="dimension mime" data-validation-allowing="jpg" break="" data-validation-dimension="max500x1000" />
<!-- Validate that the image is no smaller than 100x100 px and no larger than 800x800 -->
<input data-validation="dimension mime" data-validation-allowing="jpg" break="" data-validation-dimension="100-800" />
<!-- Validate that the image is no smaller than 200x400 px and no larger than 600x1200 -->
<input data-validation="dimension mime" data-validation-allowing="jpg" break="" data-validation-dimension="200x400-600x1200" />
Use the attribute data-validation-ratio
to validate that the uploaded image has a certain ratio
<!-- Validate that only square images gets uploaded -->
<input data-validation="ratio mime" data-validation-allowing="jpg, png, gif" break="" data-validation-dimension="min100" data-validation-ratio="1:1" />
<!-- Validate that only somewhat square images gets uploaded -->
<input data-validation="ratio mime" data-validation-allowing="jpg" break="" data-validation-dimension="min100" data-validation-ratio="8:10-12:10" />
Use the attributes data-validation-depends-on
to configure that an input is optional as long as another input is left without an answer.
<!-- Require e-mail only if checkbox is checked -->
<p>
<strong>Contact me:</strong>
<input name="do-contact" type="checkbox" value="1" />
</p>
<p>
<strong>E-mail:</strong>
<input
type="text"
data-validation="email"
data-validation-depends-on="do-contact"
/>
</p>
<!-- Require a state to be given if the user comes from either USA or Canada -->
<p>
<strong>Country:</strong>
<input
type="text"
name="country"
id="country-input"
data-validation="country"
/>
</p>
<p>
<strong>State:</strong>
<input type="text"
name="state" break=""
data-validation="required" break1=""
data-validation-depends-on="country" break2=""
data-validation-depends-on-value="usa, canada"
/>
</p>
</div>
...
<script src="https://github.com/victorjonsson/jQuery-Form-Validator/raw/master//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script src="https://github.com/victorjonsson/jQuery-Form-Validator/raw/master//cdnjs.cloudflare.com/ajax/libs/jquery-form-validator/2.3.26/jquery.form-validator.min.js"></script>
<script>
$.validate({
modules : 'location, logic',
onModulesLoaded : function() {
$('#country-input').suggestCountry();
}
});
</script>
Use the attribute data-validation-optional-if-answered
to tell the validator that only one, out of a group of inputs, requires an answer.
<p>
<strong>Home phone number:</strong>
<input name="home-phone"
data-validation="number" break=""
data-validation-optional-if-answered="cell-phone, work-phone" />
</p>
<p>
<strong>Cell phone number:</strong>
<input name="cell-phone"
data-validation="number" break=""
data-validation-optional-if-answered="home-phone, work-phone" />
</p>
<p>
<strong>Work phone number:</strong>
<input name="work-phone"
data-validation="number" break=""
data-validation-optional-if-answered="home-phone, cell-phone" />
</p>
</div>
errorMessagePosition
is now only used to point out where error message should be placed. New configuration parameters is introduced that handles custom positioning of error messages #226data-validation-ignore
to filter out certain characters before validationstrip
that removes defined charactersdata-validation-require-leading-zero="false"
data-validation-if-checked
now deprecated, use data-validation-depends-on
instead #153beforeValidation
now gets value, language and configuration as arguments and can be used to prevent validation of the input.recaptcha
validator that uses Google reCaptcha 2uknin
ukutr
data-validation-depends-on
and data-validation-optional-if-answered
letternumeric
. Validates that input consists out of any type of letter (not only alphanumeric) and/or numbersonValidate