html 양식 태그의 목적은 무엇입니까


107

html에서 양식 태그의 목적을 이해하지 못합니다.

form 태그를 사용하지 않고 쉽게 모든 입력 유형을 완벽하게 사용할 수 있습니다. 입력을 감싸는 것은 거의 중복되는 것처럼 보입니다.

또한 ajax를 사용하여 서버 측 페이지를 호출하는 경우 간단히 jQuery를 사용할 수 있습니다. 유일한 예외는 어떤 이유로 든 양식 태그를 업로드 스크립트로 감싸 야한다는 점입니다.

그렇다면 왜 양식은 텍스트 입력과 같은 단순한 일에 여전히 널리 사용됩니까? 그것은 매우 고풍스럽고 불필요한 일처럼 보입니다.

나는 그것에 대한 이점이나 필요를 보지 못합니다. 뭔가 빠졌 나봐요.


html <form> 태그없이 양식에 대한 작업과 방법을 어떻게 정의합니까?
다리 안

3
jQuery에서 할 경우 버튼에 click () 함수를 사용하고 그 안에서 ajax () 함수를 사용합니다. 제 생각에는 훨씬 간단하고 읽기 쉬운 코드입니다. 그리고 쉽게 간단한의 자바 스크립트로 페이지를 새로 고칠 수 있습니다
D-마크

24
이 질문이 반대 투표를 받았다는 것이 놀랍습니다. 나는 이것을 완전히 봤다.
dwjohnston

2
당신이 새로운 여기에 ...해야 @dwjohnston
스테파노 Borini

3
좋은 질문입니다! 양식을 사용하지 않는 다른 이유는 페이지 구조를 제한한다는 사실 (양식 내부에 양식을 가질 수 없기 때문), 체크하지 않으면 확인란이 무시된다는 사실과 같은 직렬화 문제 (종종 제출 데이터를 수동으로 준비) HTML은 기본적으로 페이지의 내용과 구조이고 JS는 역 동성입니다. 양식 요소는 JS 작업에서 약간 겹치며 내 페이지를 구조화하는 것을 좋아합니다.
3snoW

답변:


93

당신이 놓치고있는 것은 시맨틱 마크 업과 DOM에 .

현실적으로 HTML5 마크 업으로 원하는 모든 작업을 수행 할 수 있으며 대부분의 브라우저에서이를 구문 분석합니다. 내가 마지막으로 확인했을 때 WebKit / Blink는 요소 내부의 의사 요소<input> 도 허용 합니다 . 이는 Gecko 사양에 대한 명확한 위반입니다. 그러나 마크 업으로 원하는대로 수행하면 의미론에 관한 한 의심 할 여지없이 마크 업이 무효화됩니다.

<input>요소 안에 요소 를 넣는 이유는 무엇 <form>입니까? 같은 이유로 <li>태그를 <ul><ol>요소 내부에 넣습니다. 태그가 속한 곳입니다. 그것은의 의미 , 수정 및 마크 업을 정의하는 데 도움이됩니다. 구문 분석기, 화면 판독기 및 다양한 소프트웨어는 마크 업이 구조뿐 아니라 의미가있을 때 의미 상 올 바르면 마크 업을 더 잘 이해할 수 있습니다.

<form>요소를 사용하면 양식이 제출 될 때 수행 할 작업을 브라우저에 알리는 methodaction속성 을 정의 할 수도 있습니다 . AJAX는 100 % 커버리지 도구가 아니며 웹 개발자로서 당신은 우아한 저하를 연습해야합니다. JS가 꺼져 있어도 양식을 제출하고 데이터를 전송할 수 있어야합니다.

마지막으로 양식은 모두 DOM에 올바르게 등록됩니다. JavaScript로이를 엿볼 수 있습니다. 바로이 페이지에서 콘솔을 열고 다음을 입력하면 :

document.forms

페이지에있는 모든 양식의 멋진 컬렉션을 얻을 수 있습니다. 검색 창, 주석 상자, 답변 상자-모든 적절한 양식. 이 인터페이스는 정보에 액세스하고 이러한 요소와 상호 작용하는 데 유용 할 수 있습니다. 예를 들어 양식은 매우 쉽게 직렬화 할 수 있습니다.

다음은 몇 가지 읽기 자료입니다.

참고 : <input>요소는 양식 외부에서 사용할 수 있지만 어떤 방식 으로든 데이터를 제출하려는 경우 양식을 사용해야합니다.


이것은 내가 질문을 뒤집는 대답의 일부입니다.

양식을 피함으로써 어떻게 내 삶을 더 힘들게 만들고 있습니까?

가장 중요한 것은 컨테이너 요소입니다. 누가 필요 하죠?!

확실히 당신의 작은 요소 <input><button>요소가 일종의 컨테이너 요소 안에 중첩 되어 있습니까? 그들은 다른 모든 것의 중간에 떠있을 수 없습니다. 그렇다면 <form>, 그렇다면 무엇입니까? A <div>? ㅏ<span> ?

