Захват события отправки HTML-формы, вызванного событием нажатия кнопки - PullRequest
0 голосов
/ 25 мая 2019

Это кажется простой проблемой, но я не могу заставить ее работать.

У меня есть фрагмент кода, который нельзя изменить (среда CMS):

document.getElementById('mybutton').addEventListener('click', function (event) {
  document.getElementById('myform').submit();
});

HTML-разметка выглядит примерно так:

<form id="myform" onsubmit="return helloworld(event);">
  <button id="mybutton">click to submit</button>
</form>

Единственная часть, где разметка не может быть изменена, это то, что кнопка должна существовать внутри формы.

Я пробовал использовать onsubmit, пробовалиспользование чистого JS для захвата события отправки, а также jQuery для захвата отправки, ни один из которых не работает:

function helloworld(event) {
  event.preventDefault();
  return false;
}

document.getElementById('myform').addEventListener('submit', function (event) {
  event.preventDefault();
  return false;
});

$('#myform').submit(function (event) {
  event.preventDefault();
  return false;
});

Составьте:

//this function cannot be altered
document.getElementById('mybutton').addEventListener('click', function (event) {
	document.getElementById('myform').submit();
});

//anything below this line can be altered
document.getElementById('myform').addEventListener('submit', function (event) {
	event.preventDefault();
  return false;
});

$('#myform').submit(function (event) {
	event.preventDefault();
  return false;
});

function helloworld(event) {
	event.preventDefault();
  return false;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form id="myform" onsubmit="return helloworld(event);" action="https://stackoverflow.com/">
  <!-- this button must exist inside the form -->
  <button id="mybutton">click to submit</button>
</form>

Вот jsfiddle: https://jsfiddle.net/7c8e3hns/

Любая помощь очень ценится!

Ответы [ 2 ]

0 голосов
/ 25 мая 2019

Нашел ответ https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/submit

Примечание: «Если элемент управления формы (например, кнопка отправки) имеет name или id из submit, этот метод замаскирует метод отправки формы».

Просто поместите ввод невидимой формы с id «отправить», и event.preventDefault() будет работать, не мешая при этом остальному коду в событии click.

0 голосов
/ 25 мая 2019

Как насчет изменения прослушивателя событий на прослушивание события 'click' вместо события 'submit'?И затем вместо использования event.preventDefault(); используйте event.stopPropagation(); и затем делаете то, что вы хотите?

Согласно документам Mozilla (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault):

"preventDefault() метод сообщает агенту пользователя, чтоесли событие не обрабатывается явно, его действие по умолчанию не должно выполняться, как обычно. "

Однако в этом случае оно уже явно обработано, поэтому stopPropagation() должно быть уместным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...