Testo predefinito che non verrà mostrato nell'elenco a discesa


108

Ho un selectche inizialmente mostra Seleziona lingua fino a quando l'utente seleziona una lingua. Quando l'utente apre la selezione, non voglio che mostri un'opzione Seleziona lingua , perché non è un'opzione effettiva.

Come posso raggiungere questo obiettivo?

Risposte:


214

La soluzione di Kyle ha funzionato perfettamente per me, quindi ho fatto le mie ricerche per evitare J e CSS, ma attenendomi semplicemente all'HTML. L'aggiunta di un valore di selectedall'elemento che vogliamo che appaia come intestazione ne forza la visualizzazione in primo luogo come segnaposto. Qualcosa di simile a:

<option selected disabled>Choose here</option>

Il markup completo dovrebbe essere lungo queste linee:

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

Puoi dare un'occhiata a questo violino ed ecco il risultato:

inserisci qui la descrizione dell'immagine

Se non vuoi che il tipo di testo segnaposto appaia elencato nelle opzioni una volta che un utente fa clic sulla casella di selezione, aggiungi l' hiddenattributo in questo modo:

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

Controlla il violino qui e lo screenshot qui sotto.

inserisci qui la descrizione dell'immagine


Questa è un'ottima risposta, ma quando si utilizza Angular JS, non funziona poiché Angular aggiunge automaticamente un'opzione vuota e la imposta come predefinita
Dennis Wanyonyi,

Ad ogni modo, solo per riferimento, ecco come faresti in Angular, combina l'approccio sopra con lo specifico Angular spiegato qui metaltoad.com/blog/…
Nobita

Nota che l' hiddenattributo , utilizzato nella risposta sopra, è un attributo che può essere impostato su qualsiasi elemento HTML e di solito (ma non necessariamente) implementato per essere equivalente all'impostazione display: nonecon CSS.
Mark Amery

2
Nota anche che l'impostazione hiddensu un optionin a selectnon funziona in Safari, né su iOS né su Mac. Questa risposta offre quindi solo un supporto parziale del browser.
Mark Amery

1
Questo è bellissimo!
Fibo Kowalsky

59

Ecco la soluzione:

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

5
Nota che selected="true"non è valido. Utilizzare invece selected="selected"in (X) HTML o solo selectedin HTML. Sembra che tu abbia confuso l' selectedattributo con la selectedproprietà, che è cambiata in questo modo: myOption.selected = true;omyOption.selected = false;
Oriol

2
"display: none" viene ignorato dai browser che utilizzano selezioni native del dispositivo come Android e iOS. È necessario rimuovere l'opzione da DOM in select.focus e restituirla e selezionarla in select.blur per farlo funzionare.
Radek Pech

-1; come la risposta di Nobita usandohidden (che è "tipicamente implementata in CSS" usando display: nonecomunque), usando display: nonesu un optionnon funziona in Safari; l'opzione appare ancora.
Mark Amery

50

Il modo corretto e semantico consiste nell'usare un'opzione etichetta segnaposto :

  • Aggiungi un optionelemento come primo figlio diselect
  • Impostato su quellovalue= ""option
  • Imposta il testo segnaposto come contenuto di quello option
  • Aggiungi l' requiredattributo al fileselect

Questo costringerà l'utente a selezionare un'altra opzione in modo da essere in grado di inviare il modulo, e browser dovrebbe rendere il optioncome desiderato:

Se un elemento select contiene un'opzione etichetta segnaposto, ci si aspetta che il programma utente riproduca quell'opzione in un modo che dica che si tratta di un'etichetta, piuttosto che un'opzione valida del controllo.

Tuttavia, la maggior parte dei browser lo visualizzerà normalmente option. Quindi dovremo risolverlo manualmente, aggiungendo quanto segue a option:

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


Va notato che anche questo (che è il tentativo più completo di risolvere questo problema tra tutte le risposte qui) non funziona su Safari, né su iOS né su Mac. L'opzione sarà ancora quando la selezione è aperta.
Mark Amery

@MarkAmery Ti suggerisco di fare come è proposto nella risposta di @Nobita e di aggiungere semplicemente l' hiddenattributo al tag dell'opzione segnaposto invece di display: nonecome sembra che la maggior parte dei browser mobili ignori l' display: noneattributo CSS ed è ancora più semanticamente corretto secondo me.
Gaboik1

@ Gaboik1 Nei commenti a quella risposta, ho notato che hiddenè generalmente implementato come display: nonesotto il cofano (e le specifiche lo suggeriscono esplicitamente come un'implementazione "tipica"). In quanto tale, sarei sorpreso se ci fossero browser, mobili o meno, in cui hiddenfunzionassero ma display: nonenon funzionassero. Puoi fornire qualche esempio?
Mark Amery

21

Poiché non è possibile utilizzare segnaposto di assegnazione per i selecttag, non credo che ci sia un modo per fare esattamente ciò che si richiede con HTML / CSS puro. Puoi, tuttavia, fare qualcosa del genere:

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

"Seleziona lingua" apparirà nel menu a tendina, ma una volta selezionata un'altra opzione non sarà possibile riselezionarla.

Spero che aiuti.


2
Ho scoperto che la migliore è la combinazione di disabilitato e selezionato con style = "display: none;". disabilitato è utile quando si desidera eseguire la convalida: assicura che non sia selezionata alcuna opzione abilitata per impostazione predefinita.
Illarion Kovalchuk

-1 perché altre risposte qui (in particolare quella di Nobtia e Oriol) forniscono sia dettagli molto più esplicativi che soluzioni molto più complete.
Mark Amery

7

Prova questo:

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

Nel CSS:

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

Questa risposta non contiene nulla che altre risposte non contengano in modo più dettagliato, inoltre ha una formattazione errata; -1.
Mark Amery

5

Ho una soluzione con un intervallo visualizzato sopra la selezione fino al termine di una selezione. Lo span mostra il messaggio predefinito, quindi non è nell'elenco delle proposizioni:

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

Ho creato un jsfiddle per la demo . Testato con Firefox e IE8.


Chrome su OSX mostra sempre la prima opzione selezionata, ma sembra essere specifica per OSX, perché tutte le soluzioni fornite qui portano alla selezione della prima opzione visibile.
Gamadril

invece di spanusarlo legende sarebbe perfetto olabel
karlcow

Questo è un approccio interessante e l'unico modo possibile per far funzionare questo comportamento su Safari, ma qui è implementato male; hai almeno bisogno pointer-events: nonedel tuo intervallo per consentire il passaggio dei clic per selezionare.
Mark Amery

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

puoi ovviamente spostare il css in un file css se lo desideri e inserire uno script per catturare il escpulsante per selezionare nuovamente i disabilitati. A differenza delle altre risposte simili che ho inserito value="", è così se invii i valori della tua lista di selezione con un modulo, non conterrà "ha scelto qualcosa". In asp.net mvc 5 inviato come json compilato con var obj = { prop:$('#ddl').val(),...};e JSON.stringify(obj);il valore di prop sarà 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');​​​​​​​
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.