จุดประสงค์ของแท็กฟอร์ม html คืออะไร


111

ฉันไม่เข้าใจจุดประสงค์ของแท็กแบบฟอร์มใน html

ฉันสามารถใช้อินพุตประเภทใดก็ได้อย่างสมบูรณ์แบบโดยไม่ต้องใช้แท็กแบบฟอร์ม ดูเหมือนจะซ้ำซ้อนในการพันรอบอินพุต

นอกจากนี้หากฉันใช้ ajax เพื่อเรียกเพจฝั่งเซิร์ฟเวอร์ฉันก็สามารถใช้ jQuery ได้ ข้อยกเว้นประการเดียวคือฉันสังเกตเห็นว่าคุณต้องห่อสคริปต์การอัปโหลดไว้รอบ ๆ แท็กแบบฟอร์มด้วยเหตุผลบางประการ

เหตุใดแบบฟอร์มจึงยังคงใช้กันอย่างแพร่หลายสำหรับสิ่งง่ายๆเช่นอินพุตข้อความ? ดูเหมือนเป็นสิ่งที่คร่ำครึและไม่จำเป็นที่ต้องทำ

ฉันไม่เห็นประโยชน์หรือความจำเป็นสำหรับมัน บางทีฉันอาจจะขาดอะไรไป


คุณกำหนดการดำเนินการและวิธีการสำหรับฟอร์มของคุณโดยไม่มีแท็ก html <form> ได้อย่างไร
Darian

3
ถ้าฉันจะทำใน jQuery ฉันจะใช้ฟังก์ชัน click () ที่ปุ่มและภายในนั้นฉันจะใช้ฟังก์ชัน ajax () ง่ายกว่าและง่ายกว่ามากในการอ่านโค้ดในความคิดของฉัน และฉันสามารถรีเฟรชหน้าได้อย่างง่ายดายด้วย javascript
D-Marc

26
ฉันแปลกใจที่คำถามนี้ได้รับการโหวตลดลง ฉันแค่ googled สิ่งนี้ทั้งหมด
dwjohnston

2
@dwjohnston คุณต้องเป็นคนใหม่ที่นี่ ...
Stefano Borini

3
คำถามดีมาก! เหตุผลอื่น ๆ ที่ฉันไม่ชอบใช้แบบฟอร์มรวมถึงความจริงที่ว่ามัน จำกัด โครงสร้างเพจของคุณ (เนื่องจากคุณไม่สามารถมีแบบฟอร์มในฟอร์มได้) นิสัยแปลก ๆ ในการทำให้เป็นอนุกรมเช่นความจริงที่ว่าช่องทำเครื่องหมายจะถูกละเว้นหากไม่เลือก (หมายถึงฉันมักจะจบลง การเตรียมการส่งข้อมูลด้วยตนเอง) และเนื่องจาก HTML เป็นพื้นฐานของเนื้อหาและโครงสร้างของหน้าในขณะที่ JS เป็นพลวัต องค์ประกอบของฟอร์มทับซ้อนกันเล็กน้อยในงานของ JS และฉันต้องการให้หน้าของฉันมีโครงสร้าง
3snoW

คำตอบ:


99

สิ่งที่คุณขาดหายไปคือความเข้าใจเกี่ยวกับมาร์กอัปเชิงความหมายและ DOM

ในความเป็นจริงคุณสามารถทำอะไรก็ได้ที่คุณต้องการด้วยมาร์กอัป HTML5 และเบราว์เซอร์ส่วนใหญ่จะแยกวิเคราะห์ ครั้งล่าสุดที่ฉันตรวจสอบ WebKit / Blink ยังอนุญาตให้ใช้องค์ประกอบหลอกภายใน<input>องค์ประกอบซึ่งเป็นการละเมิดข้อกำหนดอย่างชัดเจน - Gecko ไม่มากนัก อย่างไรก็ตามการทำอะไรก็ได้ที่คุณชอบด้วยมาร์กอัปของคุณจะทำให้ความหมายเป็นโมฆะอย่างไม่ต้องสงสัย

