Teks default yang tidak akan ditampilkan dalam daftar drop-down

108

Saya memiliki selectyang awalnya menampilkan Pilih bahasa sampai pengguna memilih bahasa. Saat pengguna membuka pilihan, saya tidak ingin menampilkan opsi Pilih bahasa , karena ini bukan opsi yang sebenarnya.

Bagaimana saya bisa mencapai ini?

Vitalii Ponomar
sumber

Jawaban:

214

Solusi Kyle bekerja dengan sangat baik untuk saya jadi saya melakukan penelitian untuk menghindari Js dan CSS, tetapi hanya bertahan dengan HTML. Menambahkan nilai selectedke item yang ingin kita munculkan sebagai tajuk memaksanya untuk tampil di tempat pertama sebagai placeholder. Sesuatu seperti:

<option selected disabled>Choose here</option>

Markup lengkap harus berada di sepanjang garis ini:

<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>

Anda bisa melihat biola ini , dan inilah hasilnya:

masukkan deskripsi gambar di sini

Jika Anda tidak ingin jenis teks tempat penampung muncul tercantum dalam opsi setelah pengguna mengklik kotak pilih cukup tambahkan hiddenatribut seperti ini:

<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>

Periksa biola di sini dan tangkapan layar di bawah.

masukkan deskripsi gambar di sini

Nobita
sumber
Ini adalah jawaban yang bagus tetapi ketika menggunakan Angular JS, maka itu tidak berfungsi karena Angular secara otomatis menambahkan opsi kosong dan menetapkannya sebagai default
Dennis Wanyonyi
Bagaimanapun, hanya untuk referensi, inilah cara Anda melakukannya di Angular, cukup gabungkan pendekatan di atas dengan spesifik Sudut yang dijelaskan di sini metaltoad.com/blog/…
Nobita
Perhatikan bahwa yang hiddenatribut , yang digunakan dalam jawaban di atas, adalah atribut yang dapat diatur pada setiap elemen HTML, dan biasanya (tetapi tidak selalu) dilaksanakan untuk menjadi setara dengan pengaturan display: nonedengan CSS.
Mark Amery
2
Perhatikan juga bahwa pengaturan hiddenpada optiondalam selecttidak bekerja di Safari, di kedua iOS atau Mac. Jadi, jawaban ini hanya menawarkan dukungan browser sebagian.
Mark Amery
1
Ini indah!
Fibo Kowalsky
59

Inilah solusinya:

<select>
    <option style="display:none;" selected>Select language</option>
    <option>Option 1</option>
    <option>Option 2</option>
</select>
Prabhu
sumber
5
Perhatikan bahwa selected="true"itu tidak valid. Sebagai gantinya, gunakan selected="selected"dalam (X) HTML atau hanya selecteddi HTML. Sepertinya Anda bingung selectedatribut dengan selectedproperti, yang diubah seperti ini: myOption.selected = true;ataumyOption.selected = false;
Oriol
2
"display: none" diabaikan oleh browser yang menggunakan pilihan asli perangkat seperti Android dan iOS. Anda harus menghapus opsi dari DOM di select.focus dan mengembalikannya dan memilihnya di select.blur untuk membuatnya berfungsi.
Radek Pech
-1; seperti jawaban Nobita yang menggunakanhidden (yang "biasanya diterapkan dalam CSS"display: none tetap menggunakan ), menggunakan display: noneon an optiontidak berfungsi di Safari; opsi masih muncul.
Mark Amery
50

Cara yang tepat dan semantik adalah menggunakan opsi label placeholder :

  • Tambahkan optionelemen sebagai anak pertama dariselect
  • Setel ituvalue= ""option
  • Atur teks placeholder sebagai isinya option
  • Tambahkan requiredatribut keselect

Hal ini akan memaksa pengguna untuk memilih pilihan lain agar dapat mengirimkan formulir, dan browser harus membuat yang optionseperti yang diinginkan:

Jika elemen pilihan berisi opsi label placeholder, agen pengguna diharapkan untuk merender opsi tersebut dengan cara yang menunjukkan bahwa itu adalah label, bukan opsi kontrol yang valid.

Namun, sebagian besar browser akan membuatnya seperti biasa option. Jadi kita harus memperbaikinya secara manual, dengan menambahkan yang berikut ini ke option:

  • The selectedatribut, untuk membuatnya dipilih secara default
  • The disabledatribut, untuk membuatnya non-dipilih oleh pengguna
  • display: none, untuk menyembunyikannya dari daftar nilai

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

