HTML 양식을 중첩 할 수 있습니까?


451

이런 HTML 양식을 중첩 할 수 있습니까

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

두 형태가 모두 작동하도록? 내 친구는 subForm작품 의 일부 인이 문제에 어려움을 겪고 있지만 다른 일부는 그렇지 않습니다.


그는 업데이트 수량이 총계를 추적하는 양식 안에있는 장바구니를 설정하고 있습니다. 나는 개인적으로 그렇게하지 않을 것이지만, 그는 그것을 작동시키는 데 문제가 있습니다.
Levi

1
Javascript를 사용하여 값을 중첩하려고하지 않고 한 양식에서 다른 양식으로 값을 복사하는 것이 좋습니다. 중첩이 작동하지 않을 것이라고 생각합니다.
Ben

15
오래된 질문이지만 주석에 대답하려면 JavaScript를 피하기 위해 중첩 양식이 필요할 수 있습니다. JavaScript를 사용할 필요가없는 하위 양식 "재설정"버튼의 양식을 중첩하고 싶기 때문에이 문제가 발생합니다.
vol7ron


답변:


459

한마디로. 한 페이지에 여러 양식을 가질 수 있지만 중첩해서는 안됩니다.

로부터 의 HTML5 작업 초안 :

4.10.3 form요소

콘텐츠 모델 :

흐름 내용이지만 양식 요소 하위 항목은 없습니다.


126
나는 대답에 동의하지만 다른 사람에게 물어 보는 이유는 무엇입니까? HTML이 중첩 양식을 허용하지 않는 이유는 무엇입니까? 나에게, 그것은 우리가 없으면 더 나아질 것이라는 제한으로 보인다. 중첩 된 양식을 사용하는 것이 프로그래밍하기 쉬운 많은 예가 있습니다 (예 : 프로필 편집 양식과 함께 사진 업로드 양식 사용).
Ryan

20
@Nilzor 그는 할 수 없는지 묻지 않고 왜 그런지 묻지 않습니다. 동의한다; 중첩 양식이 실제로 유용합니다. 따라서 탭이있는 하나의 페이지 앱이있는 경우 각 탭은 고유 한 양식이므로 진행 상황을 저장하기 위해 제출할 수 있습니다. 양식이 모두 래핑되어 모든 것을 저장하기 위해 제출할 수 있습니다. 이해가 되네요
Rob Grant

5
나는 다른 사람들의 말에 동의합니다. 이 제한은 임의적이고 해로워 보입니다.
aroth

12
따라서 중첩 양식이있는 HTML 5.1이 필요합니다.
헥터

3
중첩 된 양식의 문제점은 HTML 내의 양식 아키텍처로, 해당 양식 내의 조치로 인해 제출 이벤트가 발생합니다. 질문은 제출해야 할 것에 대한 머리카락을 얻습니다. 양식 내에 여러 필드가 있거나 div 내에 여러 양식이있을 수 있지만 양식 내에 양식을 갖는 것은 실제로 의미가 없습니다. 내용이 함께 들어가면 모두 하나의 형태입니다. 콘텐츠를 별도로 제출하면 외부 양식이 필요없는 별도의 양식입니다.
Kyle Baker

96

비슷한 문제가 발생하여 질문에 대한 답이 아니라는 것을 알고 있지만 이러한 종류의 문제가있는 사람에게는 도움이 될 수 있습니다.
두 가지 이상의 양식 요소를 주어진 순서로 배치 해야하는 경우 상기 HTML5의 <input> form 특성은 용액 일 수있다.

에서 http://www.w3schools.com/tags/att_input_form.asp :

  1. 양식 속성 은 HTML5의 새로운 기능입니다.
  2. 요소가 속하는 <form>요소를 지정 <input>합니다. 이 속성의 값은 <form>동일한 문서에서 요소 의 id 속성이어야합니다 .

