Thuộc tính của phần tử form

Phần tử form có nhiều thuộc tính quyết định dữ liệu được gửi đi đâu, gửi thế nào, mở kết quả ở đâu và trình duyệt có kiểm tra, gợi ý dữ liệu hay không. Bài này giải thích từng thuộc tính kèm ví dụ.

30 phútTrung cấp
Bạn sẽ học được
  • Dùng action, method để gửi dữ liệu
  • Hiểu dữ liệu GET xuất hiện trên URL như thế nào
  • Dùng target, autocomplete, novalidate
  • Chọn enctype đúng khi tải tệp
Thuật ngữ cần biết
Query string
Phần sau dấu ? trên URL: ?ten=An&tuoi=20.
Request body
Thân yêu cầu HTTP, nơi chứa dữ liệu POST.
Encoding
Cách mã hóa dữ liệu khi gửi.

Khái niệm và lý thuyết

Khi bấm nút gửi, trình duyệt thu thập mọi trường có thuộc tính name bên trong form, ghép thành các cặp name=giá trị, rồi gửi tới địa chỉ trong action theo phương thức method. Trường không có name hoặc đang disabled sẽ không được gửi.

Thuộc tínhGiá trịÝ nghĩa
actionURLNơi nhận dữ liệu; bỏ trống = gửi về chính trang hiện tại
methodget | post | dialogCách gửi; mặc định get
target_self | _blank | tên iframeNơi hiển thị kết quả
autocompleteon | offCho trình duyệt gợi ý dữ liệu đã nhập
novalidate(boolean)Tắt kiểm tra dữ liệu của trình duyệt
enctypeapplication/x-www-form-urlencoded | multipart/form-data | text/plainCách mã hóa dữ liệu POST
namechuỗiTên form, dùng trong JavaScript
accept-charsetUTF-8Bảng mã dữ liệu gửi đi

method="get": dữ liệu trên URL

<form action="https://www.google.com/search" method="get" target="_blank">
  <label for="q">Tìm trên Google:</label>
  <input type="search" id="q" name="q" value="học HTML tuhoctin">
  <button type="submit">Tìm</button>
</form>
Kết quả hiển thị

Bấm Tìm: tab mới mở địa chỉ dạng https://www.google.com/search?q=học+HTML+tuhoctin. Tên trường q chính là tham số mà Google đọc. Cách này phù hợp tìm kiếm, lọc, phân trang vì người dùng có thể lưu, chia sẻ đường dẫn.

method="post": dữ liệu ẩn trong thân yêu cầu

<form action="/dang-nhap.php" method="post">
  <input type="email" name="email">
  <input type="password" name="mat_khau">
  <button type="submit">Đăng nhập</button>
</form>
Tiêu chíGETPOST
Vị trí dữ liệuURLThân yêu cầu
Giới hạn độ dàiKhoảng vài nghìn ký tựGần như không giới hạn
Lưu lịch sử, dấu trangCóKhông
Gửi lại khi tải lại trangTự độngTrình duyệt hỏi xác nhận
Dùng choTìm kiếm, lọcĐăng nhập, đăng ký, thanh toán, tải tệp

enctype khi tải tệp

<form action="/tai-len.php" method="post" enctype="multipart/form-data">
  <input type="file" name="bai_nop" accept=".pdf,.docx">
  <button type="submit">Nộp bài</button>
</form>

Thiếu enctype="multipart/form-data", máy chủ chỉ nhận được tên tệp chứ không nhận nội dung tệp.

autocomplete và novalidate

<form autocomplete="on" novalidate onsubmit="alert('Gửi được dù email sai vì có novalidate'); return false;">
  <input type="email" name="email" placeholder="Nhập thử chữ sai định dạng" required>
  <button>Gửi</button>
</form>
Kết quả hiển thị

novalidate thường dùng khi bạn tự viết kiểm tra bằng JavaScript và muốn hiển thị thông báo lỗi theo thiết kế riêng.

Mẹo hay

Mở DevTools (F12) → tab Network, gửi form và bấm vào yêu cầu: mục Payload cho bạn thấy chính xác dữ liệu nào đã được gửi đi.

Lưu ý

Dữ liệu POST không bị mã hóa nếu trang dùng HTTP thường. Trang có đăng nhập, thanh toán bắt buộc phải dùng HTTPS.

Thực hành
  1. Tạo form tìm kiếm Wikipedia tiếng Việt (action="https://vi.wikipedia.org/w/index.php", name="search").
  2. Gửi form GET có 3 trường và quan sát URL.
  3. Thêm enctype cho form nộp bài tập có tải tệp.
  4. Dùng tab Network quan sát dữ liệu một form POST.
Tóm tắt bài học
  • action là nơi nhận, method là cách gửi.
  • Chỉ trường có name và không disabled mới được gửi.
  • GET cho tìm kiếm, POST cho dữ liệu nhạy cảm, lớn.
  • Tải tệp cần method="post" và enctype="multipart/form-data".