Bạn có thể lồng các biểu mẫu html không?


451

Có thể lồng các biểu mẫu html như thế này không

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

để cả hai hình thức làm việc? Bạn tôi đang gặp vấn đề với điều này, một phần của subFormcông việc, trong khi một phần khác thì không.


Anh ta đang thiết lập một giỏ hàng, trong đó số lượng cập nhật nằm trong biểu mẫu theo dõi tổng số. Cá nhân tôi sẽ không làm điều đó, nhưng anh ấy đang gặp vấn đề để làm việc đó.
Levi

1
Có vẻ như anh ta nên sử dụng Javascript để sao chép các giá trị từ dạng này sang dạng khác, thay vì cố gắng lồng chúng. Tôi không nghĩ rằng việc làm tổ sẽ hoạt động.
Bến

15
Câu hỏi cũ, nhưng để trả lời bình luận, các hình thức lồng nhau có thể cần thiết để tránh JavaScript. Tôi bắt gặp điều này bởi vì tôi muốn lồng các biểu mẫu cho các nút "đặt lại" biểu mẫu con, không yêu cầu bật JavaScript.
vol7ron

1
Bản sao có thể có của: stackoverflow.com/questions/597596/ trên
yankee

Câu trả lời:


459

Trong một từ, không. Bạn có thể có một vài biểu mẫu trong một trang nhưng chúng không nên được lồng vào nhau.

Từ dự thảo làm việc html5 :

4.10.3 Phần formtử

Mô hình nội dung:

Lưu lượng nội dung, nhưng không có hậu duệ yếu tố hình thức.


126
Tôi đồng ý với câu trả lời, nhưng để hỏi người khác, tại sao không? Tại sao HTML không cho phép các hình thức lồng nhau? Đối với tôi, nó dường như là một hạn chế mà chúng ta sẽ tốt hơn nếu không có. Có nhiều ví dụ trong đó sử dụng các biểu mẫu lồng nhau sẽ dễ dàng hơn để lập trình (nghĩa là sử dụng biểu mẫu ảnh tải lên với biểu mẫu chỉnh sửa hồ sơ).
Ryan

20
@Nilzor anh ấy không hỏi liệu có thể làm được hay không, anh ấy hỏi TẠI SAO không. Tôi đồng ý; hình thức lồng nhau thực sự hữu ích. Vì vậy, nếu bạn có một ứng dụng một trang với các tab, mỗi tab là một hình thức riêng của nó (vì vậy bạn có thể gửi nó để lưu tiến trình) và tất cả chúng đều được gói trong một biểu mẫu mà bạn có thể gửi để lưu mọi thứ. Có nghĩa với tôi.
Rob Grant

5
Tôi đồng ý với những gì người khác đã nói. Hạn chế này có vẻ độc đoán và có hại.
aroth

12
Vì vậy, chúng ta cần HTML 5.1 với các hình thức lồng nhau.
Hector

3
Vấn đề với các biểu mẫu lồng nhau là kiến ​​trúc biểu mẫu trong HTML, trong đó hành động trong biểu mẫu đó dẫn đến một sự kiện gửi. Câu hỏi được tóc về những gì cần phải nộp. Bạn có thể có một số trường trong một biểu mẫu hoặc một số biểu mẫu trong div, nhưng thực sự không có ý nghĩa khi có các biểu mẫu trong một biểu mẫu. Nếu nội dung đi cùng nhau, đó là tất cả một dạng; nếu nội dung được gửi riêng, nó thực sự là các hình thức riêng biệt không cần hình thức bên ngoài.
Kyle Baker

96

Tôi gặp phải một vấn đề tương tự và tôi biết đó không phải là câu trả lời cho câu hỏi, nhưng nó có thể giúp ích cho người có loại vấn đề này:
nếu cần phải đặt các yếu tố của hai hoặc nhiều dạng trong một chuỗi nhất định , thuộc tính HTML5 <input> form có thể là giải pháp.

Từ http://www.w3schools.com/tags/att_input_form.asp :

  1. Thuộc tính biểu mẫu là mới trong HTML5.
  2. Chỉ định <form>phần <input>tử nào thuộc về phần tử. Giá trị của thuộc tính này phải là thuộc tính id của một thành <form>phần trong cùng một tài liệu.

Kịch bản :

  • đầu vào_Form1_n1
  • đầu vào_Form2_n1
  • đầu vào_Form1_n2
  • đầu vào_Form2_n2

Thực hiện :

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

Ở đây bạn sẽ tìm thấy khả năng tương thích của trình duyệt.


1
nó hoạt động rất tốt nên được đưa vào câu trả lời được chấp nhận
Nahouto

1
Chỉ cần trỏ bảng hỗ trợ trình duyệt: caniuse.com/#feat=form-attribution Resuming - nó hoạt động ở mọi nơi (Chrome, Firefox, Opera, Egde, Safari, trình duyệt Android ...) ngoại trừ IE (kể cả mới nhất là v11) .
dmikam

@ cliff-burton, sự khác biệt ở đây là gì? Tôi chỉ có thể thấy đầu vào bên ngoài của hình thức. Nó vẫn sẽ cần JS để gửi cả hai biểu mẫu cùng một lúc. Có phải vậy không?
sdlins

Uh, đã lâu rồi kể từ lần cuối tôi sử dụng cái này nhưng tôi nghĩ rằng JS không bắt buộc phải gửi biểu mẫu. Với điều kiện <input type="submit"là liên kết với nó <form>chỉ định một action, <input />(các) liên kết đến đó <form>sẽ được sử dụng trong yêu cầu đó
Cliff Burton

90

Biểu mẫu thứ hai sẽ bị bỏ qua, xem đoạn trích từ WebKit chẳng hạn:

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

Plain html không thể cho phép bạn làm điều này. Nhưng với javascript bạn có thể làm điều đó. Nếu bạn đang sử dụng javascript / jquery, bạn có thể phân loại các thành phần biểu mẫu của mình với một lớp và sau đó sử dụng tuần tự hóa () để tuần tự hóa các thành phần biểu mẫu đó cho tập hợp con của các mục bạn muốn gửi.

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

Sau đó, trong javascript của bạn, bạn có thể làm điều này để tuần tự hóa các phần tử class1

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

Đối với class2 bạn có thể làm

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

Đối với toàn bộ hình thức

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

hoặc đơn giản

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

31

Nếu bạn đang sử dụng AngularJS, mọi <form>thẻ bên trong của bạn ng-appsẽ được thay thế trong thời gian chạy bằng ngFormcác lệnh được thiết kế để được lồng vào nhau.

Trong các hình thức góc có thể được lồng nhau. Điều này có nghĩa là hình thức bên ngoài là hợp lệ khi tất cả các hình thức con cũng hợp lệ. Tuy nhiên, các trình duyệt không cho phép lồng các <form>phần tử, vì vậy Angular cung cấp ngFormchỉ thị hành xử giống hệt nhau <form>nhưng có thể được lồng vào nhau. Điều này cho phép bạn có các biểu mẫu lồng nhau, rất hữu ích khi sử dụng các lệnh xác thực Angular trong các biểu mẫu được tạo động bằng cách sử dụng lệnh ngRepeat. ( nguồn )


Đây là câu trả lời tôi đang tìm kiếm :) Và vâng, nó có ý nghĩa đối với biểu mẫu lồng vì nếu bạn có nhiều tab nhưng bạn muốn thực hiện xác nhận chỉ trên một tab, thì với biểu mẫu lồng nhau, bạn có thể làm điều đó.
NeverGiveUp161

Nó có giống với các thành phần web không?
Gangadhar JANNU

31

Vì đó là năm 2019 tôi muốn đưa ra câu trả lời cập nhật cho câu hỏi này. Có thể đạt được kết quả tương tự như các hình thức lồng nhau, nhưng không lồng chúng. HTML5 đã giới thiệu thuộc tính biểu mẫu. Bạn có thể thêm thuộc tính biểu mẫu để điều khiển biểu mẫu bên ngoài biểu mẫu để liên kết chúng với một thành phần biểu mẫu cụ thể (theo id).

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

Bằng cách này bạn có thể cấu trúc html của mình như thế này:

<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>

Thuộc tính biểu mẫu được hỗ trợ bởi tất cả các trình duyệt hiện đại. IE không hỗ trợ điều này mặc dù IE không còn là trình duyệt nữa, mà là một công cụ tương thích, như được xác nhận bởi chính Microsoft: https://www.zdnet.com/article/microsoft-security-chief-ie-is-not-a -browser-so-stop-used-it-as-your-default / . Đã đến lúc chúng ta ngừng quan tâm về việc làm cho mọi thứ hoạt động trong IE.

https://caniuse.com/#feat=form-attribution
https://html.spec.whatwg.org/multipage/form-control-infr kia.html#attr-fae-form

Từ thông số html:

Tính năng này cho phép các tác giả làm việc xung quanh việc thiếu hỗ trợ cho các yếu tố hình thức lồng nhau.


sự khác biệt ở đây là gì? Tôi chỉ có thể thấy đầu vào bên ngoài của hình thức. Nó vẫn sẽ cần JS để gửi cả hai biểu mẫu cùng một lúc. Có phải vậy không?
sdlins

@sdlins Không, ý tưởng là định kiểu thành phần chính và thành phần phụ như cách bạn muốn chúng nhìn, lồng nhau. Các thẻ mẫu 2 thực tế sẽ vô hình. Mỗi nút gửi sẽ kích hoạt biểu mẫu gửi tương ứng. Không có javascript là bắt buộc.
Sáng tạo

nếu bạn muốn kích hoạt chỉ một hoặc hình thức khác, ok. Nhưng nó sẽ giải quyết như thế nào khi bạn cần kích hoạt & quot; cha mẹ & quot; hình thức với hình thức con của nó như là một và không có js?
sdlins

@sdlins đó không phải là câu hỏi này. Câu hỏi là về 2 hình thức khác nhau, nhưng chúng được lồng vào nhau. Tôi đang tự hỏi tại sao bạn muốn có 2 biểu mẫu nhưng vẫn có 1 chức năng gửi? Bạn có thể chỉ có 1 hình thức sau đó? Bạn thực sự sẽ phải dùng đến javascript để tìm thứ gì đó kỳ lạ như vậy: P
Sáng tạo

Vâng, bạn nói đúng, đó không phải là câu hỏi của OP. Tôi sẽ đăng bài của riêng tôi. Cảm ơn bạn!
sdlins

12

Một cách khác để khắc phục vấn đề này, nếu bạn đang sử dụng một số ngôn ngữ kịch bản phía máy chủ cho phép bạn thao tác với dữ liệu đã đăng, là khai báo biểu mẫu html của bạn như sau:

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

Nếu bạn in dữ liệu đã đăng (tôi sẽ sử dụng PHP ở đây), bạn sẽ nhận được một mảng như thế này:

//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',
      ),
    );

Sau đó, bạn có thể làm một cái gì đó như:

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

$ _POST của bạn hiện chỉ có dữ liệu "biểu mẫu chính" của bạn và dữ liệu biểu mẫu con của bạn được lưu trữ trong một biến khác mà bạn có thể thao tác theo ý muốn.

Hi vọng điêu nay co ich!


11

Như Craig đã nói, không.

Nhưng, liên quan đến nhận xét của bạn là tại sao :

Có thể dễ dàng hơn khi sử dụng 1 <form>với các đầu vào và nút "Cập nhật" và sử dụng các đầu vào ẩn sao chép bằng nút "Gửi đơn hàng" trong một cái khác <form>.


Tôi đã tạo trang giỏ hàng của mình như thế, anh ấy chỉ đi một con đường khác và không muốn thay đổi nó. Tôi không tích cực nếu phương pháp của anh ta là hợp lệ.
Levi

9

Lưu ý rằng bạn không được phép lồng các yếu tố FORM!

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

https://www.w3.org/TR/html4/appcill/changes.html#hA.3.9 (đặc tả html4 lưu ý không có thay đổi liên quan đến các hình thức lồng nhau từ 3.2 đến 4)

https://www.w3.org/TR/html4/appcill/changes.html#hA.1.1.12 (đặc tả html4 lưu ý không có thay đổi liên quan đến các hình thức lồng nhau từ 4.0 đến 4.1)

https://www.w3.org/TR/html5-diff/ (đặc tả html5 lưu ý không có thay đổi liên quan đến các hình thức lồng nhau từ 4 đến 5)

https://www.w3.org/TR/html5/forms.html#association-of-controls-and-forms nhận xét cho "Tính năng này cho phép các tác giả làm việc xung quanh việc thiếu hỗ trợ cho các yếu tố hình thức lồng nhau.", nhưng không trích dẫn nơi này được chỉ định, tôi nghĩ rằng họ đang giả định rằng chúng ta nên cho rằng nó được chỉ định trong đặc tả html3 :)


23
Tôi không biết tại sao bạn lại đăng một câu hỏi đã được trả lời 3 năm rưỡi, nhưng vấn đề hơn là liên kết với HTML3 vốn không phải là một đề xuất trong một thời gian dài.
Aidiakapi

7
Nó liên quan đến thời gian câu hỏi cơ bản đã được trả lời, mà tôi tin là mang tính xây dựng. Ngoài ra, tôi đã tìm thấy "Lưu ý rằng bạn không được phép lồng các phần tử FORM!" trong thông số kỹ thuật để được hài hước.
Đánh dấu Peterson

1
Đây là một vấn đề vì tôi phải chèn API là một biểu mẫu và vì ứng dụng .net (bao bọc thẻ <form> xung quanh mọi thứ). Làm thế nào để bạn khắc phục vấn đề này.
thạch46

4

Một cách giải quyết đơn giản là sử dụng iframe để giữ biểu mẫu "lồng nhau". Trực quan biểu mẫu được lồng nhau nhưng về phía mã trong một tệp html riêng biệt hoàn toàn.


1
Đã đến lúc cho iframes
muhammad tayyab

3

Bạn cũng có thể sử dụng formaction = "" bên trong thẻ nút.

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

Điều này sẽ được lồng trong các hình thức ban đầu như là một nút riêng biệt.


Điều này không trả lời câu hỏi nhưng điều này chỉ giúp tôi giải quyết một vấn đề khác mà tôi đang gặp phải vì vậy hãy từ bỏ
codeAndStuff

bỏ qua ở trên (sẽ không để tôi chỉnh sửa sau 5 phút ... hmm). sự giúp đỡ to lớn ở đây - chính xác là ánh xạ vào những gì tôi đã cố gắng làm sáng nay. đây là lý do tại sao tất cả chúng ta đều yêu SO
codeAndStuff 6/11/18

2

Ngay cả khi bạn có thể làm cho nó hoạt động trong một trình duyệt, không có gì đảm bảo rằng nó sẽ hoạt động như nhau trong tất cả các trình duyệt. Vì vậy, trong khi bạn có thể khiến nó hoạt động đôi khi, bạn chắc chắn sẽ không thể khiến nó hoạt động mọi lúc.


2

Bạn thậm chí sẽ có vấn đề làm cho nó hoạt động trong các phiên bản khác nhau của cùng một trình duyệt. Vì vậy, tránh sử dụng đó.


2

Mặc dù tôi không trình bày một giải pháp cho các hình thức lồng nhau (nó không hoạt động đáng tin cậy), tôi trình bày một cách giải quyết phù hợp với tôi:

Kịch bản sử dụng: Một siêu biểu mẫu cho phép thay đổi N mục cùng một lúc. Nó có nút "Gửi tất cả" ở phía dưới. Mỗi mục muốn có dạng lồng nhau của riêng mình với nút "Gửi mục # N". Nhưng không thể ...

Trong trường hợp này, người ta thực sự có thể sử dụng một hình thức duy nhất, và sau đó có tên của các nút được submit_1.. submit_NsubmitAllvà xử lý nó server-side, bằng cách chỉ nhìn vào params kết thúc bằng _1nếu tên của nút là 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>