이러한 요소 어딘가에 있어야 하며 마크 업이 엉망이 아닌 한 컨테이너 요소는 양식이 될 수 있습니다.

아니? 오.

이 시점에서 내 머릿속의 목소리는 이러한 모든 다양한 AJAX 상황에 대한 이벤트 핸들러를 만드는 방법에 대해 매우 궁금합니다. 바이트를 절약하기 위해 마크 업을 줄여야한다면 많은 것이있을 것입니다. 그런 다음 각 요소 '세트'에 해당하는 각 AJAX 이벤트에 대한 사용자 지정 함수를 만들어야합니다. 개별적으로 또는 클래스로 대상을 지정해야합니다. 이러한 요소를 일반적으로 그룹화 할 수있는 방법은 없습니다. 우리는 마크 업 주변을 돌아 다니며 필요할 때까지 무엇이든 수행하도록 설정했기 때문입니다.

따라서 몇 가지 핸들러를 사용자 지정합니다.

$('#searchButton').on('click', function (e) {
  e.preventDefault();

  var search = $('#mySearch');

  $.ajax({
    url: 'http://example.com/text',
    type: 'GET',
    dataType: 'text',
    data: 'query=' + search.val(),
    success: function (data) {
      console.log(data);
    }
  });
});


$('#login').on('click', function (e) {
  e.preventDefault();
  var user = $('#username'),
      pass = $('#password'),
      rem = $('#remember');
  
  $.ajax({
    url: 'http://example.com/login',
    type: 'POST',
    data: user.add(pass, rem).serialize(),
    dataType: 'text',
    success: function (data) {
      console.log(data);
    }
  });
});
<!-- No containers, extra markup is silly. -->

<input type="text" id="mySearch" value="query" />
<button id="searchButton">Search</button>
<input type="text" id="username" name="username" value="user" />
<input type="password" id="password" name="password" value="pass" />
<input type="checkbox" id="remember" name="remember" checked /> stay logged in
<button id="login">Login</button>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

이것은 다음과 같이 말하는 부분입니다.

'하지만 재사용 가능한 기능을 완전히 사용합니다. 과장하지 마세요. '

충분히 공평하지만 여전히 이러한 고유 요소 집합 또는 대상 클래스 집합을 만들어야합니다. 당신은 여전히에있는 그룹 이러한 요소를 어떻게 든.

당신의 눈 (또는 스크린 리더를 사용하고 있고 약간의 도움이 필요하다면 귀를 빌려주세요. 다행입니다. 우리 가이 모든 의미 론적 마크 업에 ARIA 를 추가 할 수 있습니다. 그렇죠?) 그리고 일반적인 형태의 힘을보십시오.

function genericAjaxForm (e) {
  e.preventDefault();
  var form = $(this);
  
  return $.ajax({
    url: form.attr('action'),
    type: form.attr('method'),
    dataType: form.data('type'),
    data: form.serialize()
  });
}

$('#login-form').on('submit', function (e) {
  genericAjaxForm.call(this, e).done(function (data) {
    console.log(data);
  });
});
<form action="http://example.com/login" method="POST" data-type="text" id="login-form">
  <input type="text" name="username" value="user" />
  <input type="password" name="password" value="mypass" />
  <label>
    <input type="checkbox" name="remember" /> Remember me
  </label>

  <button type="submit">Login</button>
</form>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

우리는 이것을 어떤 일반적인 형태로도 사용할 수 있고, 우리의 우아한 저하를 유지하고, 그것이 어떻게 작동해야하는지 완전히 설명하도록 할 수 있습니다. 일반적인 스타일 을 유지하면서이 기본 기능을 확장 할 수 있습니다 . JavaScript는 적절한 요소를 숨기거나 응답을 처리하는 것과 같은 자체적 인 문제에 대해서만 걱정합니다.

이제 다음과 같이 말합니다.

'하지만 <div>특정 ID를 가진 요소로 의사 양식을 래핑합니다. 그런 다음 .find, 및 .serialize그들 과 함께 느슨하게 입력을 대상으로 지정할 수 있습니다 .

오, 그게 뭔데요? 실제로 <input>컨테이너에 요소를 포장 합니까?

그렇다면 아직 형태가 아닌 이유는 무엇입니까?


3
모든 형태를 들여다 보는 것은 좋은 점입니다. 이것이 장점으로 여겨지는 이유를 알 수 있습니다. 그 외에도 양식 내에서 입력을 사용해야한다고 말하는 이유는 무엇입니까? 실질적인 이점을 제공하지 않는 것 같습니다. 추가 코드 만 있습니다. 나는 온라인에서 양식 외부에 입력을 배치하는 것이 의미 론적으로 올바르지 않다는 내용을 읽지 않았기 때문에 uls 및 ols와 비교하는 것이 공정하지 않다고 생각합니다. 그리고 현실적으로 나는 자바 스크립트가 꺼져 있다면 누구도 내 웹 사이트를 사용하지 않기를 바랍니다. 또한 온라인 사용자의 1 % 만 차지할 것입니다.
D-Marc

