Ошибка «Отправка формы отменена, потому что форма не подключена»

157

У меня есть старый сайт с JQuery 1.7, который работает правильно до двух дней назад. Внезапно некоторые из моих кнопок больше не работают, и, нажав на них, я получаю это предупреждение в консоли:

Отправка формы отменена, так как форма не связана

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

 this.handleExcelExporter = function(href, cols) {
   var form = $('<form method="post"><input type="submit" /><input type="hidden" name="layout" /></form>').attr('action', href);
   $('input[name="layout"]', form).val(JSON.stringify(cols));
   $('input[type="submit"]', form).click();
 }

Похоже, что Chrome 56 больше не поддерживает этот вид кода. Не так ли? Если да, мой вопрос:

  1. Почему это произошло внезапно? Без какого-либо предупреждения об устаревании?
  2. Какой обходной путь для этого кода?
  3. Есть ли способ заставить Chrome (или другие браузеры) работать как раньше без изменения кода?

PS Это не работает в последней версии Firefox (без каких-либо сообщений). Также это не работает в IE 11.0 & Edge! (оба без каких-либо сообщений)

Махмуд Моравей
источник
Я добавил исправление в принятый ответ, чтобы соответствовать тому факту, что форма является объектом jQuery. Обратите внимание, что это также влияет на .submit()обработчик jQuery (в дополнение к .click()методу, указанному выше).
17

Ответы:

186

Быстрый ответ: добавьте форму к телу.

document.body.appendChild(form);

Или, если вы используете JQuery, как указано выше: $(document.body).append(form);

Подробности: Согласно стандартам HTML, если форма не связана с контекстом просмотра (документом), отправка формы будет прервана.

HTML SPEC см. 4.10.21.3.2

В Chrome 56 эта спецификация была применена.

Различный код Chrome см. @@ -347,9 +347,16 @@

PS про твой вопрос №1. На мой взгляд, в отличие от ajax, отправка формы вызывает мгновенное перемещение страницы.
Поэтому показ «устаревшего предупреждающего сообщения» практически невозможен.
Я также думаю, что недопустимо, чтобы это серьезное изменение не было включено в список изменений функций. Особенности Chrome 56 - www.chromestatus.com/features#milestone%3D56

KyungHun Jeon
источник
4
Только что об этой ошибке сообщили некоторые пользователи. Кроме того, некоторые другие пользователи не имели обновленной версии, поэтому они могли отправить форму без проблем. Делая ошибку более противоречивой. Спасибо за Ваш ответ!
Ironicnet,
Предлагаемое решение не работает для меня в сочетании с использованием jQuery, как в первоначальном вопросе. Это сработало вместо: $(document.body).append(form);
Крис
1
@Chris Я только что отредактировал принятый ответ, поскольку переменная формы - это объект jQuery, а не фактический элемент формы DOM. При использовании form[0]он выдает ошибку «Не удалось выполнить appendChild» на «Узле»: параметр 1 не относится к типу «Узел». » в хроме. Таким образом, просто измените на document.body.appendChild(form[0]).
17
@ryanm, я просто редактор, так как я добавил следующую строку $(document.body).append(form);. Вы можете добавить свое решение к принятому ответу, отредактировав его или спросив @KyungHun Jeon, хочет ли он принять ваше решение вместо его.
Крис
@ Крис спасибо! Я понял, так как вопрос был в jQuery, ответ должен быть слишком (может быть запутанным), но мое редактирование выглядит как отклоненное. Просто примечание для других прохожих тем, что это может быть document.body.appendChild(form[0])(немного быстрее) ИЛИ $(document.body).append(form).
17
50

если вы видите эту ошибку в React JS при попытке отправить форму, нажав клавишу ввода, убедитесь, что все ваши кнопки в форме, не отправляющие форму, имеют type="button".

Если у вас есть только один buttonс type="submit"нажатием Enter представит форму , как и ожидалось.

Ссылки :
https://dzello.com/blog/2017/02/19/demystifying-enter-key-submission-for-react-forms/ https://github.com/facebook/react/issues/2093

vaskort
источник
6
Кроме того, на React нужно обратить внимание, но <form>после нажатия на него все еще нужно рендерить в DOM. то есть, это потерпит неудачу `{this.state.submitting? <div> Форма отправляется </ div>: <form onSubmit = {() => this.setState ({submitting: true}) ...> <button ...> </ form>} `Так что когда форма отправляется, state.submittingустанавливается и вместо формы отображается сообщение "submiting ...", после чего возникает эта ошибка. Перемещение тега формы за пределы условного гарантирует, что он всегда будет там, где это необходимо.
Майк Рухлин
Приятно знать. Я думаю, вам не нужно менять весь formэлемент на div. Я считаю, что если вы просто измените содержимое formвместо того, чтобы заменить элемент, он будет работать, как ожидалось.
Васкорт
Итак, как сказал Макс Уильямс, это условие гонки - браузер проверяет, есть ли форма, но форма уже пропала.
pianoJames
warnDefault () вызывает это предупреждение от Chrome
imbatman
Первая ссылка не работает: web.archive.org/web/20170410070341/http://dzello.com/blog/2017/…
cmp
12

