Как отправить форму, которая была перехвачена с помощью event.preventDefault ()

0

У меня простая форма ванили с id = "edit_profile".

Когда форма отправлена, я хочу ее перехватить и проверить, нужно ли мне геокодировать адрес через google-карты api, и если не продолжать и представить в любом случае.

Что-то вроде:

$('#edit_profile').on('submit', function(event) {
    event.preventDefault();
    if ( some test ) {
        geocode_address( address, this ); // the api callback will handle form submit
    } else {
    // we want to go ahead and submit the form
    this.submit();
    }
});

Проблема заключается в том, что this.submit() выбрасывает ошибку TypeError: Property 'submit' of object #<HTMLFormElement> is not a function

Я недавно что-то прочитал, но теперь не могу найти, что нужно использовать собственный JavaScript для отправки формы, а не jQuery (я предполагаю, что обработчик события jQuery для формы submit уже был указан для предотвращенияDefault).

Но если я попробую вариант, например document.getElementById('edit_profile').submit(); или document.forms[0].submit(); Я получаю ту же ошибку или около нее.

Теги:
forms
form-submit
preventdefault

3 ответа

0
Лучший ответ

Я отвечаю на собственный вопрос, потому что решение было настолько неожиданным и простым, что оно повторяется. Полный кредит Крису Батлеру для ответа на этот связанный вопрос: Невозможно "отправить()" форму html после перехвата отправки с помощью javascript (заметьте, его не был принят).

Ответ: если вы назовете & #id ваши кнопки отправки "submit", которые столкнутся с именем встроенного метода JavaScript.submit(), который больше не будет работать и даст ошибку типа, описанную в вопросе.

Поэтому решение в моем случае состояло в том, чтобы переименовать мою кнопку отправки в другое.

Напомним:

Чтобы перехватить отправку формы, вы можете перехватить щелчок на кнопке отправки или перехватить представление формы. Если ваша цель - перехватить отправку формы, тогда сделайте это, а не событие click на кнопке submit, так как формы могут быть отправлены другими событиями, такими как нажатие ввода в текстовое поле.

Если вы перехватите форму через jQuery с помощью, например, $("#myForm").on("submit", function() {...}) а затем продолжайте передавать обработку отправки другой функции (например, как в вопрос о вызове геокодирования api), то эта функция должна будет инициировать отправку формы посредством непосредственного действия на элемент формы DOM (например, 'document.getElementById(' myForm '). submit()), который будет отправлять формы, не вызывая событие onsubmit, чтобы начальный перехват не запускался снова, создавая бесконечный цикл, как если бы вы использовали jQuery для запуска submit.

2

Элементы DOM не имеют метода .submit - но объекты jQuery (только для элементов form) - в основном, вы забыли обернуть this в jQuery:

$(this).submit();

Ссылка: https://api.jquery.com/submit/

Редактировать:

Я вижу, откуда вы получаете сценарий с бесконечным циклом. Фактически вы должны установить, чтобы обработчик запускался, когда вы нажимаете кнопку "Отправить" button а не "фактический".

На данный момент вы обнаруживаете, что формы submit действие и предотвращают действие по умолчанию (которое отправляется), - тогда вы делаете что-то и вызываете submit на this. Хорошо, что вызовет обработчик для формы submit, что снова предотвратит действие по умолчанию! Итак, словом, поставьте обработчик на кнопку "Отправить", запретите действие по умолчанию, выполните логику, затем вызовите $("#edit_profile").submit()

  • 0
    В самом деле? Я часто читал о нативной отправке формы javascript, например, здесь: w3schools.com/jsref/met_form_submit.asp Обтекание 'this', чтобы сделать его объектом jQuery, создает бесконечный цикл.
  • 0
    Включение this в объект jQuery НЕ устанавливает бесконечный цикл, вам нужно все время использовать $(this) в jQuery!
Показать ещё 5 комментариев
0

Почему бы не переупорядочить код что-то вроде этого

$('#edit_profile').on('submit', function(event) {
  if ( some test ) {
    event.preventDefault();
    geocode_address( address, this ); // the api callback will handle form submit
  } else {
    // we want to go ahead and submit the form
    // this.submit(); // no need to call explicitly
  }
});

Это не сработает, если вы хотите иметь обратный вызов в some test но это не похоже на ваш код.

  • 0
    Спасибо amitamb. Заметьте, что в вашем примере предложение else {} на самом деле является избыточным, потому что после сбоя теста if в конце анонимной функции есть неявный возврат true, который в любом случае инициирует отправку.
  • 0
    Спасибо @terraling, обновлено.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню