In fact, the form might have multiple fields with the same validator rules but at least one of them is required. We can't use neither the
notEmpty validator nor HTML 5
required
attribute for all of them.
Fortunately, this can be done easily by two things.
<form id="demoForm" method="POST">
<input type="text" class="js-email-address" name="primaryEmail" placeholder="Primary email" />
<input type="text" class="js-email-address" name="secondaryEmail" placeholder="Secondary email" />
...
</form>
<script>
document.addEventListener('DOMContentLoaded', function(e) {
const fv = FormValidation.formValidation(
document.getElementById('demoForm'),
{
fields: {
email: {
selector: '.js-email-address',
validators: {
...
},
},
},
plugins: {
...
},
}
);
});
</script>
Using the class name prefixed by js-
, js-email-address
for example, is a good practice. It lets other developer in your team know that the field will be interactived by JavaScript. So it shouldn't be removed when other designers refactor the markup or CSS classes.
const fv = FormValidation.formValidation(
document.getElementById('demoForm'),
{
fields: {
email: {
selector: '.js-email-address',
validators: {
callback: {
message: 'You must enter at least one email address',
callback: function(input) {
let isEmpty = true;
const emailElements = fv.getElements('email');
for (const i in emailElements) {
if (emailElements[i].value !== '') {
isEmpty = false;
break;
}
}
if (!isEmpty) {
fv.updateFieldStatus('email', 'Valid', 'callback');
return true;
}
return false;
}
},
emailAddress: {
message: 'The value is not a valid email address'
},
},
}
},
plugins: {
...
},
}
);