시나리오 :

  • 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-IE (현재 v11까지 최신 버전 포함)를 제외한 모든 곳 (Chrome, Firefox, Opera, Egde, Safari, Android 브라우저 ...)에서 작동합니다. .
dmikam

@ cliff-burton, 차이점은 무엇입니까? 양식 외부의 입력을 볼 수 있습니다. 여전히 두 양식을 동시에 제출하려면 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 / jquery를 사용하는 경우 양식 요소를 클래스로 분류 한 다음 serialize ()를 사용하여 제출하려는 항목의 서브 세트에 해당 양식 요소 만 직렬화 할 수 있습니다.

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

그런 다음 자바 스크립트에서 class1 요소를 직렬화하기 위해이 작업을 수행 할 수 있습니다

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

class2의 경우 할 수있는 일

$(".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-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 사양에서 :

이 기능을 사용하면 작성자가 중첩 양식 요소에 대한 지원 부족을 해결할 수 있습니다.


차이점은 무엇입니까? 양식 외부의 입력을 볼 수 있습니다. 여전히 두 양식을 동시에 제출하려면 JS가 필요합니다. 그렇지 않습니까?
sdlins

@sdlins 아니요, 기본 구성 요소와 하위 구성 요소를 원하는 모양으로 중첩하여 스타일을 지정하는 것이 좋습니다. 실제 2 개의 양식 태그는 보이지 않습니다. 각 제출 단추는 해당 양식 제출을 트리거합니다. 자바 스크립트가 필요하지 않습니다.
크리에이티브

하나 또는 다른 양식 만 트리거하려면 알겠습니다. 그러나 "부모"를 트리거해야 할 때 어떻게 해결됩니까? 형태 는 하나의 js 선수로서의 자식 폼?
sdlins

@sdlins이 질문에 관한 것이 아닙니다. 문제는 두 가지 다른 형태이지만 중첩되어 있습니다. 왜 2 개의 양식을 원하지만 여전히 1 개의 제출 기능을 원하십니까? 그러면 1 개의 양식 만 가질 수 없습니까? 당신은 정말로 이상한 것과 같은 것을 위해 자바 스크립트에 의지해야합니다 : P
Creative

네, 그렇습니다. OP 질문이 아닙니다. 나는 내 자신을 게시 할 것입니다. 감사합니다!
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

크레이그가 말했듯이

그러나 이유 에 대한 귀하의 의견과 관련하여 :

<form>입력과 "업데이트"버튼으로 1을 사용하는 것이 더 쉬울 수 있고 , 다른 명령에서는 "주문 제출"버튼으로 복사 된 숨겨진 입력 을 사용하는 것이 더 쉬울 수 있습니다 <form>.


장바구니 페이지를 이렇게 만들었습니다. 방금 다른 방식으로 이동하여 변경하고 싶지 않았습니다. 그의 방법이 모두 유효하다면 나는 긍정적이지 않았다.
Levi

9

FORM 요소를 중첩 할 수 없습니다!

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에 연결하는 것입니다.
Aidiakapi

7
그것은 기본 질문에 얼마나 오랫동안 대답했는지에 대한 참조이며, 나는 건설적인 것으로 믿었습니다. 또한 나는 재치가없는 것을 발견했다. "참고로 FORM 요소를 중첩 할 수 없습니다!" 스펙 안에서 유머러스합니다.
Mark Peterson

1
이것은 폼 인 API를 삽입해야하고 .net 앱 (모든 것 주위에 <form> 태그를 감싸는)이기 때문에 문제가됩니다. 이 문제를 어떻게 극복합니까?
jelly46

4

간단한 해결 방법은 ines를 사용하여 "중첩 된"양식을 유지하는 것입니다. 시각적으로 양식은 중첩되지만 코드 측에는 별도의 html 파일이 있습니다.


1
iframe을위한 시간
무하마드 tayyab

3

버튼 태그 안에 formaction = ""을 사용할 수도 있습니다.

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

이것은 원래 형태로 별도의 버튼으로 중첩됩니다.


이 질문에 대답하지 않습니다하지만이 날은 내가 그렇게 upvote에 제공 가졌다 또 다른 문제를 해결 도움이
codeAndStuff

위를 무시하십시오 (5 분 후에 편집 할 수 없습니다 ... 흠). 여기에 큰 도움이되었습니다-오늘 아침에하려고했던 것에 정확하게 매핑되었습니다. 이것이 우리 모두가 SO를 좋아하는 이유입니다
codeAndStuff

2

하나의 브라우저에서 작동하도록해도 모든 브라우저에서 동일하게 작동한다는 보장은 없습니다. 당신이 얻을 수있을 동안이 일을 그래서 약간의 시간을, 당신은 확실히 그것을 작동시킬 수 없을 것 모든 시간을.


2

동일한 브라우저의 다른 버전에서 작동하게 만드는 데 문제가있을 수도 있습니다. 따라서 사용하지 마십시오.


2

중첩 된 양식에 대한 해결책을 제시하지는 않지만 (안정적으로 작동하지는 않지만) 나에게 맞는 해결책을 제시합니다.

사용 시나리오 : 한 번에 N 개의 항목을 변경할 수있는 수퍼 폼. 하단에 "모두 제출"버튼이 있습니다. 각 아이템은 "Submit Item # 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 년 동안 아약스 스크립트를 디버깅하는 데 보냈다.

내 이전 답변 / 예는 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를 말하는 데 실패했습니다.

form_1의 form_2를 생성 한 ajaxContainer를 옮길 때 나는 <i>outside</i>사업을 시작했다. 왜 양식을 중첩시킬 수 있는지에 대한 질문에 대답합니다. 실제로 어떤 양식을 사용해야하는지 정의하지 않을 경우 ID는 무엇입니까? 더 좋고 매끄러운 작업이 있어야합니다.


1

중첩 된 양식 앞에 빈 양식 태그를 사용하십시오.

Firefox, Chrome에서 테스트 및 작업

IE에서 테스트되지 않음

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

크롬에서 이것을 시도하면이 <form name = "mainForm"> </ form> <form name = "subForm"> </ form>을 출력합니다.
ianace

1
제출 버튼을 사용해 보셨습니까? 나는이 방법을 여러 번 사용했으며 항상 효과가있었습니다.
Fatih

10
이것은 사양을 위반하는 것이며 향후 사용을 위해 애원하고 있습니다.
Oskar Berggren

최신 웹킷 버전은 중첩 된 양식 요소 만 제거합니다.
woens

0

질문이 꽤 오래되었지만 HTML에 양식 중첩이 허용되지 않는다는 @everyone에 동의합니다.

그러나이 모든 것이 이것을보고 싶을 수도 있습니다.

브라우저가 중첩 된 양식을 가질 수 있도록 해킹 할 수있는 곳 (이것은 합법적이지 않기 때문에 해킹이라고 부릅니다)

<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 피들 링크

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 개월 동안 수천 건의 가입 거래를했는데 아무도 어려움을 겪지 않았습니다.

중첩 된 양식은 올바른 조치를 취하기 위해 구문 분석 할 ID를 제공했습니다. 버튼 중 하나에 필드를 연결하려고 시도하고 유효성 검사가 불평 할 때까지 중단되지 않았습니다. 그것을 풀어야 할 큰 문제는 아니 었습니다. 제외 형식에 명시적인 stringify를 사용했기 때문에 제출과 양식이 중요하지 않았습니다. 예, 제출에서 버튼 클릭시 버튼을 가져와야합니다.

요점은 그것이 완전히 깨지지 않은 상황이 있다는 것입니다. 그러나 "완전히 깨지지는 않았다"는 아마도 너무 낮은 표준이다 :-)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.