2
우리가 <form>요소 를 사용하는 이유에 대한 답을 찾는 것보다 덜 하고 자신의 마크 업 선택을 확인하려는 것 같습니다. 이것은 내가 말했듯이, 당신이 자유롭게, 괜찮 무엇 이건 당신의 마크 업처럼,하지만 내가 우리 개발자가 양식을 사용 주된 이유를 설명했다.
Oka

2
훌륭한 포인트가 만들어졌습니다. 시간을내어 답변을 더 정교화하고 실제 코드 예제를 제공 한 사실에 진심으로 감사드립니다. 나는 양식을 다시 시도하고 내가 그렇게하는 것을 더 좋아하는지 볼 것입니다. 도움을 주셔서 다시 한 번 감사드립니다. 그러나 하나의 텍스트 상자에 양식을 감싸는 것이 무의미하다고 생각하지 않습니까?
D-Marc

상황에 따라 다릅니다. 이외의 이벤트에 대해 AJAX를 통해 독점적으로 API 끝점을 폴링하는 검색 상자와 같이 직접 제출 하지 않는 입력은 JavaScript 없이는submit 기능이 없기 때문에 양식에 래핑되는 것을 생략 할 수 있습니다 . 의미가 좋지 않은 외부 를 갖는 것은 잘못된 마크 업이 아닙니다 . 적절한 이벤트 와 함께 AJAX없이 데이터를 제출할 수있는 방법이 있다면 양식이 가장 좋습니다. 다시 말하지만, 요소에는 컨테이너가 필요하고 요소는 기본적으로 블록 수준이므로 . <input><form>submit<form><div>
Oka

7

AJAX없이 양식을 제출하려면 양식 태그가 여전히 필요합니다 (개발 초기 단계에서 유용 할 수 있음). 그러나 자바 스크립트를 사용하여 양식 태그없이 데이터를 제출할 수 있지만 몇 가지 이점이 여전히 떠 오릅니다.

  1. 양식 태그를 사용하면 의도를 보여줌으로써 사람들이 코드를 읽고 이해하는 데 도움이 될 수 있습니다.
  2. '제출'방법은 양식에서 사용할 수 있습니다. 입력 [type = submit]이있는 양식이 있고 비활성화되지 않은 경우 다른 양식 입력 중 하나를 작성하는 동안 누군가가 '입력'을 누르면 양식이 제출됩니다. 입력 요소에서 'keydown'이벤트를 수신하면 여전히이를 수행 할 수 있지만 양식 태그로 무료로 얻을 수있는 좋은 UI입니다.
  3. 양식 태그로만 작동하거나 양식 태그로 더 쉽게 작동하는 몇 가지 다른 사항이 있습니다. 개발자는 결국 이러한 경우에 직면하게되며, 항상 어디서나 사용하고 문제를 피하는 것이 더 쉽다고 결정합니다. 정말로 진짜 질문은 왜 양식 태그를 사용 하지 않는가입니다.

또한 jQuery와 같은 것은 .serialize()양식 요소에서만 작동합니다.
EJTH

0

HTML 요소는 웹 서버에 정보를 제출하는 대화 형 컨트롤이 포함 된 문서 섹션을 나타냅니다.

우리는 모두 html 웹 페이지의 양식에 익숙합니다. 사람들이나 회사는 여러 가지 이유로 이메일 주소, 이름 및 사이트 URL을 요구합니다. 오늘날 인터넷에서 제품을 구매하는 것은 대부분 쉬운 일이며 보안 장치의 출현으로 귀하의 세부 정보와 힘들게 번 돈을 제출하는 데 사용되는 방법은 일반적으로 양식을 통해 수행됩니다.

더 많은 정보

하나를 연결

두 연결


예,하지만 데이터를 제출하기 위해 양식에서 이메일 주소 또는 비밀번호와 같은 텍스트 입력을 감쌀 필요가 없습니다. ajax로 쉽게 할 수 있습니다. 양식은 추가 보안을 제공하지 않습니다. 그러나 데이터를 암호화하면 PHP로 할 수 있습니다.
D-Marc

0

단일 웹 페이지에 3 개의 양식이 있고 모두 별도의 이메일 필드 (다른 ID 포함)가있는 시나리오가있었습니다. <div>처음 에는 따로 포장했습니다 . Safari의 iOS 자동 채우기는 <form>태그로 모두 감싸기 전까지 이상하게 작동했습니다 . 양식 중 하나에는 뉴스 레터 구독을위한 입력 필드가 하나만있었습니다. 사용자가 해당 입력을 자동으로 입력하면 웹 페이지가 페이지의 다른 부분에있는 다음 입력 필드로 스크롤됩니다.

그래서 긴 게시물에 대해 Oka에게 감사드립니다. 의미 론적 의미가있는 태그는 가능한 한 사용되어야합니다. 어떤 브라우저 / 장치가 다른 솔루션을 잘 처리하지 못하는지 알 수 없기 때문입니다.

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