input-validator.js 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. export default function inputValidator(inputEl) {
  2. const messageEl = document.createElement('div')
  3. messageEl.className =
  4. inputEl.getAttribute('data-ol-validation-message-classes') ||
  5. 'small text-danger mt-2'
  6. messageEl.hidden = true
  7. inputEl.insertAdjacentElement('afterend', messageEl)
  8. // Hide messages until the user leaves the input field or submits the form.
  9. let canDisplayErrorMessages = false
  10. // Handle all kinds of inputs.
  11. inputEl.addEventListener('input', handleUpdate)
  12. inputEl.addEventListener('change', handleUpdate)
  13. // The user has left the input field.
  14. inputEl.addEventListener('blur', displayValidationMessages)
  15. // The user has submitted the form and the current field has errors.
  16. inputEl.addEventListener('invalid', e => {
  17. // Block the display of browser error messages.
  18. e.preventDefault()
  19. // Force the display of messages.
  20. inputEl.setAttribute('data-ol-dirty', '')
  21. displayValidationMessages()
  22. })
  23. function handleUpdate() {
  24. // Mark an input as "dirty": the user has typed something in at some point
  25. inputEl.setAttribute('data-ol-dirty', '')
  26. // Provide live updates to content sensitive error message like this:
  27. // Please include an '@' in the email address. 'foo' is missing an '@'.
  28. // We should not leave a stale message as the user types.
  29. updateValidationMessageContent()
  30. }
  31. function displayValidationMessages() {
  32. // Display all the error messages and highlight fields with red border.
  33. canDisplayErrorMessages = true
  34. updateValidationMessageContent()
  35. }
  36. function updateValidationMessageContent() {
  37. if (!canDisplayErrorMessages) return
  38. if (!inputEl.hasAttribute('data-ol-dirty')) return
  39. if (inputEl.validity.valid) {
  40. messageEl.hidden = true
  41. // Require another blur before displaying errors again.
  42. canDisplayErrorMessages = false
  43. } else {
  44. messageEl.textContent = inputEl.validationMessage
  45. messageEl.hidden = false
  46. }
  47. }
  48. }