Подскажите почему не срабатывает e.preventDefault()

148
29 июля 2019, 02:40

https://codepen.io/vladlerOK/pen/JwZxOZ

var scriptURL = 'https://script.google.com/macros/s/AKfycbz_YY59bLifVrQo66V3r5Me4_uU8qByuwmo1CUr0KlSdAITx5Q/exec';
submit.onclick = function(e) {
  e.preventDefault();
  // formObj.find('.form-group').slideUp();
  $("form").find('.loader').fadeIn();
  var formData = new FormData(document.forms.formw);
  var phoneWa = $("#secondSelect").val() + $('input[name="phone"]').val();
  formData.set('phone', phoneWa);

  fetch(scriptURL, {
    method: 'POST',
    body: formData
  }).then(function() {
    setTimeout(function(e) {
      window.location.href = "/thanks.html";
    }, 200)
  }).catch(function(error) {
    formObj.find('.loader').fadeOut();
    console.error('Error!', error.message);
  });
};
Answer 1

В коде все плохо: на одну кнопку добавлен и обработчик jQuery, и нативный обработчик через присваивание onclick.

Submit вне формы не вызывает отправку формы, если не установлен атрибут form.

В данном случае атрибут не установлен, поэтому отправка формы не будет выполнена в любом случае, и можно убрать вызов e.preventDefault() как ненужный.

Что происходит на самом деле?

Проверки выполняются в обработчике добавленном jQuery, что никак не влияет на обработчик добавленный через .onclick =.

Из-за отсутствия проверок в последнем обработчике идет простой вызов fetch и редирект.

Лобовым решением может стать вызов e.stopImmediatePropagation(); в случае когда запрос не должен быть послан в обработчике добавленном в jquery.

Лучшим решением было бы переписать полностью разметку и все обработчики в едином стиле.

READ ALSO
Сортировка всех столбцов по убыванию DataGridView

Сортировка всех столбцов по убыванию DataGridView

Таблица заполняется рандомные цифрами и по нажатии на кнопку все столбцы должны быть отсортированы по убываниюПопробовал написать вот такой...

172
C# Application.Current.Dispatcher == null

C# Application.Current.Dispatcher == null

Пытаюсь обновить UI из другого потока, все вроде работает, но иногда ApplicationCurrent

130