Texto predeterminado que no se mostrará en la lista desplegable

108

Tengo un selectque inicialmente muestra Seleccionar idioma hasta que el usuario selecciona un idioma. Cuando el usuario abre la selección, no quiero que se muestre la opción Seleccionar idioma , porque no es una opción real.

¿Cómo puedo conseguir esto?

Vitalii Ponomar
fuente

Respuestas:

214

La solución de Kyle funcionó perfectamente bien para mí, así que hice mi investigación para evitar cualquier J y CSS, pero solo me quedé con HTML. Agregar un valor de selectedal elemento que queremos que aparezca como encabezado obliga a que se muestre en primer lugar como un marcador de posición. Algo como:

<option selected disabled>Choose here</option>

El marcado completo debe estar en estas líneas:

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

Puedes echar un vistazo a este violín y aquí tienes el resultado:

ingrese la descripción de la imagen aquí

Si no desea que el tipo de texto de marcador de posición aparezca en las opciones una vez que el usuario haga clic en el cuadro de selección, simplemente agregue el hiddenatributo así:

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

Compruebe el violín aquí y la captura de pantalla a continuación.

ingrese la descripción de la imagen aquí

Nobita
fuente
Esta es una gran respuesta, pero cuando se usa Angular JS, entonces no funciona ya que Angular agrega automáticamente una opción vacía y la establece como predeterminada
Dennis Wanyonyi
De todos modos, solo como referencia, así es como lo haría en Angular, simplemente combine el enfoque anterior con el específico Angular explicado aquí metaltoad.com/blog/…
Nobita
Tenga en cuenta que el hiddenatributo , utilizado en la respuesta anterior, es un atributo que se puede configurar en cualquier elemento HTML y, por lo general (pero no necesariamente), se implementa para ser equivalente a la configuración display: nonecon CSS.
Mark Amery
2
Tenga en cuenta también que la configuración hiddenen un optionen un selectno funciona en Safari, ya sea en iOS o Mac. Por lo tanto, esta respuesta ofrece solo compatibilidad parcial con el navegador.
Mark Amery
1
¡Esto es hermoso!
Fibo Kowalsky
59

Esta es la solucion:

<select>
    <option style="display:none;" selected>Select language</option>
    <option>Option 1</option>
    <option>Option 2</option>
</select>
Prabhu
fuente
5
Tenga en cuenta que selected="true"no es válido. En su lugar, utilícelo selected="selected"en (X) HTML o simplemente selecteden HTML. Parece que confundió selectedatributo con selectedpropiedad, que se cambia así: myOption.selected = true;omyOption.selected = false;
Oriol
2
"display: none" es ignorado por los navegadores que utilizan selecciones nativas del dispositivo, como Android e iOS. Debe eliminar la opción de DOM en select.focus y devolverla y seleccionarla en select.blur para que funcione.
Radek Pech
-1; como la respuesta de Nobita usandohidden (que "normalmente se implementa en CSS" usando de display: nonetodos modos), usar display: noneen optiony no funciona en Safari; la opción sigue apareciendo.
Mark Amery
50

La forma correcta y semántica es usar una opción de etiqueta de marcador de posición :

  • Agregue un optionelemento como primer hijo delselect
  • Establecer a esovalue= ""option
  • Establecer el texto del marcador de posición como el contenido de ese option
  • Agregue el requiredatributo alselect

Esto obligará al usuario a seleccionar otra opción para poder enviar el formulario, y los navegadores deben representar el formulario optioncomo desee:

Si un elemento de selección contiene una opción de etiqueta de marcador de posición, se espera que el agente de usuario represente esa opción de una manera que transmita que es una etiqueta, en lugar de una opción válida del control.

Sin embargo, la mayoría de los navegadores lo mostrarán como normal option. Así que tendremos que arreglarlo manualmente, agregando lo siguiente 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>

Oriol
fuente
Cabe señalar que incluso esto (que es el intento más completo de resolver este problema de todas las respuestas aquí) no funciona en Safari, ni en iOS ni en Mac. La opción permanecerá cuando se abra la selección.
Mark Amery
@MarkAmery Le sugiero que haga como se propone en la respuesta de @Nobita y simplemente agregue el hiddenatributo a la etiqueta de opción del marcador de posición en lugar de, display: noneya que parece que la mayoría de los navegadores móviles ignoran el display: noneatributo CSS y es aún más semánticamente correcto en mi opinión.
Gaboik1
@ Gaboik1 En los comentarios sobre esa respuesta, noté que hiddengeneralmente se implementa como display: nonebajo el capó (y la especificación sugiere explícitamente esto como una implementación "típica"). Como tal, me sorprendería si hubiera navegadores, móviles o de otro tipo, que hiddenfuncionaran pero display: noneno funcionaran. ¿Puede darnos algún ejemplo?
Mark Amery
21

Debido a que no puede usar asignar marcadores de posición para las selectetiquetas, no creo que haya ninguna forma de hacer exactamente lo que está pidiendo con HTML / CSS puro. Sin embargo, puede hacer algo como esto:

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

"Seleccionar idioma" aparecerá en el menú desplegable, pero una vez que se seleccione otra opción, no será posible volver a seleccionarla.

Espero que eso ayude.

Kyle
fuente
2
Descubrí que lo mejor es la combinación de desactivado y seleccionado con style = "display: none;". disabled es útil cuando desea realizar una validación; se asegura de que no tenga ninguna opción habilitada seleccionada de forma predeterminada.
Illarion Kovalchuk
-1 porque otras respuestas aquí (especialmente las de Nobtia y Oriol) proporcionan tanto más detalles explicativos como soluciones mucho más completas.
Mark Amery
7

Prueba esto:

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

En el CSS:

.selectSelection option:first-child{
    display:none;
}
Aakash
fuente
Esta respuesta no contiene nada que otras respuestas no contengan con más detalle, además tiene un formato incorrecto; -1.
Mark Amery
5

Tengo una solución con un intervalo que se muestra sobre la selección hasta que se realiza una selección. El intervalo muestra el mensaje predeterminado, por lo que no está en la lista de propuestas:

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

Hice un jsfiddle para demostración . Probado con Firefox e IE8.

Baldrick
fuente
Chrome en OSX siempre muestra la primera opción seleccionada, pero parece ser específica de OSX, porque todas las soluciones proporcionadas aquí conducen a que se seleccione la primera opción visible.
Gamadril
en lugar de spanusarlo legendy eso sería perfecto olabel
karlcow
Este es un enfoque interesante, y la única forma posible que veo de hacer que este comportamiento funcione en Safari, pero está mal implementado aquí; que al menos necesita pointer-events: noneen su intervalo para permitir que los clics pasen para seleccionar.
Mark Amery
0
<option value="" id="ddl" name="prop" style="display:none;" disabled selected>chose something </option>

por supuesto, puede mover el css a un archivo css si lo desea, y poner un script para capturar el escbotón y seleccionar el deshabilitado nuevamente. A diferencia de las otras respuestas similares que puse value="", esto es así que si envía los valores de su lista de selección con un formulario, no contendrá "eligió algo". En asp.net mvc 5 enviado como json compilado con var obj = { prop:$('#ddl').val(),...};y JSON.stringify(obj);el valor de prop será nulo.

Anders M.
fuente
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
fuente