HTML chọn biểu mẫu với tùy chọn để nhập giá trị tùy chỉnh


104

Tôi muốn có một trường nhập liệu mà người dùng có thể nhập giá trị văn bản tùy chỉnh hoặc chọn từ trình đơn thả xuống. Một thông thường <select>chỉ cung cấp các tùy chọn thả xuống.

Làm cách nào để tạo <select>giá trị tùy chỉnh chấp nhận? Ví dụ: Ford?

<select>
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="mercedes">Mercedes</option>
  <option value="audi">Audi</option>
</select>

Bạn có thể sử dụng javascript để thêm động một tùy chọn vào vùng chọn nhưng sau đó sử dụng thông tin này sẽ trở thành một vấn đề thực sự.
David

Tôi đã không thêm tùy chọn đó cho các giá trị tùy chỉnh trên trang web finnmglas.com/contact của mình tuy nhiên ai đó đã liên hệ với tôi với giá trị tùy chỉnh. Điều đó thật kỳ lạ
finnmglas

Câu trả lời:


249

HTML5 có một hộp tổ hợp được tích hợp sẵn. Bạn tạo một văn bản inputvà một datalist. Sau đó, bạn thêm một listthuộc tính đến input, với một giá trị của idcủa datalist.

Cập nhật: Kể từ tháng 3 năm 2019, tất cả các trình duyệt chính (hiện bao gồm Safari 12.1 và iOS Safari 12.3) đều hỗ trợ datalistở mức cần thiết cho chức năng này. Xem caniuse để biết hỗ trợ trình duyệt chi tiết.

Nó trông như thế này:

<input type="text" list="cars" />
<datalist id="cars">
  <option>Volvo</option>
  <option>Saab</option>
  <option>Mercedes</option>
  <option>Audi</option>
</datalist>


3
Tính năng này chỉ được hỗ trợ bởi khoảng 50% trình duyệt. Chỉ firefox, chrome và opera mới nhất hỗ trợ điều này; IE, Safari và các trình duyệt di động thì không. Xem http://caniuse.com/
markmarijnissen

2
Đã nửa năm 2016 (hơn 2 năm sau) và hầu hết các trình duyệt vẫn không hỗ trợ đầy đủ tính năng này, ít nhất là không có lỗi đáng kể. Ít nhất một cái gì đó sẽ hoạt động trên các phiên bản gần đây của mọi thứ ngoại trừ Safari / Safari iOS, nhưng bạn phải kiểm tra để đảm bảo rằng các trường hợp sử dụng của bạn hoạt động bình thường. Đó vẫn là câu trả lời tốt nhất.
Michael Gaskill

1
Nó hoạt động tốt cho tôi. Trong nhiều trường hợp, chúng tôi không cần hỗ trợ các trình duyệt cũ. Tôi chỉ thêm hình ảnh "mũi tên xuống" trên nền của trường nhập liệu để cung cấp cho người dùng gợi ý rằng nó có thể mở rộng. Mã (bạn cần một tệp hình ảnh thực tế):<input type="text" list="cars" style="background:url('images/arrow_down.png') no-repeat right center">
Eugene Kardash

4
Tôi vừa thử nghiệm trong các phiên bản IE, Firefox và Chrome gần đây và tất cả đều hoạt động tốt. Tôi nghĩ rằng đây là một giải pháp đơn giản tuyệt vời cho vấn đề chung này cho nhiều trường hợp.
kerl

3
Tôi thực sự muốn sử dụng điều này nhưng tôi cần đặt giá trị mặc định. Người dùng chỉ thấy mặc định trong menu thả xuống so với tất cả các tùy chọn (vì chúng được lọc ra). Họ sẽ cần biết để xóa trường đầu vào trước khi thấy tất cả các tùy chọn.
Justin

26

JSFiddle mới nhất của Alen Saqe đã không bật tắt cho tôi trên Firefox, vì vậy tôi nghĩ rằng tôi sẽ cung cấp một giải pháp html / javascript đơn giản sẽ hoạt động tốt trong các biểu mẫu (liên quan đến việc gửi) cho đến ngày thẻ datalist được tất cả các trình duyệt / thiết bị chấp nhận. Để biết thêm chi tiết và xem nó hoạt động, hãy truy cập: http://jsfiddle.net/6nq7w/4/ Lưu ý: Không cho phép bất kỳ khoảng cách nào giữa các anh chị em đang chuyển đổi!

<!DOCTYPE html>
<html>
<script>
function toggleField(hideObj,showObj){
  hideObj.disabled=true;        
  hideObj.style.display='none';
  showObj.disabled=false;   
  showObj.style.display='inline';
  showObj.focus();
}
</script>
<body>
<form name="BrowserSurvey" action="#">
Browser: <select name="browser" 
          onchange="if(this.options[this.selectedIndex].value=='customOption'){
              toggleField(this,this.nextSibling);
              this.selectedIndex='0';
          }">
            <option></option>
            <option value="customOption">[type a custom value]</option>
            <option>Chrome</option>
            <option>Firefox</option>
            <option>Internet Explorer</option>
            <option>Opera</option>
            <option>Safari</option>
        </select><input name="browser" style="display:none;" disabled="disabled" 
            onblur="if(this.value==''){toggleField(this,this.previousSibling);}">
<input type="submit" value="Submit">
</form>
</body>
</html>


Tôi muốn thử lại lần nữa! Phiên bản phù thủy của Firefox không được hỗ trợ ở đó! Tôi đã thử nghiệm nó với một số phiên bản tôi không nhớ! Thanh danh!
Alen Saqe

