Можете ли вы вкладывать html-формы?

Можно ли вкладывать такие html-формы?

<form name = "mainForm">
  <form name = "subForm">
  </form>
</form>

чтобы обе формы работали? У моего друга с этим проблемы, часть subForm работает, а другая часть - нет.

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

Levi 19.12.2008 01:58

Похоже, ему было бы лучше использовать Javascript для копирования значений из одной формы в другую, чем пытаться их вкладывать. Не думаю, что вложение сработает.

Ben 19.12.2008 02:04

Старый вопрос, но для ответа на комментарий могут потребоваться формы вложенности, чтобы избежать использования JavaScript. Я сталкиваюсь с этим, потому что я хотел бы вложить формы для кнопок «сброса» подчиненных форм, которые не требуют включения JavaScript.

vol7ron 15.06.2011 22:12

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

Khanh Pham 13.11.2015 07:56

У вас даже возникнут проблемы с его работой в разных версиях одного и того же браузера. Так что избегайте этого.

MP. 22.10.2009 22:02
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
483
5
275 984
20
Перейти к ответу Данный вопрос помечен как решенный

Ответы 20

Ответ принят как подходящий

Одним словом, нет. На странице может быть несколько форм, но они не должны быть вложенными.

Из html5 рабочий черновик:

4.10.3 The form element

Content model:

Flow content, but with no form element descendants.

Скорее всего, это приложение .net (которое окружает все тегом <form>). Каждый раз, когда вы пытаетесь вложить формы, где-то обнаруживается недостаток дизайна. Обычно вам нужны две формы рядом друг с другом, заключенные в один DIV только для стилизации.

Ryan Wheale 10.10.2012 02:59

Я согласен с ответом, но спросить другого, почему бы и нет? Почему HTML не допускает вложения форм? Мне кажется, что это ограничение, без которого нам было бы лучше. Существует множество примеров, когда использование вложенных форм было бы легче запрограммировать (например, использование формы загрузки фотографии с формой редактирования профиля).

Ryan 06.04.2013 05:32

@Nilzor он не спрашивает, нельзя ли это сделать, он спрашивает, ПОЧЕМУ нет. Я согласен; формы вложенности действительно очень полезны. Итак, если у вас есть одностраничное приложение с вкладками, каждая вкладка представляет собой отдельную форму (поэтому вы можете отправить ее для сохранения прогресса), и все они заключены в форму, которую вы можете отправить, чтобы сохранить все. Для меня это имеет смысл.

Rob Grant 24.12.2013 10:45

Я согласен с тем, что сказали другие. Это ограничение кажется произвольным и вредным.

aroth 07.07.2014 10:43

Итак, нам нужен HTML 5.1 с вложенными формами.

Hector 22.06.2016 13:33

Я считаю, что нет проблем с вложенными формами, если вы отправляете эти формы с помощью AJAX. Я считаю, что OP говорит о фактической обратной передаче, не так ли?

Jordan 04.01.2017 20:31

Проблема с вложенными формами заключается в архитектуре формы в HTML, где действие в этой форме приводит к событию отправки. Возникает вопрос о том, что нужно отправить. У вас может быть несколько полей внутри формы или несколько форм внутри div, но на самом деле не имеет смысла иметь формы внутри формы. Если контент сочетается, это все одна форма; если контент представлен отдельно, это действительно отдельные формы, которым не нужна внешняя форма.

Kyle Baker 11.04.2017 02:18

Не могли бы вы объяснить мне, что такое поток? Спасибо

Rafael Andrade 18.04.2018 22:32

@RafaelAndrade Элементы, принадлежащие к категории потокового контента, обычно содержат текст или встроенный контент.

Mark Baijens 21.09.2018 12:12

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

Rudiger W. 16.01.2019 15:11

@aroth почему ты говоришь вредно?

Surya Pratap 24.11.2019 08:03

Потому что это накладывает произвольные ограничения на использование языка разметки. На языке разметки, который редко проверяется или проверяется синтаксисом и где разные браузеры в любом случае имеют тенденцию поддерживать разные уровни неправильного / нестандартного синтаксиса. И исключает определенные структуры, которые могут быть полезны в определенных крайних случаях (некоторые примеры которых указаны в других комментариях выше). Это кажется и более разумным, и более допустимым полезный для вложенных элементов form.

aroth 24.11.2019 18:51

Хотя это прямо отвечает на вопрос. Есть способ получше. См. Ответ @ Creative с использованием атрибута form в элементах ввода.

