Biểu mẫu HTML: Chọn-Tùy chọn so với Nhà cung cấp-Tùy chọn


136

Tôi đã tự hỏi sự khác biệt giữa Lựa chọn-Tùy chọn và Tùy chọn dữ liệu. Có bất kỳ tình huống nào sẽ tốt hơn khi sử dụng cái này hay cái kia không? Một ví dụ về mỗi sau:

Chọn tùy chọn

<select name="browser">
<option value="firefox">Firefox</option>
<option value="ie">IE</option>
<option value="chrome">Chrome</option>
<option value="opera">Opera</option>
<option value="safari">Safari</option>
</select>

Datalist-Tùy chọn

<input type=text list=browsers>
<datalist id=browsers>
  <option value="Firefox">
  <option value="IE">
  <option value="Chrome">
  <option value="Opera">
  <option value="Safari">
</datalist>

11
Bởi vì HTML5 đặc biệt nói rằng các thuộc tính không được trích dẫn là hợp lệ: w3.org/TR/html-markup/syntax.html#syntax-attr-unquote
james.garriss

1
Bất cứ ai cũng biết tại sao chúng ta không đóng optionthẻ trong tùy chọn datalist? Sublime dường như muốn
Johnny Metz

1
@ johnny Metz Bạn có thể đóng thẻ nhưng nó có thể tự đóng, bạn cũng có thể làm một cái gì đó như thế này: code <input list = "browser" name = "browser"> <datalist id = "browser"> <tùy chọn value = "firefox" > Firefox </ tùy chọn> <tùy chọn giá trị = "tức là"> IE </ tùy chọn> <tùy chọn giá trị = "chrome"> Chrome </ tùy chọn> <tùy chọn giá trị = "opera"> Opera </ tùy chọn> <tùy chọn giá trị = " safari "> Safari </ tùy chọn> </ datalist> codeKết quả thật kỳ lạ. Datalists in giá trị trong danh sách. Giá trị đó sau đó trở thành giá trị của trường đầu vào.
Sarah M Giles

3
@JohnnyMetz, HTML 5, một phần, là một phản ứng chống lại XHTML. Đối với các yếu tố nhất định, như option, không cần phải có thẻ đóng hoặc tự đóng. HTML 5! = XHTML.
james.garriss

2
Thông số kỹ thuật cho biết, "Thẻ bắt đầu và kết thúc của một số yếu tố bình thường có thể được bỏ qua." Nó cũng cho biết, "Thẻ kết thúc của phần tử tùy chọn có thể bị bỏ qua nếu phần tử tùy chọn ngay lập tức được theo sau bởi một phần tử tùy chọn khác hoặc nếu nó được theo sau bởi một phần tử optgroup hoặc nếu không có thêm nội dung trong phần tử cha." w3.org/TR/html/syntax.html#optional-tags
james.garriss

Câu trả lời:


180

Hãy nghĩ về nó như sự khác biệt giữa một yêu cầu và một gợi ý. Đối với selectphần tử, người dùng được yêu cầu chọn một trong các tùy chọn bạn đã đưa ra. Đối với datalistphần tử, người dùng nên chọn một trong các tùy chọn bạn đã đưa ra, nhưng anh ta thực sự có thể nhập bất cứ thứ gì anh ta muốn vào đầu vào.

Chỉnh sửa 1: Vì vậy, cái nào bạn sử dụng phụ thuộc vào yêu cầu của bạn. Nếu người dùng phải nhập một trong các lựa chọn của bạn, hãy sử dụng selectphần tử. Nếu việc sử dụng có thể nhập bất cứ điều gì, sử dụng các datalistyếu tố.

Chỉnh sửa 2: Tìm thấy mẩu tin này trong Tiêu chuẩn sống HTML : "Mỗi phần tử tùy chọn là hậu duệ của phần tử dữ liệu ... đại diện cho một đề xuất."