ทำไมเราจึงใส่<input>องค์ประกอบไว้ใน<form>องค์ประกอบ? ด้วยเหตุผลเดียวกันเราจึงใส่<li>แท็กไว้ในองค์ประกอบ<ul>และ<ol>เป็นที่ที่พวกเขาอยู่ มันเป็นความหมายที่ถูกต้องและช่วยในการกำหนดมาร์กอัป ตัววิเคราะห์โปรแกรมอ่านหน้าจอและซอฟต์แวร์ต่างๆสามารถเข้าใจมาร์กอัปของคุณได้ดีขึ้นเมื่อมันถูกต้องตามความหมาย - เมื่อมาร์กอัปมีความหมายไม่ใช่แค่โครงสร้าง

<form>องค์ประกอบยังช่วยให้คุณสามารถกำหนดmethodและactionคุณลักษณะที่บอกเบราว์เซอร์จะทำอย่างไรเมื่อการส่งแบบฟอร์ม AJAX ไม่ใช่เครื่องมือครอบคลุม 100% และในฐานะนักพัฒนาเว็บคุณควรฝึกฝนการย่อยสลายอย่างสง่างาม - ควรส่งแบบฟอร์มและโอนข้อมูลได้แม้ว่า JS จะปิดอยู่ก็ตาม

สุดท้ายแบบฟอร์มทั้งหมดได้รับการลงทะเบียนอย่างถูกต้องใน DOM เราสามารถดูสิ่งนี้ด้วย JavaScript หากคุณเปิดคอนโซลของคุณในหน้านี้และพิมพ์:

document.forms

คุณจะได้รับคอลเลกชันที่ดีของทุกรูปแบบในหน้านี้ แถบค้นหาช่องแสดงความคิดเห็นกล่องคำตอบ - รูปแบบที่เหมาะสมทั้งหมด อินเทอร์เฟซนี้มีประโยชน์ในการเข้าถึงข้อมูลและโต้ตอบกับองค์ประกอบเหล่านี้ ตัวอย่างเช่นสามารถต่ออนุกรมแบบฟอร์มได้ง่ายมาก

นี่คือเนื้อหาการอ่านบางส่วน:

หมายเหตุ: <input>สามารถใช้องค์ประกอบภายนอกแบบฟอร์มได้ แต่หากคุณต้องการส่งข้อมูลไม่ว่าด้วยวิธีใดก็ตามคุณควรใช้แบบฟอร์ม


นี่คือส่วนหนึ่งของคำตอบที่ฉันพลิกคำถาม

ฉันจะทำให้ชีวิตยากขึ้นโดยหลีกเลี่ยงรูปแบบได้อย่างไร?

สิ่งแรกและสำคัญที่สุด - องค์ประกอบคอนเทนเนอร์ ใครต้องการพวกเขาใช่มั้ย!

แน่นอนน้อยของคุณ<input>และ<button>องค์ประกอบซ้อนกันภายในชนิดขององค์ประกอบภาชนะบางอย่าง? พวกเขาไม่สามารถลอยอยู่ตรงกลางของสิ่งอื่นได้ แล้วถ้าไม่ใช่<form>แล้วล่ะ? ก<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>องค์ประกอบที่มีรหัสเฉพาะ - จากนั้นฉันสามารถกำหนดเป้าหมายอินพุตแบบหลวม ๆ ด้วย.findและ.serializeพวกเขาและ ... '

โอ้นั่นอะไร? คุณห่อ<input>องค์ประกอบของคุณไว้ในภาชนะจริงหรือ?

แล้วทำไมยังไม่เป็นรูปเป็นร่าง?