Mark 06.05.2020 14:35

Как сказал Крейг, нет.

Но, что касается вашего комментария к Зачем:

Может быть проще использовать 1 <form> с входами и кнопкой «Обновить», а копировать скрытые входы с кнопкой «Отправить заказ» в другом <form>.

Я сделал свою страницу корзины такой, он просто пошел другим путем и не хотел ее менять. Я не был уверен, что его метод был так хорош.

Levi 19.12.2008 02:05

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

Вторая форма будет проигнорирована, см., Например, фрагмент из WebKit:

bool HTMLParser::formCreateErrorCheck(Token* t, RefPtr<Node>& result)
{
    // Only create a new form if we're not already inside one.
    // This is consistent with other browsers' behavior.
    if (!m_currentFormElement) {
        m_currentFormElement = new HTMLFormElement(formTag, m_document);
        result = m_currentFormElement;
        pCloserCreateErrorCheck(t, result);
    }
    return false;
}

Note you are not allowed to nest FORM elements!

http://www.w3.org/MarkUp/html3/forms.html

https://www.w3.org/TR/html4/appendix/changes.html#h-A.3.9 (спецификация html4 не отмечает никаких изменений относительно форм вложенности с 3.2 на 4)

https://www.w3.org/TR/html4/appendix/changes.html#h-A.1.1.12 (спецификация html4 не отмечает никаких изменений относительно форм вложенности с 4.0 до 4.1)

https://www.w3.org/TR/html5-diff/ (спецификация html5 не отмечает никаких изменений относительно форм вложенности с 4 по 5)

https://www.w3.org/TR/html5/forms.html#association-of-controls-and-forms комментирует «Эта функция позволяет авторам обойти отсутствие поддержки вложенных элементов формы.», Но не указывает, где это указано, я думаю, они предполагают, что мы должны предполагать, что это указано в спецификации html3 :)

Понятия не имею, почему вы публикуете вопрос, на который ответили 3 с половиной года, но более проблематичным является ссылка на HTML3, который долгое время не был рекомендацией.

Aidiakapi 24.12.2013 17:16

Это ссылка на то, как долго был дан ответ на основной вопрос, что я считаю конструктивным. Также я нашел бестактную «Обратите внимание, что вам не разрешено вкладывать элементы FORM!» в рамках спецификации, чтобы быть юмористическим.

Mark Peterson 14.02.2014 00:03

Это проблема, потому что мне нужно вставить API, который является формой, и потому, что приложение .net (которое обертывает тег <form> вокруг всего). Как решить эту проблему.

jelly46 27.03.2014 20:53

О формах вложенности: однажды днем ​​я провел 10 лет, пытаясь отладить сценарий ajax.

мой предыдущий ответ / пример не учитывал разметку html, извините.

<form id='form_1' et al>
  <input stuff>
  <submit onClick='ajaxFunction(That_Puts_form_2_In_The_ajaxContainer)' >
  <td id='ajaxContainer></td>
</form>

form_2 постоянно терпит неудачу, говоря неверная форма_2.

Когда я переместил ajaxContainer, который произвел form_2 <i>outside</i> из form_1, я вернулся к работе. Это ответ на вопрос, почему можно вкладывать формы. Я имею в виду, действительно, для чего нужен идентификатор, если не определять, какую форму использовать? Должен быть способ получше и лучше.

Обычный HTML не может позволить вам этого. Но с javascript вы можете это сделать. Если вы используете javascript / jquery, вы можете классифицировать элементы формы с помощью класса, а затем использовать serialize () для сериализации только тех элементов формы для подмножества элементов, которые вы хотите отправить.

<form id = "formid">
    <input type = "text" class = "class1" />
    <input type = "text" class = "class2">
</form>

Затем в своем javascript вы можете сделать это для сериализации элементов class1

$(".class1").serialize();

Для класса 2 вы могли бы сделать

$(".class2").serialize();

Для всей формы

$("#formid").serialize();

или просто

$("#formid").submit();

Простое решение - использовать iframe для хранения «вложенной» формы. Визуально форма является вложенной, но со стороны кода она находится в отдельном файле HTML.

Время для iframe истекло

muhammad tayyab 04.12.2019 02:02

Сегодня я тоже застрял в той же проблеме и решил проблему, добавив пользовательский элемент управления и
. на этом элементе управления я использую этот код

<div class = "divformTagEx">

</div>