Oriol
sumber
Perlu dicatat bahwa bahkan ini (yang merupakan upaya paling menyeluruh untuk menyelesaikan masalah ini dari semua jawaban di sini) tidak berfungsi di Safari, baik di iOS atau Mac. Pilihan akan tetap saat pilihan dibuka.
Mark Amery
@MarkAmery Saya sarankan Anda melakukan seperti yang diusulkan dalam jawaban @Nobita dan cukup tambahkan hiddenatribut ke tag opsi placeholder alih-alih display: nonekarena tampaknya sebagian besar browser seluler mengabaikan display: noneatribut CSS dan itu bahkan lebih semantik menurut pendapat saya.
Gaboik1
@ Gaboik1 Dalam komentar pada jawaban itu, saya mencatat bahwa hiddenumumnya diterapkan seperti di display: nonebawah tenda (dan spesifikasi secara eksplisit menyarankan ini sebagai implementasi "khas"). Karena itu, saya akan terkejut jika ada browser - seluler atau lainnya - yang hiddenberfungsi tetapi display: nonetidak berhasil. Bisakah Anda memberikan contoh?
Mark Amery
21

Karena Anda tidak dapat menggunakan placeholder tetapkan untuk selecttag, saya tidak percaya bahwa ada cara untuk melakukan apa yang Anda minta dengan HTML / CSS murni. Namun, Anda dapat melakukan sesuatu seperti ini:

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

"Pilih bahasa" akan muncul di tarik-turun, tetapi setelah opsi lain dipilih, Anda tidak dapat memilihnya kembali.

Saya harap itu membantu.

Kyle
sumber
2
Saya menemukan bahwa yang terbaik adalah kombinasi dinonaktifkan dan dipilih dengan style = "display: none;". disabled berguna saat Anda ingin melakukan validasi - ini memastikan Anda tidak memiliki opsi yang diaktifkan yang dipilih secara default.
Illarion Kovalchuk
-1 karena jawaban lain di sini (terutama Nobtia dan Oriol) memberikan detail yang jauh lebih jelas dan solusi yang jauh lebih lengkap.
Mark Amery
7

Coba ini:

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

Di CSS:

.selectSelection option:first-child{
    display:none;
}
Aakash
sumber
Jawaban ini tidak berisi apa pun yang tidak dimuat dalam jawaban lain secara lebih rinci, ditambah lagi formatnya buruk; -1.
Mark Amery
5

Saya punya solusi dengan rentang yang ditampilkan di atas pilih sampai seleksi selesai. Span menampilkan pesan default, sehingga tidak ada dalam daftar proposisi:

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 (dengan 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();
        }
    });
});

Saya telah membuat jsfiddle untuk demo . Diuji dengan Firefox dan IE8.

Baldrick
sumber
Chrome di OSX selalu menampilkan opsi pertama yang dipilih, tetapi tampaknya khusus OSX, karena semua solusi yang disediakan di sini mengarah ke opsi terlihat pertama yang dipilih.
Gamadril
alih-alih spandi sana digunakan legenddan itu akan menjadi sempurna ataulabel
karlcow
Ini adalah pendekatan yang menarik, dan satu-satunya cara yang mungkin saya lihat untuk membuat perilaku ini berfungsi di Safari, tetapi diterapkan dengan buruk di sini; Anda setidaknya memerlukan pointer-events: nonespan untuk memungkinkan klik melewati untuk memilih.
Mark Amery
0
<option value="" id="ddl" name="prop" style="display:none;" disabled selected>chose something </option>

Anda tentu saja dapat memindahkan css ke file css jika Anda mau, dan meletakkan skrip untuk menangkap esctombol untuk memilih yang dinonaktifkan lagi. Berbeda dengan jawaban serupa lainnya yang saya masukkan value="", ini jadi jika Anda mengirim nilai daftar pilihan Anda dengan formulir, itu tidak akan berisi "memilih sesuatu". Dalam asp.net mvc 5 dikirim sebagai json yang dikompilasi dengan var obj = { prop:$('#ddl').val(),...};dan JSON.stringify(obj);nilai prop akan menjadi null.

Anders M.
sumber
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');​​​​​​​
Ed Manz
sumber