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ụ.
- 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
- 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ính | Giá trị | Ý nghĩa |
|---|---|---|
| action | URL | Nơi nhận dữ liệu; bỏ trống = gửi về chính trang hiện tại |
| method | get | post | dialog | Cách gửi; mặc định get |
| target | _self | _blank | tên iframe | Nơi hiển thị kết quả |
| autocomplete | on | off | Cho 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 |
| enctype | application/x-www-form-urlencoded | multipart/form-data | text/plain | Cách mã hóa dữ liệu POST |
| name | chuỗi | Tên form, dùng trong JavaScript |
| accept-charset | UTF-8 | Bả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>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í | GET | POST |
|---|---|---|
| Vị trí dữ liệu | URL | Thân yêu cầu |
| Giới hạn độ dài | Khoảng vài nghìn ký tự | Gần như không giới hạn |
| Lưu lịch sử, dấu trang | Có | Không |
| Gửi lại khi tải lại trang | Tự động | Trình duyệt hỏi xác nhận |
| Dùng cho | Tì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>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ở 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.
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.
- Tạo form tìm kiếm Wikipedia tiếng Việt (action="https://vi.wikipedia.org/w/index.php", name="search").
- Gửi form GET có 3 trường và quan sát URL.
- Thêm enctype cho form nộp bài tập có tải tệp.
- Dùng tab Network quan sát dữ liệu một form POST.
- 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".