<asp:Literal runat = "server" ID = "litFormTag" Visible = "false">
'<div> <form  style = "margin-bottom: 3;" action = "http://login.php" method = "post" name = "testformtag"></form> </div>'</asp:Literal>

и в событии PreRenderComplete страницы вызовите этот метод

private void InitializeJavaScript()
{
        var script = new StringBuilder();
        script.Append("$(document).ready(function () {");
        script.Append("$('.divformTagEx').append( ");
        script.Append(litFormTag.Text);
        script.Append(" )");
        script.Append(" });");
        ScriptManager.RegisterStartupScript(this, GetType(), "nestedFormTagEx", script.ToString(), true);
    }

Я верю, что это поможет.

Другой способ обойти эту проблему, если вы используете какой-либо язык сценариев на стороне сервера, который позволяет вам манипулировать опубликованными данными, - это объявить вашу html-форму следующим образом:

<form>
<input name = "a_name"/>
<input name = "a_second_name"/>
<input name = "subform[another_name]"/>
<input name = "subform[another_second_name]"/>
</form>

Если вы распечатаете опубликованные данные (здесь я буду использовать PHP), вы получите такой массив:

//print_r($_POST) will output :
    array(
    'a_name' => 'a_name_value',
    'a_second_name' => 'a_second_name_value',
    'subform' => array(
      'another_name' => 'a_name_value',
      'another_second_name' => 'another_second_name_value',
      ),
    );

Тогда вы можете просто сделать что-то вроде:

$my_sub_form_data = $_POST['subform'];
unset($_POST['subform']);

В вашем $ _POST теперь есть только данные вашей «основной формы», а данные подчиненной формы хранятся в другой переменной, которой вы можете манипулировать по своему желанию.

Надеюсь это поможет!

Хотя вопрос довольно старый, и я согласен с @everyone, что вложение формы в HTML запрещено.

Но это то, что все могут захотеть это увидеть

где вы можете взломать (я называю это взломом, поскольку я уверен, что это не законно) html, чтобы браузер мог иметь вложенную форму

<form id = "form_one" action = "http://apple.com">
  <div>
    <div>
        <form id = "form_two" action = "/">
            <!-- DUMMY FORM TO ALLOW BROWSER TO ACCEPT NESTED FORM -->
      </form>
    </div>
      <br/>
    <div>
      <form id = "form_three" action = "http://www.linuxtopia.org/">
          <input type='submit' value='LINUX TOPIA'/>
      </form>
    </div>
      <br/>

    <div>
      <form id = "form_four" action = "http://bing.com">
          <input type='submit' value='BING'/>
      </form>
    </div>
      <br/>  
    <input type='submit' value='Apple'/>
  </div>  
</form>

ССЫЛКА НА JS FIDDLE

http://jsfiddle.net/nzkEw/10/

Если вы используете AngularJS, любые теги <form> внутри вашего ng-app заменяются во время выполнения директивами ngForm, которые предназначены для вложения.

In Angular forms can be nested. This means that the outer form is valid when all of the child forms are valid as well. However, browsers do not allow nesting of <form> elements, so Angular provides the ngForm directive which behaves identically to <form> but can be nested. This allows you to have nested forms, which is very useful when using Angular validation directives in forms that are dynamically generated using the ngRepeat directive. (source)

Это был ответ, который я искал :) И да, имеет смысл вложить форму, потому что если у вас есть несколько вкладок, но вы хотите выполнить проверку только на одной вкладке, то с вложенной формой вы можете это сделать.

NeverGiveUp161 27.03.2018 23:48

То же самое и с веб-компонентами?

Gangadhar JANNU 15.11.2018 13:36

Я столкнулся с аналогичной проблемой, и я знаю, что это не ответ на вопрос, но это может помочь кому-то с такой проблемой:
если есть необходимость поместить элементы двух или более форм в заданную последовательность, атрибут HTML5<input> form может быть решением. От http://www.w3schools.com/tags/att_input_form.asp:

  1. The form attribute is new in HTML5.
  2. Specifies which <form> element an <input> element belongs to. The value of this attribute must be the id attribute of a <form> element in the same document.

Сценарий:

  • input_Form1_n1
  • input_Form2_n1
  • input_Form1_n2
  • input_Form2_n2

Выполнение:

<form id = "Form1" action = "Action1.php" method = "post"></form>
<form id = "Form2" action = "Action2.php" method = "post"></form>

