Чи можете ви вкладати HTML-форми?


451

Чи можливо вкладати такі форми html

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

щоб обидві форми працювали? У мого друга є проблеми з цим, частина subFormробіт, а інша частина - ні.


Він налаштовує візок, де кількість оновлень знаходиться у формі, яка відстежує підсумки. Я особисто не став би цього робити, але він стикається з проблемами, коли це працює.
Леві

1
Схоже, йому краще використовувати Javascript для копіювання значень з однієї форми в іншу, а не намагатися їх вкладати. Я не думаю, що гніздування спрацює.
Бен

15
Старе запитання, але щоб відповісти на коментар, для уникнення JavaScript може знадобитися вкладення форм. Я натрапляю на це, тому що я хотів би вкласти форми для підформату кнопок "скидання", для яких не потрібно активувати JavaScript.
vol7ron

1
Можливий дублікат: stackoverflow.com/questions/597596/…
yankee

Відповіді:


459

Одним словом, ні. Ви можете мати кілька форм на сторінці, але вони не повинні вкладатись.

З робочого проекту html5 :

4.10.3 formЕлемент

Модель вмісту:

Зміст потоку, але без нащадків елемента форми.


126
Я згоден з відповіддю, але запитати іншу, чому ні? Чому HTML не дозволяє вкладати форми? Мені здається, це обмеження, без якого нам було б краще. Існує багато прикладів, коли використання вкладених форм було б простіше програмувати (тобто використовувати форму фото для завантаження з формою редагування профілю).
Райан

20
@Nilzor він не запитує, чи цього не можна зробити, він запитує ЧОМУ ні. Я згоден; гніздові форми насправді дуже корисні. Отже, якщо у вас є додаток на одній сторінці з вкладками, кожна вкладка є власною формою (тому ви можете надіслати її, щоб зберегти прогрес), і всі вони загорнуті у форму, яку ви можете подати, щоб зберегти все. Має сенс для мене.
Роб Грант

5
Я згоден з тим, що сказали інші. Це обмеження здається довільним і шкідливим.
aroth

12
Тому нам потрібен HTML 5.1 з вкладеними формами.
Гектор

3
Проблема з вкладеними формами полягає в архітектурі форми в HTML, де дії в межах цієї форми призводять до події надсилання. Постає питання про те, що потрібно подати. У вас може бути кілька полів у формі або кілька форм у розділі, але насправді немає сенсу мати форми у формі. Якщо зміст йде разом, це все в одній формі; якщо вміст подається окремо, це справді окремі форми, яким не потрібна зовнішня форма.
Кайл Бейкер

96

Я зіткнувся з подібною проблемою, і я знаю, що це не відповідь на питання, але це може допомогти комусь із таким видом проблеми:
якщо є необхідність помістити елементи двох або більше форм у задану послідовність , атрибут HTML5 <input> form може бути рішенням.

Від http://www.w3schools.com/tags/att_input_form.asp :

  1. форма атрибута є новим в HTML5.
  2. Визначає , який <form>елемент <input>елемент належить. Значення цього атрибута має бути атрибутом id <form>елемента в одному документі.

Сценарій :

  • 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" />

Тут ви знайдете сумісність браузера.


1
це чудово працює! слід включити до прийнятої відповіді
Nahouto

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

@ Кліф-Бертон, яка тут різниця? Я просто бачу дані поза формою. Ще потрібно буде JS подати обидві форми одночасно. Чи не так?
sdlins

Так, минуло в останній раз, коли я це використав, але я думаю, що для подання форми JS не потрібен. За умови, що посилання <input type="submit"пов'язане з його, <form>що вказує ан action, в цьому запиті будуть використані ті, які <input />пов'язані з цим самим<form>
Кліфф Бертон

90

Друга форма буде проігнорована, див. Фрагмент, наприклад, від 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;
}

43

Простий 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();

31

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

У кутових формах можна вкладати. Це означає, що зовнішня форма діє, коли всі дочірні форми також дійсні. Однак браузери не дозволяють вкладати <form>елементи, тому Angular надає ngFormдирективу, яка поводиться однаково, <form>але може бути вкладена. Це дозволяє мати вкладені форми, що дуже корисно при використанні директив кутової перевірки у формах, що динамічно генеруються за допомогою ngRepeatдирективи. ( джерело )


Цю відповідь я шукав :) І так, це має сенс вкладати форму, оскільки якщо у вас є кілька вкладок, але ви хочете виконати перевірку лише на одній вкладці, то з вкладеною формою ви можете це зробити.
NeverGiveUp161

Чи однаково це для веб-компонентів?
Gangadhar JANNU

31

Оскільки це 2019 рік, я хотів би дати оновлену відповідь на це питання. Можна досягти такого ж результату, як і вкладені форми, але не вкладаючи їх. HTML5 представив атрибут форми. Ви можете додати атрибут форми до елементів керування форми поза формою, щоб зв’язати їх із певним елементом форми (за id).

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-так-стоп-використання-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:

Ця функція дозволяє авторам подолати відсутність підтримки вкладених елементів форми.


яка тут різниця? Я просто бачу дані поза формою. Ще потрібно буде JS подати обидві форми одночасно. Чи не так?
sdlins

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

якщо ви хочете запустити лише ту чи іншу форму, добре. Але як це вирішити, коли вам потрібно запустити "батьківський" форми з її дочірніми формами, як це було одне і без js?
sdlins

@sdlins не в цьому питанні. Питання стосується двох різних форм, але вони вкладені. Мені цікаво, чому ви хочете мати 2 форми, але все одно функцію подання? Ви не можете просто мати 1 форму тоді? Вам справді доведеться вдатися до javascript для чогось такого дивного: P
Creative