добавить атрибут type = "button" к кнопке, по нажатию которой вы видите ошибку, у меня это сработало.

Тайяб Мехар
источник
Работает хорошо для меня: thumbsup:
cederlof
11

Вы должны убедиться, что форма находится в документе. Вы можете добавить форму к телу.

Лю Тао
источник
7
У меня было это, и оказалось, что к удаленной кнопке отправки формы был добавлен onclick, который удалил содержащий элемент формы. Таким образом, между отправляемой формой и удаляемой формой существовали расы.
Макс Уильямс
4
Спасибо @Max Williams, ваш комментарий вернул меня на правильный путь, чем принятый ответ.
JirkaV
11

альтернативно включить event.preventDefault (); в вашем handleSubmit (событие) {

см. https://facebook.github.io/react/docs/forms.html.

joncode
источник
2
Ссылки на внешние ресурсы приветствуются, но, пожалуйста, добавьте контекст вокруг ссылки, чтобы ваши коллеги-пользователи имели представление о том, что это такое и почему оно есть. Всегда указывайте наиболее релевантную часть важной ссылки, если целевой сайт недоступен или постоянно недоступен. Посмотрите, как написать хороший ответ
Питер Рейд
Использование àntdформ. Это помогло.
Эдуард
8

Я вижу, вы используете JQuery для инициализации формы.

Когда я пытаюсь ответить на вопрос @KyungHun Jeon, у меня тоже не получается использовать jQuery.

Итак, я попытался добавить форму в тело, используя способ jQuery:

$(document.body).append(form);

И это сработало!

Ризки Пратама
источник
6

Если вы видите это в React, стоит обратить внимание на то, что во <form>время отправки все еще приходится рендериться в DOM. т.е. это не удастся

{ this.state.submitting ? 
     <div>Form is being submitted</div> :
     <form onSubmit={()=>this.setState({submitting: true}) ...>
         <button ...>
     </form>
}

Поэтому, когда форма отправлена, state.submittingнастроена и вместо формы отображается сообщение "submiting ...", возникает эта ошибка.

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

<form onSubmit={...} ...>
  { this.state.submitting ? 
     <div>Form is being submitted</div> :
     <button ...>
  }
</form>
Майк рулин
источник
Гоночные условия!
pianoJames
2

Я столкнулся с той же проблемой в одной из наших реализаций.

мы использовали jquery.forms.js. который является плагином форм и доступен здесь. http://malsup.com/jquery/form/

мы использовали тот же ответ, приведенный выше, и вставили

$(document.body).append(form);

и это сработало. Спасибо.

Абхинав Чавла
источник
1

В зависимости от ответа от KyungHun Jeon, но appendChild ожидает dom-узел, поэтому добавьте индекс к объекту jquery, чтобы вернуть узел: document.body.appendChild(form[0])

Моти Иром
источник
2
Вы имеете в виду document.body.appendChild(form[0])?
efeder
1

Добавление для потомков, поскольку это не связано с Chrome, но это была первая тема, которая появилась в Google при поиске этой ошибки отправки формы.

В нашем случае мы прикрепили функцию для замены текущего HTML-файла div анимацией «загрузки» при отправке - поскольку это произошло до того, как форма была отправлена, формы и данных для отправки больше не было.

Очень очевидная ошибка в ретроспективе, но если кто-то попадет сюда, это может сэкономить им время в будущем.

Мэтт Н
источник
1

Я получил эту ошибку в response.js. Если у вас есть кнопка в форме, которую вы хотите действовать как кнопка, а не отправлять форму, вы должны указать ее type = "button". В противном случае он пытается отправить форму. Я считаю, что Васкорт ответил на это с некоторыми документами, которые вы можете проверить.

Исайя Ларсен
источник
Это предупреждение: отправка формы отменена, потому что форма не подключена. Извините, что забыл добавить это.
Исаия Ларсен,
1
Я могу это подтвердить. В React я получал одно и то же предупреждение Form submission canceled because the form is not connectedвсякий раз , когда нажимал кнопку «Отмена» в форме. После добавления type="button"в кнопку «Отмена» я больше не получаю предупреждение. Спасибо!
Бен
1

Мне удалось избавиться от сообщения, добавив атрибут type = "button" к элементу кнопки в vue.

Пашам Ахил Кумар Редди
источник
0

Вы также можете решить эту проблему, применив один патч в jquery-xxxjs, просто добавив после строки «try {rp;} catch (m) {}» 1833 этот код:

if (r instanceof HTMLFormElement &&! r.parentNode) { r.style.display = "none"; document.body.append (r); r [p] (); }

Это проверяет, когда форма не является частью тела, и добавляет ее.

Gaytan
источник
0

Я заметил, что получаю эту ошибку, потому что мой HTML-код не имеет <body>тега.

Без оператора <body>когда document.body.appendChild(form);не было бы объекта тела для добавления.

Глено
источник
-1

Я видел это сообщение, используя angular, поэтому я просто удалил method = "post" и action = "", и предупреждение исчезло.

heavyrick
источник