TIL: How To Properly Dispatch A Submit Event.

A submit event is not sent to the form when calling the form.submit() method directly.

We have been building a Responsive Web Chat application. In order to provide users with a look and feel similar to a native app we decided to include page transition animations using the CSS and Javascript frameworks in our application, TailwindCSS and StimulusReflex.

At the same time a visual design change caused the submit button to be placed outside of the form. We therefore needed to trigger the submit programmatically using Javascript.

this.element.addEventListener('click', (event) => {
  event.preventDefault();
  this.form.submit());
})

This worked when we were relying on a controller POST submit and page refresh. However, once we moved our form submission and animation into a Reflex to our surprise no submit event seemed to be triggered and our Reflex was not being called. Curious!

After some googling, we discovered that form.submit() does not trigger a submit event to be dispatched. Instead of using form.submit() we chose to explicitly dispatch the submit event our Reflex was expecting and now we have a polished user interaction that feels a little closer to native.

this.element.addEventListener('click', (event) => {
  event.preventDefault();
  this.form.dispatchEvent(new Event('submit'));
})

If you’re looking for a team to help you discover the right thing to build and help you build it, get in touch.

Published on March 19, 2021