так, ти маєш рацію, це не питання ОП. Я опублікую своє. Дякую!
sdlins

12

Ще один спосіб подолати цю проблему, якщо ви використовуєте якусь скриптову мову на стороні сервера, яка дозволяє вам маніпулювати розміщеними даними, - це оголосити форму 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 є лише ваші дані "основної форми", а ваші дані підформи зберігаються в іншій змінній, якою ви можете керувати за бажанням.

Сподіваюся, це допомагає!


11

Як сказав Крейг, ні.

Щодо вашого коментаря, чому :

Можливо, буде простіше використовувати 1 <form>з входами та кнопкою "Оновити", а скопіювати приховані входи за допомогою кнопки "Надіслати замовлення" в іншій <form>.


Я зробив свою сторінку кошика так, він просто пішов іншим шляхом і не хотів її змінювати. Я не був позитивний, якщо його метод також був справедливим.
Леві

9

Зауважте, вам заборонено вкладати елементи ФОРМИ!

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

https://www.w3.org/TR/html4/appendix/changes.html#hA.3.9 (специфікація html4 відмічає жодних змін щодо форм гніздування від 3,2 до 4)

https://www.w3.org/TR/html4/appendix/changes.html#hA.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 :)


23
Я не маю уявлення, чому ви розмістили запитання, на яке було відповідено 3 з половиною роки, але більш проблематичним є посилання на HTML3, яке давно не було рекомендацією.
Айдіакапі

7
Це посилання на те, як довго було відповідено на основне питання, яке я вважав конструктивним. Також я виявив, що не вимагає тактів "Зверніть увагу, вам не дозволяється вкладати елементи ФОРМИ!" в межах специфікації бути жартівливим.
Марк Петерсон

1
Це проблема, оскільки мені потрібно вставити API, який є формою, і тому що .net додаток (який обертає тег <form> навколо всього). Як ви подолаєте це питання.
желе46,

4

Простий спосіб вирішити - використовувати iframe для утримання "вкладеної" форми. Візуально форма вкладена, але на стороні коду її взагалі в окремому HTML-файлі.


1
Настав час для iframes
muhammad tayyab

3

Ви також можете використовувати formaction = "" всередині тегу кнопок.

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

Це було б вкладено в оригінальній формі як окрема кнопка.


це не відповідає на питання, але це просто допомогло мені вирішити ще одну проблему, з якою я мав відмову
codeAndStuff

ігнорувати вище (не дозволив мені редагувати через 5 хвилин ... хм). Величезна допомога тут - точно нанесена на те, що я намагався зробити сьогодні вранці. саме тому ми всі любимо SO
codeAndStuff

2

Навіть якщо ви могли змусити його працювати в одному браузері, немає гарантії, що він буде працювати однаково у всіх браузерах. Тож, хоча, можливо, ви зможете змусити його працювати деякий час, ви, звичайно, не зможете змусити його працювати весь час.


2

У вас навіть будуть проблеми з тим, щоб він працював у різних версіях одного браузера. Тому уникайте використання цього.


2

Хоча я не представляю рішення для вкладених форм (це не працює надійно), я представляю рішення, яке працює для мене:

Сценарій використання: Суперформа, що дозволяє змінювати N елементів одночасно. У нижній частині кнопки "Надіслати всі". Кожен елемент хоче мати власну вкладену форму за допомогою кнопки "Надіслати елемент № N". Але не можу ...

В цьому випадку можна реально використовувати одну форму, а потім ім'я бути кнопки submit_1.. submit_Nі submitAllі обробляти його сервери на стороні, лише дивлячись на Params , що закінчуються в _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>

Гаразд, не так багато винаходи, але це робить свою роботу.


1

Про форми гніздування: один день я провів 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, я знову взявся за справу. Це відповідає на питання, чому можна гніздо формувати. Я маю на увазі, справді, для чого ідентифікатор, якщо не визначити, яку форму слід використовувати? Повинна бути краща, стрункіша робота.


1

Використовуйте порожній тег форми перед вкладеною формою

Тестували та працювали на Firefox, Chrome

Не перевірено на IE

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

коли я спробував це на chrome, він виводить це <form name = "mainForm"> </form> <form name = "subForm"> </form>
ianace

1
Ви спробували із кнопкою "Подати" Я багато разів використовував цей метод і завжди працював.
Фатих

10
Це є порушенням специфікації та її використання напрошується для майбутніх проблем.
Оскар Берггрен

Новіші версії webkit просто видаляють вкладені елементи форми.
woens

0

Хоча питання досить старе, і я погоджуюся з @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 LINK

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


0

Ні, ви не можете мати вкладену форму. Натомість ви можете відкрити Модал, який містить форму, та виконати надсилання Ajax.


0

Дійсно неможливо ... Я не міг вкласти теги форм ... Однак я використав цей код:

<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
      }
  }
});

-1

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

<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);
    }

Я вірю, що це допоможе.


-1

До того, як я зрозумів, що не повинен цього робити, я вклав форми для створення декількох кнопок подання. Таким чином пройшло протягом 18 місяців, тисячі транзакцій підписки, ніхто не закликав нас про якісь труднощі.

Вкладені форми дали мені ідентифікатор для розбору для правильної дії. Не зламався, поки я спробував приєднати поле до однієї з кнопок і Validate поскаржився. Розв’язати це було не багато - я використав явну строкову редакцію на зовнішній формі, щоб вона не мала значення для подання та форма не збігалася. Так, так, я мав би перенести кнопки від подання до onclick.

Справа в тому, що є обставини, коли це не зовсім порушено. Але "не зовсім зламаний", мабуть, занадто низький стандарт для зйомки для :-)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.