Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Can someone suggest an HTML oninvalid Event Attribute work around in the context of my code?

Does anyone have a work around for Safari and google chrome for the HTML oninvalid Event Attribute not correctly working? In the context of my application, within the name field at first, I inputted an invalid answer which was a number, then after I corrected the answer to a valid input. However, the input "ededde" didn’t work which is a valid input that should be accepted. Here is my demonstration video. I believe this attribute isn’t supported anymore or there is a browser glitch with the attribute?

What alternative method could I use, which would allow me to manually customise the error message for each input field and correctly work when the user changes their input from invalid to valid? I saw one solution one stack overflow, but the solution didn’t cover multiple different input fields like my example code.

In additon, I was also reading another post and I saw someone wrote a JS script but the code appeared to be very complex for this sort of task. Therefore, I thought in the context of my code to get some guidance I would make this post as I’m really having trouble overcoming this glitch or unsupported attribute problem or a syntax erorr which I possibly made.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

Below is my code which is relevant to the issue, if you need to see more let me know.

MY CODE

<div class="mb-3 text-white">
   <label>Name</label>
   <input
      type="text"
      name="name"
      pattern="[A-Za-z]"
      oninvalid="alert('NAME ERROR: Please eneter characters only.');" required>
</div>
<div class="mb-3 text-white">
   <label>Barcode</label>
   <input
      type="text"
      name="barcode"
      oninvalid="alert('BARCODE ERROR: Please input barcode here.');" required>
</div>
<div class="mb-3 text-white">
   <label>Email</label>
   <input
      type="email"
      name="email"
      oninvalid="alert('EMAIL ERROR: Please input email here.');" 
      required
      >
</div>

>Solution :

That is because your pattern only accepts a single alphabet: [A-Za-z]. To accept an alphabetical string that has length of 1 or more, you need to add a + at the end, i.e. [A-Za-z]+:

// This JS is only for demo purposes, so that a successful validation will not submit the form in the demo snippet
document.querySelector('#my-form').addEventListener('submit', e => {
  console.log('Form valid! Will submit, but submission is prevented for demo purposes');
  e.preventDefault();
});
<form id="my-form">
  <div class="mb-3 text-white">
    <label>Name</label>
    <input type="text" name="name" pattern="[A-Za-z]+" oninvalid="alert('NAME ERROR: Please eneter characters only.');" required>
  </div>
  <button>Submit</button>
</form>

On a side note, I strongly suggest not using inline JS. What you want to do can be easily done in JS: and you can also store the intended error message in data- attributes for convenience:

// This JS is only for demo purposes, so that a successful validation will not submit the form in the demo snippet
document.querySelector('#my-form').addEventListener('submit', e => {
  console.log('Form valid! Will submit, but submission is prevented for demo purposes');
  e.preventDefault();
});

document.querySelectorAll('input').forEach(el => {
  const invalidMessageElement = el.nextElementSibling;
  el.addEventListener('invalid', () => {
    invalidMessageElement.textContent = el.dataset.invalidMessage;
    invalidMessageElement.classList.add('visible');
  });
  
  el.addEventListener('input', () => {
    invalidMessageElement.textContent = '';
    invalidMessageElement.classList.remove('visible');
  });
});
.invalid-message {
  display: none;
  color: red;
}

.invalid-message.visible {
  display: inline;
}
<form id="my-form">
  <div class="mb-3 text-white">
    <label>Name</label>
    <input type="text" name="name" pattern="[A-Za-z]+" required data-invalid-message="Please enter characters only."><span class="invalid-message"></span>
  </div>
  <div class="mb-3 text-white">
    <label>Barcode</label>
    <input type="text" name="barcode" required data-invalid-message="Please input barcode here."><span class="invalid-message"></span>
  </div>
  <div class="mb-3 text-white">
    <label>Email</label>
    <input type="email" name="email" required data-invalid-message"Please input email here."><span class="invalid-message"></span>
  </div>
  <button>Submit</button>
</form>
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading