Văn bản mặc định sẽ không được hiển thị trong danh sách thả xuống


108

Tôi có một selecttrong đó ban đầu hiển thị Chọn ngôn ngữ cho đến khi người dùng chọn một ngôn ngữ. Khi người dùng mở lựa chọn, tôi không muốn nó hiển thị tùy chọn Ngôn ngữ chọn vì nó không phải là một tùy chọn thực tế.

Làm thế nào tôi có thể đạt được điều này?

Câu trả lời:


214

Giải pháp của Kyle hoàn toàn phù hợp với tôi vì vậy tôi đã thực hiện nghiên cứu của mình để tránh bất kỳ Js và CSS nào mà chỉ gắn bó với HTML. Việc thêm giá trị selectedvào mục mà chúng tôi muốn xuất hiện dưới dạng tiêu đề buộc nó phải hiển thị ở vị trí đầu tiên dưới dạng trình giữ chỗ. Cái gì đó như:

<option selected disabled>Choose here</option>

Đánh dấu hoàn chỉnh phải nằm dọc theo các dòng sau:

<select>
    <option selected disabled>Choose here</option>
    <option value="1">One</option>
    <option value="2">Two</option>
    <option value="3">Three</option>
    <option value="4">Four</option>
    <option value="5">Five</option>
</select>

Bạn có thể xem qua trò chơi này và đây là kết quả:

nhập mô tả hình ảnh ở đây

Nếu bạn không muốn loại văn bản giữ chỗ xuất hiện được liệt kê trong các tùy chọn khi người dùng nhấp vào hộp chọn, chỉ cần thêm hiddenthuộc tính như sau:

<select>
    <option selected disabled hidden>Choose here</option>
    <option value="1">One</option>
    <option value="2">Two</option>
    <option value="3">Three</option>
    <option value="4">Four</option>
    <option value="5">Five</option>
</select>

Kiểm tra fiddle ở đây và ảnh chụp màn hình bên dưới.

nhập mô tả hình ảnh ở đây


Đây là một câu trả lời tuyệt vời nhưng khi sử dụng góc JS, sau đó nó không hoạt động kể từ góc tự động thêm một tùy chọn trống và bộ nó như là mặc định
Dennis Wanyonyi

Dù sao, chỉ để tham khảo, đây là cách bạn sẽ làm trong Angular, chỉ cần kết hợp cách tiếp cận ở trên với Angular cụ thể được giải thích tại đây metaltoad.com/blog/…
Nobita

Lưu ý rằng các hiddenthuộc tính , được sử dụng trong các câu trả lời trên, là một thuộc tính có thể được đặt trên bất kỳ phần tử HTML, và thường (nhưng không nhất thiết) thực hiện để được tương đương với việc thiết display: nonevới CSS.
Mark Amery

2
Cũng lưu ý rằng cài đặt hiddentrên optiontrong một selectkhông hoạt động trong Safari, trên iOS hoặc Mac. Do đó, câu trả lời này chỉ cung cấp hỗ trợ một phần cho trình duyệt.
Mark Amery

1
Thật là đẹp!
Fibo Kowalsky

59

Đây là giải pháp:

<select>
    <option style="display:none;" selected>Select language</option>
    <option>Option 1</option>
    <option>Option 2</option>
</select>

5
Lưu ý rằng selected="true"không hợp lệ. Thay vào đó, hãy sử dụng selected="selected"trong (X) HTML hoặc chỉ selectedtrong HTML. Có vẻ như bạn đã nhầm lẫn selectedthuộc tính với thuộc tính, thuộc tính selectednày được thay đổi như thế này: myOption.selected = true;hoặcmyOption.selected = false;
Oriol

2
"display: none" bị bỏ qua bởi các trình duyệt sử dụng lựa chọn gốc của thiết bị như Android và iOS. Bạn phải xóa tùy chọn khỏi DOM trong select.focus và trả lại và chọn nó trong select.blur để làm cho nó hoạt động.
Radek Pech