<input type = "text" name = "input_Form1_n1" form = "Form1" />
<input type = "text" name = "input_Form2_n1" form = "Form2" />
<input type = "text" name = "input_Form1_n2" form = "Form1" />
<input type = "text" name = "input_Form2_n2" form = "Form2" />

<input type = "submit" name = "button1" value = "buttonVal1" form = "Form1" />
<input type = "submit" name = "button2" value = "buttonVal2" form = "Form2" />

Здесь вы найдете совместимость браузера.

Просто укажите таблицу поддержки браузера: caniuse.com/#feat=form-attribute Resuming - он работает везде (Chrome, Firefox, Opera, Egde, Safari, браузер Android ...), кроме IE (включая последнюю версию v11).

dmikam 27.07.2018 13:57

@ cliff-burton, какая здесь разница? Я просто вижу вводимые данные вне формы. Для одновременной отправки обеих форм по-прежнему потребуется JS. Не так ли?

sdlins 30.04.2020 00:42

Ух, прошло много времени с тех пор, как я в последний раз использовал это, но я думаю, что JS не требуется для отправки формы. При условии, что <input type = "submit" связан со своим <form>, который указывает action, в этом запросе будут использоваться <input />, связанные с тем же <form>.

Cliff Burton 30.04.2020 16:45

Используйте пустой тег формы перед вложенной формой

Протестировано и работает в Firefox, Chrome

Не тестировалось на I.E.

<form name = "mainForm" action = "mainAction">
  <form></form>
  <form name = "subForm"  action = "subAction">
  </form>
</form>

РЕДАКТИРОВАТЬ @adusza: как отметили комментаторы, приведенный выше код не приводит к вложенным формам. Однако, если вы добавите элементы div, как показано ниже, у вас будет subForm внутри mainForm, а первая пустая форма будет удалена.

<form name = "mainForm" action = "mainAction">
  <div>
      <form></form>
      <form name = "subForm"  action = "subAction">
      </form>
  </div>
</form>

когда я попробовал это на Chrome, он выводит это <form name = "mainForm"> </form> <form name = "subForm"> </form>

ianace 11.09.2015 01:11

Вы пробовали с помощью кнопки отправки. Я использовал этот метод много раз и всегда работал.

Fatih 30.09.2015 11:04

Это нарушение спецификации, и его использование порождает проблемы в будущем.

Oskar Berggren 28.01.2016 17:45

Более новые версии webkit просто удаляют вложенные элементы формы.

woens 03.08.2018 12:49

Это работает только тогда, когда innerHTML из mainForm установлен через JavaScript (т.е. ajax). Просто наличие этого фрагмента в файле HTML не приведет к вложенным формам: пустой тег формы завершит внешний, а subForm будет сразу после mainForm (проверено в Chrome 86 и Firefox 80). Как ни странно, при установке innerHTML удаляется только первая вложенная форма, а остальные остаются вложенными.

Tamas Hegedus 13.11.2020 23:13

Обновите, вам не нужен ajax, если есть другой элемент, например div между внешней и внутренней формами. Странный.

Tamas Hegedus 14.11.2020 00:14

Хотя я не предлагаю решения для вложенных форм (оно работает ненадежно), я предлагаю обходной путь, который работает для меня:

Сценарий использования: Суперформа, позволяющая изменять N элементов одновременно. Внизу есть кнопка «Отправить все». Каждый элемент хочет иметь свою собственную вложенную форму с кнопкой «Отправить элемент № N». Но не могу ...

В этом случае можно фактически использовать одну форму, а затем присвоить кнопкам имена submit_1..submit_N и submitAll и обрабатывать их на стороне сервера, просматривая только параметры, оканчивающиеся на _1, если имя кнопки было submit_1. .

<form>
    <div id = "item1">
        <input type = "text" name = "foo_1" value = "23">
        <input type = "submit" name = "submit_1" value = "Submit Item #1">
    </div>
    <div id = "item2">
        <input type = "text" name = "foo_2" value = "33">
        <input type = "submit" name = "submit_2" value = "Submit Item #2">
    </div>
    <input type = "submit" name = "submitAll" value = "Submit All Items">
</form>

Ладно, не особо изобретение, но свое дело оно выполняет.

Вы также можете использовать formaction = "" внутри тега кнопки.

<button type = "submit" formaction = "/rmDog" method='post' id = "rmDog">-</button>

Это будет вложено в исходную форму как отдельная кнопка.

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

codeAndStuff 06.11.2018 18:10