Ngoài ra, nó chủ yếu có [hỗ trợ một phần] (( caniuse.com/#feat=dirthist ) trong các trình duyệt khác, với các lỗi như trình thu thập dữ liệu dài trở nên không thể kiểm soát được, v.v.
Govind Rai

Trong chrome tại thời điểm này, nếu dữ liệu được nhập (gõ), nó sẽ cấm mũi tên được nhấp. Điều này có lẽ không lý tưởng trong hầu hết các trường hợp.
David

66

Từ quan điểm kỹ thuật, chúng hoàn toàn khác nhau. <datalist>là một thùng chứa các tùy chọn trừu tượng cho các yếu tố khác. Trong trường hợp của bạn, bạn đã sử dụng nó với <input type="text"nhưng bạn cũng có thể sử dụng nó với phạm vi, màu sắc, ngày tháng, v.v ... http://demo.agektmr.com/dirthist/

Nếu sử dụng nó với kiểu nhập văn bản, như một kiểu tự động hoàn thành, thì câu hỏi thực sự là: Sử dụng kiểu nhập văn bản dạng tự do hay danh sách tùy chọn được xác định trước là tốt hơn? Trong trường hợp đó tôi nghĩ câu trả lời rõ ràng hơn một chút.

Nếu chúng ta tập trung vào việc sử dụng <datalist>làm danh sách các tùy chọn cho trường văn bản thì đây là một số khác biệt cụ thể giữa hộp đó và hộp chọn:

  • Một <datalist>hộp văn bản được cung cấp có một chuỗi cho cả nhãn hiển thị và gửi. Một hộp chọn có thể có giá trị gửi khác với nhãn hiển thị <option value='ie'>Internet Explorer</option>.
  • Một <datalist>hộp văn bản cho ăn không hỗ trợ <optgroup>thẻ để tổ chức hiển thị.
  • Bạn không thể giới hạn người dùng trong danh sách các tùy chọn <datalist>giống như bạn có thể với <select>.
  • Sự kiện onchange hoạt động khác nhau. Trên một <select>phần tử, sự kiện onchange được kích hoạt ngay lập tức khi thay đổi, trong khi đó với <input type="text"sự kiện được kích hoạt sau khi phần tử mất tiêu điểm hoặc người dùng nhấn enter.
  • <datalist>đã thực sự hỗ trợ đốm trên các trình duyệt. Cách để hiển thị tất cả các tùy chọn có sẵn là không nhất quán và mọi thứ chỉ trở nên tồi tệ hơn từ đó.

Điểm cuối cùng thực sự là một điểm lớn trong quan điểm của tôi. Vì bạn sẽ phải có một dự phòng tự động hoàn thành phổ quát hơn, nên gần như không có lý do gì để trải qua sự cố cấu hình a <datalist>. Ngoài ra, bất kỳ thao tác cắm tự động hoàn chỉnh nào cũng sẽ cho phép các cách định kiểu hiển thị các tùy chọn của bạn, điều <datalist>này không thực hiện được. Nếu các yếu tố <datalist>được chấp nhận <li>mà bạn có thể thao tác theo cách bạn muốn, nó sẽ thực sự tuyệt vời! Nhưng không.

Cũng trong chừng mực mà tôi có thể nói, <datalist>tìm kiếm là một kết hợp chính xác từ đầu chuỗi. Vì vậy, nếu bạn có <option value="internet explorer">và bạn đã tìm kiếm 'thám hiểm', bạn sẽ không nhận được kết quả. Hầu hết các plugin tự động hoàn thành sẽ tìm kiếm bất cứ nơi nào trong văn bản.

Tôi chỉ được sử dụng <datalist>như một người trợ giúp tiện lợi nhanh chóng và lười biếng cho một số trang nội bộ mà tôi biết chắc chắn 100% rằng người dùng có Chrome hoặc Firefox mới nhất và sẽ không cố gửi các giá trị không có thật. Đối với bất kỳ trường hợp nào khác, thật khó để khuyến nghị sử dụng <datalist>do hỗ trợ trình duyệt rất kém.


3
Câu trả lời tuyệt vời !! Bạn có thể vui lòng giải thích viên đạn thứ hai của bạn? Bạn có ý nghĩa gì bởi "các nhóm tùy chọn để tổ chức hiển thị"? Cảm ơn.
Govind Rai

afaik (năm 2019, trên Chrome và Firefox), <datalist> khớp với các phần tử (không chỉ tiền tố). vì vậy "gõ" lại "gợi ý cả" Firefox "và" Internet Explorer ".
sam boosalis

@GovindRai Tôi tìm kiếm chữ thảo của "phần tử optgroup" trả về trang này từ MDN luôn hữu ích với nhiều thông tin hơn (và ví dụ): developer.mozilla.org/en-US/docs/Web/HTML/Euity/optgroup
TylerH

Tôi đã thử nghiệm trong Firefox 66 và Chrome 73 - thực tế, nhãn datalist khớp với mọi nơi, vì vậy, ví dụ nếu nhà cung cấp dữ liệu của bạn chứa tên quốc gia, "ted" sẽ khớp với "Hoa Kỳ" và "Vương quốc Anh".
Błotosmętek

5

Datalist bao gồm tự động hoàn thành và đề xuất nguyên bản, nó cũng có thể cho phép người dùng nhập một giá trị không được xác định trong các đề xuất.

Chọn chỉ cung cấp cho bạn các tùy chọn được xác định trước mà người dùng phải chọn từ


2

Danh sách dữ liệu là một thẻ HTML mới trong các trình duyệt được hỗ trợ HTML5. Nó kết xuất dưới dạng một hộp văn bản với một số danh sách các tùy chọn. Ví dụ cho hộp Văn bản Giới tính, nó sẽ cung cấp cho bạn các tùy chọn là Nam Nữ khi bạn nhập 'M' hoặc 'F' trong Hộp văn bản.

<input list="Gender">
<datalist id="Gender">
  <option value="Male">
  <option value="Female> 
</datalist>

5
Đúng, nhưng nó cung cấp một thông tin mới, hay, cụ thể là việc gõ chữ cái đầu tiên sẽ chọn các mục tương ứng trong danh sách.
james.garriss

1

Để trả lời cụ thể một phần câu hỏi của bạn "Có tình huống nào tốt hơn là sử dụng cái này hay cái kia không?", Hãy xem xét một hình thức với các phần lặp lại. Nếu phần lặp lại chứa nhiều selectthẻ, thì options phải được hiển thị cho mỗi lựa chọn, cho mỗi hàng.

Trong trường hợp như vậy, tôi sẽ cân nhắc sử dụng datalistvới input, bởi vì datalistcó thể sử dụng tương tự cho bất kỳ số inputs nào. Điều này có khả năng tiết kiệm một lượng lớn thời gian kết xuất trên máy chủ và sẽ mở rộng tốt hơn cho bất kỳ số lượng hàng nào.


Nếu bạn không muốn đưa ra các tùy chọn người dùng để lựa chọn, tại sao lại phải sử dụng một datalist? Chỉ cần sử dụng một trường văn bản thay thế.
james.garriss

0

Tôi nhận thấy rằng không có tính năng được chọn trong datalist. Nó chỉ cung cấp cho bạn sự lựa chọn nhưng không thể có tùy chọn mặc định. Bạn cũng không thể hiển thị tùy chọn đã chọn trên trang tiếp theo.


Tương đương với một datalist đầu vào cộng sẽ đặt giá trị = "(tùy chọn mặc định)" trên chính đầu vào. Đối với đầu vào có loại = "văn bản", văn bản này sẽ xuất hiện theo mặc định nhưng có thể chỉnh sửa.
Bemisawa

0

Có một sự khác biệt quan trọng khác giữa selectdatalist. Ở đây có yếu tố hỗ trợ trình duyệt.

select được hỗ trợ rộng rãi bởi các trình duyệt so với datalist. Vui lòng xem trang này để được hỗ trợ trình duyệt hoàn chỉnh của datalist--

Hỗ trợ trình duyệt dữ liệu

Khi chọn được hỗ trợ hiệu quả trong tất cả các trình duyệt (kể từ IE6 +, Firefox 2+, Chrome 1+, v.v.)


0

Tương tự như chọn, nhưng datalist có các chức năng bổ sung như tự động đề xuất. Bạn thậm chí có thể nhập và xem các đề xuất như và khi bạn nhập.

Người dùng cũng sẽ có thể viết các mục không có trong danh sách.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.