Предполагаю, что в случае кнопки в данном случае нужно использовать не .submit(), а trigger("submit")
Тогда будет вызван верхний обработчик 'submit', который запретит отправку формы. Можно в конце обработчика еще написать
return false;
https://learn.javascript.ru/forms-submitЧтобы отправить форму на сервер из JavaScript – нужно вызвать на элементе формы метод form.submit().
При этом само событие submit не генерируется. Предполагается, что если программист вызывает метод form.submit(), то он выполнил все проверки.
UPD
Не часто пользуюсь нативным js, а вышеуказанный код предназначен для jQuery
Проверил код, который ниже, работает.
<form id="form" method="GET">
<input type="text"/>
<button id="form-btn">Button</button>
</form>
<button id="btn">Button</button>
document.getElementById("form").addEventListener('submit', function(e) {
e.preventDefault();
console.log("Form has submited");
});
document.getElementById("btn").addEventListener('click', function(e) {
var ev = new Event("submit");
console.log("Btn click");
document.getElementById("form").dispatchEvent(ev);
});