игнорировать выше (не разрешил мне редактировать через 5 минут ... хм). огромная помощь здесь - точно сопоставлена ​​с тем, что я пытался сделать сегодня утром. вот почему мы все так любим

codeAndStuff 06.11.2018 18:16

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

Вложенные формы дали мне идентификатор, который нужно проанализировать, чтобы предпринять правильное действие. Не сломалось, пока я не попытался прикрепить поле к одной из кнопок, и Validate не пожаловался. Распутать это было несложно - я использовал явное преобразование в строку во внешней форме, поэтому не имело значения, что отправка и форма не совпадают. Да, да, надо было перенести кнопки из отправки в onclick.

Дело в том, что есть обстоятельства, при которых он не полностью сломан. Но «не полностью сломан», пожалуй, слишком низкий стандарт, чтобы стремиться к нему :-)

Нет, у вас не может быть вложенной формы. Вместо этого вы можете открыть модальное окно, содержащее форму, и выполнить отправку формы Ajax.

На самом деле невозможно ... Я не мог вложить теги формы ... Однако я использовал этот код:

<form>
    OTHER FORM STUFF

    <div novalidate role = "form" method = "post" id = "fake_form_id_0" data-url = "YOUR_POST_URL">
        THIS FORM STUFF
    </div>
</form>

с {% csrf_token %} и прочее

и применил JS

var url = $(form_id).attr("data-url");

$.ajax({
  url: url,
  "type": "POST",
   "data": {
    'csrfmiddlewaretoken': '{{ csrf_token }}',
    'custom-param-attachment': 'value'
  },
  success: function (e, data) {
      if (e.is_valid) {
         DO STUFF
      }
  }
});

Поскольку сейчас 2019 год, я хотел бы дать обновленный ответ на этот вопрос. Можно добиться того же результата, что и вложенные формы, но без их вложения. HTML5 представил атрибут формы. Вы можете добавить атрибут формы к элементам управления формы вне формы, чтобы связать их с определенным элементом формы (по идентификатору).

https://www.impressivewebs.com/html5-form-attribute/

Таким образом вы можете структурировать свой html следующим образом:

<form id = "main-form" action = "/main-action" method = "post"></form>
<form id = "sub-form"  action = "/sub-action"  method = "post"></form>

<div class = "main-component">
    <input type = "text" name = "main-property1" form = "main-form" />
    <input type = "text" name = "main-property2" form = "main-form" />

    <div class = "sub-component">
        <input type = "text" name = "sub-property1" form = "sub-form" />
        <input type = "text" name = "sub-property2" form = "sub-form" />
        <input type = "submit" name = "sub-save" value = "Save" form = "sub-form" />
    </div>

    <input type = "submit" name = "main-save" value = "Save" form = "main-form" />
</div>

Атрибут формы поддерживается всеми современными браузерами. IE не поддерживает это, хотя IE больше не браузер, а скорее инструмент совместимости, что подтверждается самой Microsoft: https://www.zdnet.com/article/microsoft-security-chief-ie-is-not-a-browser-so-stop-using-it-as-your-default/. Пора нам перестать заботиться о том, чтобы все работало в IE.

https://caniuse.com/#feat=form-attribute
https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#attr-fae-form

Из спецификации html:

This feature allows authors to work around the lack of support for nested form elements.

какая здесь разница? Я просто вижу вводимые данные вне формы. Для одновременной отправки обеих форм по-прежнему потребуется JS. Не так ли?

sdlins 30.04.2020 00:43

@sdlins Нет, идея состоит в том, чтобы стилизовать главный компонент и субкомпонент так, как вы хотите, чтобы они выглядели вложенными. Фактические 2 тега формы будут невидимы. Каждая кнопка отправки вызывает соответствующую отправку формы. Никакого javascript не требуется.

Creative 04.05.2020 15:54

если вы хотите вызвать только одну или же другую форму, хорошо. Но как бы это разрешилось, когда вам нужно активировать "родительский" form с участием его дочерние формы, так как он был один и без js?

sdlins 04.05.2020 19:25

@sdlins этот вопрос не об этом. Речь идет о двух разных формах, но есть ли они вложенные. Мне интересно, почему вы хотите иметь 2 формы, но при этом одну функцию отправки? Разве ты не можешь иметь только одну форму? Вам действительно придется прибегнуть к javascript для чего-то столь же странного: P

Creative 05.05.2020 19:42

да, ты прав, это не вопрос ОП. Я выложу свой. Спасибо!

sdlins 05.05.2020 23:06

Другие вопросы по теме