-1; như câu trả lời của Nobita bằng cách sử dụnghidden ( "thường được triển khai trong CSS" bằng cách sử dụng display: none), sử dụng display: nonetrên một optionkhông hoạt động trong Safari; tùy chọn vẫn xuất hiện.
Mark Amery,

50

Cách phù hợp và đúng ngữ nghĩa là sử dụng tùy chọn nhãn giữ chỗ :

  • Thêm một optionphần tử làm phần tử con đầu tiên củaselect
  • Đặt thành đóvalue= ""option
  • Đặt văn bản trình giữ chỗ làm nội dung của văn bản đó option
  • Thêm requiredthuộc tính vàoselect

Điều này sẽ buộc người dùng lựa chọn tùy chọn khác để có thể gửi biểu mẫu, và các trình duyệt nên làm cho các optionnhư mong muốn:

Nếu một phần tử được chọn có chứa tùy chọn nhãn chỗ dành sẵn, thì tác nhân người dùng sẽ hiển thị tùy chọn đó theo cách truyền đạt rằng đó là một nhãn, thay vì tùy chọn hợp lệ của điều khiển.

Tuy nhiên, hầu hết các trình duyệt sẽ hiển thị nó như bình thường option. Vì vậy, chúng tôi sẽ phải sửa nó theo cách thủ công, bằng cách thêm phần sau vào option:

  • Các selectedthuộc tính, để làm cho nó chọn theo mặc định
  • Các disabledthuộc tính, để làm cho nó không thể lựa chọn bởi người sử dụng
  • display: none, để ẩn nó khỏi danh sách các giá trị

select > .placeholder {
  display: none;
}
<select required>
  <option class="placeholder" selected disabled value="">Select language</option>
  <option>Option 1</option>
  <option>Option 2</option>
</select>


Cần lưu ý rằng ngay cả điều này (đây là nỗ lực triệt để nhất để giải quyết vấn đề này trong số tất cả các câu trả lời ở đây) không hoạt động trên Safari, cả trên iOS hoặc Mac. Tùy chọn sẽ vẫn còn khi lựa chọn được mở.
Mark Amery,

@MarkAmery Tôi khuyên bạn nên làm như nó được đề xuất trong câu trả lời @Nobita và chỉ cần thêm hiddenthuộc tính vào thẻ tùy chọn trình giữ chỗ thay vì display: nonecó vẻ như hầu hết các trình duyệt di động bỏ qua display: nonethuộc tính CSS và theo ý kiến ​​của tôi thì nó thậm chí còn đúng hơn về mặt ngữ nghĩa.
Gaboik1

@ Gaboik1 Trong các nhận xét về câu trả lời đó, tôi lưu ý rằng hiddennó thường được triển khai display: nonedưới dạng ẩn (và đặc điểm rõ ràng cho thấy đây là cách triển khai "điển hình"). Do đó, tôi sẽ rất ngạc nhiên nếu có bất kỳ trình duyệt nào - trên thiết bị di động hoặc cách khác - hiddenhoạt động nhưng display: nonekhông hoạt động. Bạn có thể cung cấp bất kỳ ví dụ?
Mark Amery

21

Bởi vì bạn không thể sử dụng chỉ định trình giữ chỗ cho selectthẻ, tôi không tin rằng có bất kỳ cách nào để thực hiện chính xác những gì bạn đang yêu cầu với HTML / CSS thuần túy. Tuy nhiên, bạn có thể làm điều gì đó như sau:

<select>
  <option disabled="disabled">Select language</option>
  <option>Option 1</option>
</select>

"Chọn ngôn ngữ" sẽ hiển thị trong menu thả xuống, nhưng khi một tùy chọn khác được chọn, bạn sẽ không thể chọn lại tùy chọn đó.

Tôi hy vọng rằng sẽ giúp.