3
นั่นเป็นจุดที่ดีในการมองทุกรูปแบบ ฉันเห็นว่าทำไมถึงถูกมองว่าเป็นข้อดี นอกจากนั้นทำไมคุณถึงบอกว่าควรใช้อินพุตภายในฟอร์ม ดูเหมือนจะไม่ให้ประโยชน์ที่แท้จริง รหัสพิเศษเท่านั้น ฉันไม่เคยอ่านอะไรทางออนไลน์ที่บอกว่าการวางอินพุตนอกรูปแบบไม่ถูกต้องตามความหมายดังนั้นฉันจึงไม่คิดว่าการเปรียบเทียบกับ uls และ ols จะยุติธรรม และตามความเป็นจริงฉันไม่ต้องการให้ใครใช้เว็บไซต์ของฉันถ้าพวกเขาปิดจาวาสคริปต์ นอกจากนี้อาจคิดเป็นเพียง 1% ของผู้ใช้ออนไลน์
D-Marc

2
ดูเหมือนว่าคุณกำลังหาคำตอบอยู่ไม่น้อยว่าทำไมเราจึงใช้<form>องค์ประกอบและอื่น ๆ เช่นคุณพยายามยืนยันตัวเลือกมาร์กอัปของคุณเอง นี่เป็นเรื่องปกติอย่างที่ฉันบอกคุณมีอิสระที่จะทำอะไรก็ได้ที่คุณต้องการด้วยมาร์กอัปของคุณ แต่ฉันได้อธิบายเหตุผลหลักว่าทำไมเราจึงใช้แบบฟอร์ม
Oka

2
ทำคะแนนได้ดีเยี่ยม ขอขอบคุณอย่างยิ่งที่คุณสละเวลาในการอธิบายคำตอบของคุณมากขึ้นและให้ตัวอย่างโค้ดจริง ฉันจะให้แบบฟอร์มอื่นลองดูว่าฉันชอบทำแบบนั้นมากกว่านี้ไหม ขอขอบคุณอีกครั้งสำหรับความช่วยเหลือ อย่างไรก็ตามคุณไม่คิดว่าการห่อแบบฟอร์มรอบ ๆ กล่องข้อความเพียงกล่องเดียวนั้นไม่มีประโยชน์หรือ?
D-Marc

ขึ้นอยู่กับบริบท อินพุตที่ไม่เคยส่งโดยตรงเช่นช่องค้นหาที่สำรวจปลายทาง API โดยเฉพาะผ่าน AJAX ในเหตุการณ์อื่นที่ไม่ใช่submitสามารถละเว้นการรวมอยู่ในรูปแบบเนื่องจากจะไม่มีฟังก์ชันใด ๆหากไม่มี JavaScript ไม่ใช่มาร์กอัปที่ไม่ถูกต้องที่จะมีความหมาย<input>ภายนอก<form>เพียง แต่อาจไม่ดี หากมีวิธีที่สามารถส่งข้อมูลโดยไม่ใช้ AJAX โดยมีsubmitเหตุการณ์ที่เหมาะสมแบบฟอร์มน่าจะดีที่สุด อีกครั้งองค์ประกอบต้องการคอนเทนเนอร์และ<form>องค์ประกอบเป็นระดับบล็อกโดยค่าเริ่มต้นดังนั้นจึงทำหน้าที่เหมือนไฟล์<div>.
Oka

10

