Ответ 1
Одним словом, нет. Вы можете иметь несколько форм на странице, но они не должны быть вложенными.
4.10.3 Элемент
form
Модель контента:
Содержимое потока, но без потомков элемента формы.
Можно ли вложить html-формы, подобные этому
<form name="mainForm">
<form name="subForm">
</form>
</form>
чтобы обе формы работали? У моего друга возникают проблемы с этим, часть работ subForm
, а другая его часть - нет.
Одним словом, нет. Вы можете иметь несколько форм на странице, но они не должны быть вложенными.
4.10.3 Элемент
form
Модель контента:
Содержимое потока, но без потомков элемента формы.
Вторая форма будет проигнорирована, см. фрагмент из 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;
}
У меня возникла аналогичная проблема, и я знаю, что это не ответ на вопрос, но он может помочь кому-то с такой проблемой:
если в данной последовательности необходимо поместить элементы из двух или более форм, это может быть атрибутом <input> form
HTML5 <input> form
.
С http://www.w3schools.com/tags/att_input_form.asp:
- Атрибут form является новым в HTML5.
- Указывает, к какому элементу
<form>
элемент<input>
. Значение этого атрибута должно быть атрибутом id элемента<form>
в том же документе.
Сценарий:
Реализация:
<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" />
Здесь вы найдете совместимость с браузером.
Обычный html не позволяет это сделать. Но с javascript вы сможете это сделать. Если вы используете javascript/jquery, вы можете классифицировать элементы формы с классом, а затем использовать serialize() для сериализации только тех элементов формы для подмножества элементов, которые вы хотите отправить.
<form id="formid">
<input type="text" class="class1" />
<input type="text" class="class2">
</form>
Затем в вашем javascript вы можете сделать это для сериализации элементов класса1
$(".class1").serialize();
Для класса 2 вы можете сделать
$(".class2").serialize();
Для всей формы
$("#formid").serialize();
или просто
$("#formid").submit();
Если вы используете AngularJS, любые теги <form>
внутри вашего ng-app
заменяются во время выполнения с помощью директив ngForm
, которые предназначены для вложенности.
В Angular формы могут быть вложенными. Это означает, что внешняя форма действительна, когда все дочерние формы также действительны. Однако браузеры не допускают вложения элементов
<form>
, поэтому Angular предоставляет директивуngForm
, которая ведет себя одинаково с<form>
, но может быть вложенной. Это позволяет вам иметь вложенные формы, что очень полезно при использовании Angular директив проверки в формах, которые динамически генерируются с помощью директивыngRepeat
. (источник)
Как сказал Крэйг, нет.
Но в отношении вашего комментария о том, почему:
Может быть проще использовать 1 <form>
с входами и кнопкой "Обновить" и использовать скрытые входы с копией с кнопкой "Отправить заказ" в другой <form>
.
Другой способ обойти эту проблему, если вы используете язык сценариев на стороне сервера, который позволяет вам манипулировать опубликованными данными, заключается в том, чтобы объявить вашу форму 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 теперь есть только ваши данные "основной формы", а ваши данные подформы хранятся в другой переменной, которую вы можете манипулировать по своему усмотрению.
Надеюсь, это поможет!
Обратите внимание, что вам не разрешено вставлять элементы FORM!
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 комментарии к "Эта функция позволяет авторам обойти отсутствие поддержки вложенных элементов формы.", но не cite, где это указано, я думаю, что они предполагают, что мы должны предположить, что он указан в спецификации html3:)
Простым обходным путем является использование iframe для хранения "вложенной" формы. Визуально форма вложенна, но на стороне кода ее в отдельном html файле вообще.
Даже если вы можете заставить его работать в одном браузере, нет гарантии, что он будет работать одинаково во всех браузерах. Поэтому, хотя вы можете заставить его работать некоторое время, вы, конечно, не сможете заставить его работать все время.
У вас даже возникнут проблемы с его работой в разных версиях одного и того же браузера. Поэтому не используйте это.
Пока я не представляю решение вложенных форм (это не работает надежно), я представляю обходное решение, которое работает для меня:
Сценарий использования: суперформа, позволяющая сразу изменить 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>
Хорошо, поэтому не так много, но это делает работу.
О формах вложенности: я провел 10 лет один день, пытаясь отладить ajax script.
мой предыдущий ответ/пример не учитывал разметку 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 постоянно проваливается, говоря недействительный form_2.
Когда я переместил ajaxContainer, который создал form_2 <i>outside</i>
формы_1, я вернулся в бизнес. Это ответ на вопрос, почему можно вложить формы. Я имею в виду, действительно, какой идентификатор, если не определить, какая форма должна использоваться? Должна быть лучшая, гладкая работа.
Использовать пустой тег формы перед вашей вложенной формой
Протестировано и работает в Firefox, Chrome
Не проверено на I.E.
<form name="mainForm" action="mainAction">
<form></form>
<form name="subForm" action="subAction">
</form>
</form>
Сегодня я также застрял в одной и той же проблеме и решил проблему, я добавил пользовательский элемент управления и
на этом элементе управления я использую этот код
<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
Но это все, что угодно, может увидеть это
где вы можете взломать (я называю это взломом, так как я уверен, что это не является законным) 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 LINK
Вы также можете использовать formaction = "" внутри тега кнопки.
<button type="submit" formaction="/rmDog" method='post' id="rmDog">-</button>
Это будет вложенно в исходную форму в виде отдельной кнопки.
Прежде чем я узнал, что я не должен был этого делать, у меня были вложенные формы с целью иметь несколько кнопок отправки. Пробег таким образом в течение 18 месяцев, тысячи транзакций регистрации, никто не называл нас о каких-либо трудностях.
Вложенные формы дали мне идентификатор для синтаксического анализа правильного действия. Не сломался, пока я не попытался прикрепить поле к одной из кнопок и проверить жалобу. Не было большого смысла распутать его - я использовал явную строчку на внешней форме, поэтому не имело значения, что представление и форма не совпадают. Да, да, должны были взять кнопки из представления в onclick.
Есть ли обстоятельства, когда они не полностью нарушаются. Но "не совсем сломанный", пожалуй, слишком низкий стандарт для съемки :-)
Нет, вы не можете иметь вложенную форму. Вместо этого вы можете открыть Modal, который содержит форму и выполнить Ajax form submit.