Ok, không có nhiều phát minh, nhưng nó thực hiện công việc.


1

Về các hình thức lồng nhau: Tôi đã dành 10 năm vào một buổi chiều để cố gắng gỡ lỗi một tập lệnh ajax.

Xin lỗi, câu trả lời / ví dụ trước đây của tôi không có tài khoản đánh dấu html, xin lỗi.

<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 liên tục thất bại khi nói form_2 không hợp lệ.

Khi tôi di chuyển ajaxContainer tạo ra mẫu_2 <i>outside</i>của mẫu_1, tôi đã quay lại công việc. Nó trả lời câu hỏi là tại sao người ta có thể làm tổ. Ý tôi là, thực sự, ID để làm gì nếu không xác định hình thức nào sẽ được sử dụng? Phải có một công việc tốt hơn, bóng mượt xung quanh.


1

Sử dụng thẻ biểu mẫu trống trước biểu mẫu lồng nhau của bạn

Đã thử nghiệm và hoạt động trên Firefox, Chrome

Chưa được thử nghiệm trên IE

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

Khi tôi thử cái này trên chrome, nó xuất ra <form name = "mainForm"> </ form> <form name = "subForm"> </ form>
ianace

1
Bạn đã thử với nút gửi. Tôi đã sử dụng phương pháp này nhiều lần và luôn làm việc.
Fatih

10
Đây là một sự vi phạm các đặc điểm kỹ thuật và sử dụng nó đang cầu xin cho các vấn đề trong tương lai.
Oskar Berggren

Các phiên bản webkit mới hơn chỉ cần loại bỏ các thành phần biểu mẫu lồng nhau.
woens

0

Mặc dù câu hỏi khá cũ và tôi đồng ý với @everyone rằng việc lồng biểu mẫu không được phép trong HTML

Nhưng đây là thứ mà tất cả có thể muốn thấy điều này

nơi bạn có thể hack (tôi gọi đó là hack vì tôi chắc chắn điều này không hợp pháp) html để cho phép trình duyệt có dạng lồng nhau

<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>

LIÊN KẾT FIDDLE

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


0

Không, bạn không thể có một hình thức lồng nhau. Thay vào đó, bạn có thể mở một Modal có chứa biểu mẫu và thực hiện gửi biểu mẫu Ajax.


0

Thực sự không thể ... Tôi không thể lồng các thẻ mẫu ... Tuy nhiên tôi đã sử dụng mã này:

<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>

với {% csrf_token %} và những thứ

và áp dụng một số 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

Hôm nay, tôi cũng bị kẹt trong cùng một vấn đề và giải quyết vấn đề tôi đã thêm một điều khiển người dùng và
trên điều khiển này tôi sử dụng mã này

<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>

và trên sự kiện PreRenderComplete của trang, hãy gọi phương thức này

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

Tôi tin rằng điều này sẽ giúp.


-1

Trước khi tôi biết tôi không nên làm điều này, tôi đã tạo các biểu mẫu lồng nhau cho mục đích có nhiều nút gửi. Chạy theo cách đó trong 18 tháng, hàng ngàn giao dịch đăng ký, không ai gọi cho chúng tôi về bất kỳ khó khăn nào.

Các hình thức lồng nhau đã cho tôi một ID để phân tích cho hành động chính xác cần thực hiện. Tôi đã không phá vỡ cho đến khi tôi cố gắn một trường vào một trong các nút và Xác thực đã khiếu nại. Không phải là một vấn đề lớn để gỡ rối nó - Tôi đã sử dụng một chuỗi rõ ràng ở hình thức bên ngoài để nó không quan trọng việc gửi và hình thức không phù hợp. Vâng, vâng, nên lấy các nút từ một lần gửi đến một onclick.

Điểm là có những trường hợp nó không hoàn toàn bị phá vỡ. Nhưng "không hoàn toàn bị phá vỡ" có lẽ là một tiêu chuẩn quá thấp để chụp cho :-)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.