diff options
| author | patrickhlauke <[email protected]> | 2019-07-07 23:15:55 +0100 |
|---|---|---|
| committer | patrickhlauke <[email protected]> | 2019-07-08 00:00:18 +0100 |
| commit | 42c55c1b0936e1ca8a0b313697ba2aa59bfe78a0 (patch) | |
| tree | 08e3bb985bce5bc233da6b0ad68763c0ae5fe770 /site | |
| parent | 08bddb8743cb5328c9211e93898aff9ecba88c80 (diff) | |
| download | bootstrap-patrickhlauke-form-validation.tar.xz bootstrap-patrickhlauke-form-validation.zip | |
Initial naive form validation fixpatrickhlauke-form-validation
Diffstat (limited to 'site')
| -rw-r--r-- | site/content/docs/4.3/components/forms.md | 76 |
1 files changed, 48 insertions, 28 deletions
diff --git a/site/content/docs/4.3/components/forms.md b/site/content/docs/4.3/components/forms.md index 659385a73..bd2d823ec 100644 --- a/site/content/docs/4.3/components/forms.md +++ b/site/content/docs/4.3/components/forms.md @@ -745,17 +745,13 @@ Custom feedback styles apply custom colors, borders, focus styles, and backgroun <div class="form-row"> <div class="col-md-4 mb-3"> <label for="validationCustom01">First name</label> - <input type="text" class="form-control" id="validationCustom01" value="Mark" required> - <div class="valid-feedback"> - Looks good! - </div> + <input type="text" class="form-control" id="validationCustom01" data-validation-container="validationCustom01-feedback" data-validation-valid="Looks good!" value="Mark" required> + <div class="form-validation-feedback" id="validationCustom01-feedback"></div> </div> <div class="col-md-4 mb-3"> <label for="validationCustom02">Last name</label> - <input type="text" class="form-control" id="validationCustom02" value="Otto" required> - <div class="valid-feedback"> - Looks good! - </div> + <input type="text" class="form-control" id="validationCustom02" data-validation-container="validationCustom02-feedback" data-validation-valid="Looks good!" value="Otto" required> + <div class="form-validation-feedback" id="validationCustom02-feedback"></div> </div> <div class="col-md-4 mb-3"> <label for="validationCustomUsername">Username</label> @@ -763,48 +759,38 @@ Custom feedback styles apply custom colors, borders, focus styles, and backgroun <div class="input-group-prepend"> <span class="input-group-text" id="inputGroupPrepend">@</span> </div> - <input type="text" class="form-control" id="validationCustomUsername" aria-describedby="inputGroupPrepend" required> - <div class="invalid-feedback"> - Please choose a username. - </div> + <input type="text" class="form-control" id="validationCustomUsername" data-validation-container="validationCustomUsername-feedback" data-validation-invalid="Please choose a username." aria-describedby="inputGroupPrepend" required> + <div class="form-validation-feedback" id="validationCustomUsername-feedback"></div> </div> </div> </div> <div class="form-row"> <div class="col-md-6 mb-3"> <label for="validationCustom03">City</label> - <input type="text" class="form-control" id="validationCustom03" required> - <div class="invalid-feedback"> - Please provide a valid city. - </div> + <input type="text" class="form-control" id="validationCustom03" data-validation-container="validationCustom03-feedback" data-validation-invalid="Please provide a valid city." required> + <div class="form-validation-feedback" id="validationCustom03-feedback"></div> </div> <div class="col-md-3 mb-3"> <label for="validationCustom04">State</label> - <select class="custom-select" id="validationCustom04" required> + <select class="custom-select" id="validationCustom04" data-validation-container="validationCustom04-feedback" data-validation-invalid="Please select a valid state." required> <option selected disabled value="">Choose...</option> <option>...</option> </select> - <div class="invalid-feedback"> - Please select a valid state. - </div> + <div class="form-validation-feedback" id="validationCustom04-feedback"></div> </div> <div class="col-md-3 mb-3"> <label for="validationCustom05">Zip</label> - <input type="text" class="form-control" id="validationCustom05" required> - <div class="invalid-feedback"> - Please provide a valid zip. - </div> + <input type="text" class="form-control" id="validationCustom05" data-validation-container="validationCustom05-feedback" data-validation-invalid="Please provide a valid zip." required> + <div class="form-validation-feedback" id="validationCustom05-feedback"></div> </div> </div> <div class="form-group"> <div class="form-check"> - <input class="form-check-input" type="checkbox" value="" id="invalidCheck" required> + <input class="form-check-input" type="checkbox" value="" id="invalidCheck" data-validation-container="invalidCheck-feedback" data-validation-invalid="You must agree before submitting." required> <label class="form-check-label" for="invalidCheck"> Agree to terms and conditions </label> - <div class="invalid-feedback"> - You must agree before submitting. - </div> + <div class="form-validation-feedback" id="invalidCheck-feedback"></div> </div> </div> <button class="btn btn-primary" type="submit">Submit form</button> @@ -825,6 +811,40 @@ Custom feedback styles apply custom colors, borders, focus styles, and backgroun event.stopPropagation(); } form.classList.add('was-validated'); + + /* go through all form controls */ + var formControls = form.querySelectorAll(".form-control, form-control-range, .form-check-input"); + formControls.forEach(formControl => { + var validationContainer = formControl.dataset.validationContainer; + /* if the control has data-validation-container */ + if (validationContainer) { + var formControlDescribedby = formControl.getAttribute('aria-describedby'); + if (!formControlDescribedby) { + /* if it doesn't have aria-describedby, add it and point it to the data-validation-container */ + formControl.setAttribute('aria-describedby', validationContainer) + } else if (formControlDescribedby.indexOf(validationContainer) === -1) { + /* if it has aria-describedby, but it didn't include data-validation-container, add it */ + formControl.setAttribute('aria-describedby', formControlDescribedby + " " + validationContainer) + } + var validationContainerElement = document.getElementById(validationContainer); + /* empty the validation container */ + validationContainerElement.innerHTML = null; + /* depending on whether the control is valid or invalid, set the correct class and content for the feedback */ + if (formControl.checkValidity()) { + validationContainerElement.classList.remove('invalid-feedback'); + if (formControl.dataset.validationValid) { + validationContainerElement.innerHTML = formControl.dataset.validationValid; + validationContainerElement.classList.add('valid-feedback'); + } + } else { + validationContainerElement.classList.remove('valid-feedback'); + if (formControl.dataset.validationInvalid) { + validationContainerElement.innerHTML = formControl.dataset.validationInvalid; + validationContainerElement.classList.add('invalid-feedback'); + } + } + } + }) }, false); }); }, false); |