Tôi không biết tôi đã sử dụng phiên bản FF nào. Tôi vừa mới xem qua FF34.0 và bây giờ tôi đang nhận được chức năng, vì vậy đừng lo lắng. Tuy nhiên, tùy chọn chuyển đổi mặc định "Khác" có thể bị xóa. Khi tôi xóa "Khác" bằng cách chỉnh sửa giá trị, menu thả xuống không cung cấp giá trị trực quan để chọn (để truy cập tính năng chỉnh sửa). Tôi nghĩ điều này phụ thuộc vào sở thích cá nhân. Vì mũi tên thả xuống vẫn hiển thị khi trường có thể chỉnh sửa, người dùng có thể không nhận ra trường có thể chỉnh sửa được. Không có một sự đào sâu vào bạn; chỉ là một số phản hồi. Đoạn mã của tôi cũng xem xét việc đặt tên trường bên trong <form>.
mickmackusa

Kết quả cuối cùng của script + html khéo léo nhưng không thể giải mã này (đối với tôi) là đính kèm giá trị tùy chọn đã chọn hoặc văn bản đã nhập vào GET của cùng một trang dưới dạng chuỗi truy vấn. Có ai biết cách chuyển đổi hành động thành POST để tôi có thể lấy giá trị trong tệp php và làm gì đó với nó ở đó không?
Han

Tôi đã soạn tập lệnh này với mục đích cụ thể để nó hoạt động phù hợp với các lần gửi biểu mẫu html. Bạn có đang sử dụng phương thức đăng làm thuộc tính trong thẻ biểu mẫu không? @ Xin vui lòng nếu bạn tạo một liên kết 3v4l.org của đoạn mã riêng biệt của mình, tôi có thể xem nhanh và có thể tư vấn.
mickmackusa

1
Tôi cảm thấy chết lặng. Tôi quên đặt một phương thức trong thẻ biểu mẫu. Nó hoạt động như được đăng với một sửa đổi nhỏ này: <form name = "BrowserSurvey" method = "post" action = "/ gotThis.php"> ... Kịch bản đẹp, mickmackusa. Cảm ơn gợi ý theo dõi của bạn!
Han

16

Giải pháp jQuery!

Demo: http://jsfiddle.net/69wP6/2/

Demo khác bên dưới (cập nhật!)

Tôi cần một cái gì đó tương tự trong trường hợp khi tôi có một số Tùy chọn cố định và tôi muốn một tùy chọn khác có thể chỉnh sửa được! Trong trường hợp này, tôi đã tạo một đầu vào ẩn sẽ chồng lên tùy chọn đã chọn và có thể chỉnh sửa và sử dụng jQuery để làm cho tất cả hoạt động liền mạch.

Tôi đang chia sẻ khó khăn với tất cả các bạn!

HTML

<div id="billdesc">
    <select id="test">
      <option class="non" value="option1">Option1</option>
      <option class="non" value="option2">Option2</option>
      <option class="editable" value="other">Other</option>
    </select>
    <input class="editOption" style="display:none;"></input>
</div>

CSS

body{
    background: blue;
}
#billdesc{
    padding-top: 50px;
}
#test{
    width: 100%;
    height: 30px;
}
option {
    height: 30px;
    line-height: 30px;
}

.editOption{
    width: 90%;
    height: 24px;
    position: relative;
    top: -30px

}

jQuery

var initialText = $('.editable').val();
$('.editOption').val(initialText);

$('#test').change(function(){
var selected = $('option:selected', this).attr('class');
var optionText = $('.editable').text();

if(selected == "editable"){
  $('.editOption').show();


  $('.editOption').keyup(function(){
      var editText = $('.editOption').val();
      $('.editable').val(editText);
      $('.editable').html(editText);
  });

}else{
  $('.editOption').hide();
}
});

Chỉnh sửa: Đã thêm một số thiết kế chạm đơn giản, để mọi người có thể thấy rõ ràng đầu vào kết thúc ở đâu!

JS Fiddle: http://jsfiddle.net/69wP6/4/


11

Bạn không thể thực sự. Bạn sẽ phải có cả menu thả xuống và hộp văn bản, và yêu cầu họ chọn hoặc điền vào biểu mẫu. Nếu không có javascript, bạn có thể tạo một bộ nút radio riêng biệt nơi họ chọn menu thả xuống hoặc nhập văn bản, nhưng điều này có vẻ lộn xộn với tôi. Với một số javascript, bạn có thể chuyển đổi vô hiệu hóa cái này hay cái kia tùy thuộc vào việc họ chọn cái nào, ví dụ: có một tùy chọn 'khác' trong trình đơn thả xuống kích hoạt trường văn bản.


9

Nếu tùy chọn danh sách dữ liệu không đáp ứng yêu cầu của bạn, hãy xem thư viện Select2 và " Tạo tùy chọn động "

$(".js-example-tags").select2({
  tags: true
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/css/select2.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/js/select2.min.js"></script>


<select class="form-control js-example-tags">
  <option selected="selected">orange</option>
  <option>white</option>
  <option>purple</option>
</select>


0

Sử dụng một trong các giải pháp trên (@mickmackusa), tôi đã tạo một nguyên mẫu hoạt động trong React 16.8+ bằng Hooks.

https://codesandbox.io/s/heuristic-dewdney-0h2y2

Tôi hi vọng nó giúp ích cho ai đó.


Tôi vinh dự. Tôi vừa kiểm tra hồ sơ của mình và đây là bài đăng thứ 12 mà tôi đã thực hiện ở đây trên Stack Overflow - giống như một triệu năm trước.
mickmackusa

Tôi vừa chơi với liên kết demo của bạn và có vẻ như bạn đã mất tác dụng chuyển đổi vô thời hạn giữa hai loại trường.
mickmackusa
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.