Reputation: 24661
Seems like calling .submit()
on a form ignores added listeners:
document.querySelector('form').addEventListener('submit', e => {
e.preventDefault()
console.log(Object.fromEntries(new FormData(e.target)))
})
document.querySelector('#no-trigger').addEventListener('click', () => {
document.querySelector('form').submit()
})
<form>
<input name="example" id="example">
<button id="trigger">trigger listener</button>
</form>
<button id="no-trigger">don't trigger listener</button>
I would expect that clicking no-trigger
button would also trigger the listener, but it reloads the page instead.
Upvotes: 0
Views: 113
Reputation: 177975
Here is an implementation of the requestSubmit. I for some reason have to manually add the submit button to the form data
document.querySelector('form').addEventListener('submit', e => {
e.preventDefault()
const formData = new FormData(e.target)
for (var x of formData) console.log(x);
// for some reason it does not capture the named button
formData.append("edit",e.submitter ? e.submitter.value : undefined) // captures the submitter's value if available
console.log(Object.fromEntries(formData))
})
document.getElementById('triggerEdit').addEventListener('click', () => {
document.querySelector('form').requestSubmit(document.querySelector('[name=edit]'));
})
<form>
<input name="example" id="example">
<button id="trigger">trigger listener</button>
<input type="submit" name="edit" value="trigger listener using this submit button" />
</form>
<hr/>
<button id="triggerEdit">ALSO trigger listener as if the edit button had been clicked</button>
Upvotes: 0
Reputation: 44691
This is expected behavior. From MDN:
The event is not sent to the form when calling the
form.submit()
method directly.
From the spec (emphasis mine):
form.submit()
Submits the form, bypassing interactive constraint validation and without firing a submit event.
Upvotes: 4