I've found that when trying to prevent form submission that I thought I could use event.preventDefault()
via the regular onsubmit
event listener.
This method does work for when the form is submitted either by hitting the Enter key within a form's input, or by pressing the form's submit button.
I found that it was not prevented when the form was triggered with HTMLFormElement.submit()
, when I was doing some tests in the browser to see how I could exploit it.
I was surprised to see that this submit method doesn't trigger an event, effectively allowing someone within the client to bypass any form validation, either be it imposed via HTML or JS.
How can I prevent form submission when triggered by HTMLFormElement.submit()
?
Here's an example (Codepen):
<script>
var $form = document.getElementById("my-form");
var $input = document.getElementById("restricted-input");
var $notice = document.getElementById("notice");
var $submitForm = document.getElementById("submit-form");
var $requestSubmitForm = document.getElementById("request-submit-form");
var $resetForm = document.getElementById("reset-form");
$form.addEventListener("submit", function (event) {
event.preventDefault();
$notice.innerHTML = "Submitted: " + $input.value;
});
$submitForm.addEventListener("click", function (event) {
event.preventDefault();
$notice.innerHTML = "";
$form.submit();
});
$requestSubmitForm.addEventListener("click", function (event) {
event.preventDefault();
$notice.innerHTML = "";
$form.requestSubmit();
});
$resetForm.addEventListener("click", function (event) {
event.preventDefault();
$notice.innerHTML = "";
$form.reset();
});
</script>
<form id="my-form" action="/" method="post">
<input id="restricted-input" type="text" pattern="^[a-z]+$" required />
<button type="submit">Submit</button>
</form>
<p id="notice"></p>
<p>
<a id="submit-form" href="javascript:void 0">form.submit()</a><br/>
<a id="request-submit-form" href="javascript:void 0">form.requestSubmit()</a><br/>
<a id="reset-form" href="javascript:void 0">Reset form</a>
</p>
Edit: Please read the question in its entirety before answering. Answers that mention jQuery, onsubmit
or event.preventDefault()
as part of the resolution will be downvoted.