แท็กแบบฟอร์มยังคงมีความจำเป็นหากคุณต้องการส่งแบบฟอร์มโดยไม่ต้องใช้ AJAX (ซึ่งอาจมีประโยชน์ในช่วงแรกของการพัฒนา) แต่ถึงแม้ว่าจะเป็นไปได้ที่จะใช้จาวาสคริปต์ในการส่งข้อมูลโดยไม่มีแท็กแบบฟอร์ม แต่ก็ยังมีประโยชน์บางประการที่ควรคำนึงถึง:

  1. การใช้แท็กแบบฟอร์มสามารถช่วยให้ผู้คนอ่านและเข้าใจโค้ดของคุณได้ในบางกรณีโดยการแสดงเจตนาของคุณ
  2. วิธีการ "ส่ง" มีอยู่ในแบบฟอร์ม หากคุณมีแบบฟอร์มที่มีอินพุต [type = submit] และไม่ได้ปิดใช้งานเมื่อมีคนกด 'enter' ในขณะที่กรอกข้อมูลในฟอร์มอื่น ๆ ฟอร์มจะถูกส่ง คุณยังคงสามารถทำได้โดยการฟังเหตุการณ์ 'keydown' ในองค์ประกอบอินพุต แต่เป็น UI ที่ดีที่คุณได้รับฟรีด้วยแท็กแบบฟอร์ม
  3. มีสิ่งอื่น ๆ อีกสองสามอย่างที่ใช้ได้เฉพาะกับแท็กฟอร์มหรือง่ายกว่าเมื่อใช้แท็กแบบฟอร์ม ในที่สุดนักพัฒนาจะพบกับกรณีเหล่านี้และตัดสินใจว่าง่ายกว่าเพียงแค่ใช้พวกเขาทุกที่และหลีกเลี่ยงปัญหา จริงๆคำถามที่แท้จริงคือทำไมไม่ใช้แท็กแบบฟอร์ม?

1
นอกจากนี้สิ่งต่างๆเช่น jQuery .serialize()ใช้งานได้กับองค์ประกอบฟอร์มเท่านั้น
EJTH

0

องค์ประกอบ HTML แสดงถึงส่วนเอกสารที่มีการควบคุมแบบโต้ตอบเพื่อส่งข้อมูลไปยังเว็บเซิร์ฟเวอร์

เราทุกคนคุ้นเคยกับแบบฟอร์มบนหน้าเว็บ html ด้วยเหตุผลหลายประการที่ผู้คนหรือ บริษัท ต่างๆขอที่อยู่อีเมลชื่อและ URL ไซต์ของเรา การซื้อสินค้าทางอินเทอร์เน็ตในปัจจุบันส่วนใหญ่เป็นเรื่องง่ายและด้วยการถือกำเนิดของอุปกรณ์รักษาความปลอดภัยวิธีการที่ใช้ในการส่งรายละเอียดของคุณและเงินที่หาได้ยากมักดำเนินการผ่านแบบฟอร์ม

ข้อมูลเพิ่มเติม

ลิงค์หนึ่ง

ลิงค์สอง


ใช่ แต่คุณไม่จำเป็นต้องล้อมรอบอินพุตข้อความเช่นที่อยู่อีเมลหรือรหัสผ่านในแบบฟอร์มเพื่อส่งข้อมูล ฉันสามารถทำได้อย่างง่ายดายด้วย ajax แบบฟอร์มไม่ได้ให้ความปลอดภัยเพิ่มเติม อย่างไรก็ตามฉันสามารถทำได้ด้วย php ถ้าฉันเข้ารหัสข้อมูล
D-Marc

0

ฉันมีสถานการณ์ที่หน้าเว็บเดียวมี 3 แบบฟอร์มซึ่งทั้งหมดมีฟิลด์อีเมลแยกกัน (มี ID ต่างกัน) ตอนแรกห่อแยกกัน<div>ค่ะ การเติมอัตโนมัติของ iOS บน Safari ทำงานแปลก ๆ จนกระทั่งฉันรวมเข้าด้วยกันทั้งหมด<form>แท็ก หนึ่งในรูปแบบมีช่องป้อนข้อมูลเพียงช่องเดียวสำหรับการสมัครรับจดหมายข่าว เมื่อผู้ใช้ป้อนข้อมูลนั้นโดยอัตโนมัติหน้าเว็บจะถูกเลื่อนไปยังช่องป้อนข้อมูลถัดไปซึ่งอยู่ในส่วนต่างๆของหน้า

ขอบคุณ Oka สำหรับการโพสต์ยาว ๆ ควรใช้แท็กที่มีความหมายเชิงความหมายทุกครั้งที่เป็นไปได้เพราะคุณไม่มีทางรู้ว่าเบราว์เซอร์ / อุปกรณ์ใดที่จัดการโซลูชันอื่น ๆ ได้ไม่ดี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.