2
Tôi thấy rằng tốt nhất là sự kết hợp của tắt và được chọn với style = "display: none;". vô hiệu hóa rất hữu ích khi bạn muốn thực hiện xác thực - nó đảm bảo rằng bạn không có tùy chọn bật nào được chọn theo mặc định.
Illarion Kovalchuk

-1 bởi vì các câu trả lời khác ở đây (đặc biệt là của Nobtia và Oriol) cung cấp cả hai chi tiết giải thích và các giải pháp hoàn chỉnh hơn nhiều.
Mark Amery,

7

Thử cái này:

<div class="selectSelection">
    <select>
        <option>Do not display</option>
        <option>1</option>
        <option>1</option>
    </select>
</div>

Trong CSS:

.selectSelection option:first-child{
    display:none;
}

Câu trả lời này không chứa gì mà các câu trả lời khác cũng không chứa chi tiết hơn, ngoài ra nó có định dạng không tốt; -1.
Mark Amery,

5

Tôi có một giải pháp với một khoảng được hiển thị phía trên vùng chọn cho đến khi lựa chọn được thực hiện. Khoảng cách hiển thị thông báo mặc định và do đó, nó không có trong danh sách các mệnh đề:

HTML:

<span id="default_message_overlay">Default message</span>
<select id="my_select">
    <option value="1">Option 1</option>  
    <option value="2">Option 2</option>
    <option value="3">Option 3</option>
</select>

CSS:

#default_message_overlay {
    position: absolute;
    display: block;
    width: 120px;
    color: grey;
}
select {
    width: 150px;
}

Javascript (với JQuery):

$(document).ready(function() {
    // No selection at start
    $('#my_select').prop("selectedIndex", -1);

    // Set the position of the overlay
    var offset = $('#my_select').offset();
    offset.top += 3;
    offset.left += 3;
    $('#default_message_overlay').offset(offset);

    // Remove the overlay when selection changes
    $('#my_select').change(function() {
        if ($(this).prop("selectedIndex") != -1) {
            $('#default_message_overlay').hide();
        }
    });
});

Tôi đã tạo một jsfiddle cho bản demo . Đã thử nghiệm với Firefox và IE8.


Chrome trên OSX luôn hiển thị tùy chọn đầu tiên được chọn, nhưng nó có vẻ là tùy chọn dành riêng cho OSX, vì tất cả các giải pháp được cung cấp ở đây đều dẫn đến tùy chọn hiển thị đầu tiên được chọn.
Gamadril

thay vì spanở đó sử dụng legendvà điều đó sẽ hoàn hảo hoặclabel
karlcow

Đây là một cách tiếp cận thú vị và là cách duy nhất có thể mà tôi thấy để làm cho hành vi này hoạt động trên Safari, nhưng nó được triển khai không tốt ở đây; ít nhất bạn cần pointer-events: nonetrên khoảng thời gian của mình để cho phép các nhấp chuột chuyển qua để chọn.
Mark Amery

0
<option value="" id="ddl" name="prop" style="display:none;" disabled selected>chose something </option>

tất nhiên bạn có thể di chuyển css sang tệp css nếu bạn muốn và đặt một tập lệnh để bắt escnút chọn lại bị vô hiệu hóa. Không giống như các câu trả lời tương tự khác mà tôi đã đặt value="", điều này là do đó nếu bạn gửi (các) giá trị của danh sách lựa chọn của mình bằng một biểu mẫu, nó sẽ không chứa "đã chọn một cái gì đó". Trong asp.net, mvc 5 được gửi dưới dạng json được biên dịch với var obj = { prop:$('#ddl').val(),...};JSON.stringify(obj);giá trị của prop sẽ là null.


0

Op1:

$("#MySelectid option").each(function () {
        if ($(this).html() == "text to find") {
            $(this).attr("selected", "selected");
            return;
        }
});

Op2:

$('#MySelectid option')
.filter(function() { return $.trim( $(this).text() ) == 'text to find'; })​​​​​​​​.attr('selected','selected');​​​​​​​
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.