Texto padrão que não será mostrado na lista suspensa


108

Eu tenho um selectque mostra inicialmente Selecionar idioma até que o usuário selecione um idioma. Quando o usuário abre a seleção, não quero mostrar uma opção Selecionar idioma , porque não é uma opção real.

Como posso conseguir isso?

Respostas:


214

A solução de Kyle funcionou perfeitamente bem para mim, então fiz minha pesquisa para evitar Js e CSS, mas apenas permanecendo com HTML. Adicionar um valor de selectedao item que queremos que apareça como cabeçalho força-o a ser mostrado em primeiro lugar como um espaço reservado. Algo como:

<option selected disabled>Choose here</option>

A marcação completa deve seguir estas linhas:

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

Você pode dar uma olhada neste violino e aqui está o resultado:

insira a descrição da imagem aqui

Se você não quiser que o tipo de texto de espaço reservado apareça listado nas opções assim que um usuário clicar na caixa de seleção, basta adicionar o hiddenatributo desta forma:

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

Verifique o violino aqui e a imagem abaixo.

insira a descrição da imagem aqui


Esta é uma ótima resposta, mas ao usar Angular JS, não funciona, pois o Angular adiciona automaticamente uma opção vazia e a define como padrão
Dennis Wanyonyi

De qualquer forma, apenas para referência, aqui está como você faria no Angular, basta combinar a abordagem acima com o específico do Angular explicado aqui metaltoad.com/blog/…
Nobita

Observe que o hiddenatributo , usado na resposta acima, é um atributo que pode ser definido em qualquer elemento HTML e geralmente (mas não necessariamente) implementado para ser equivalente à configuração display: nonecom CSS.
Mark Amery

2
Note-se também que a criação hiddende um optionem um selectnão funciona no Safari, em ambos iOS ou Mac. Essa resposta, portanto, oferece suporte apenas parcial ao navegador.
Mark Amery

1
Isso é lindo!
Fibo Kowalsky

59

Aqui está a solução:

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

5
Observe que selected="true"é inválido. Em vez disso, use selected="selected"em (X) HTML ou apenas selectedem HTML. Parece que você confundiu selectedatributo com selectedpropriedade, que é alterado assim: myOption.selected = true;oumyOption.selected = false;
Oriol

2
"display: none" é ignorado por navegadores que usam seleções nativas do dispositivo, como Android e iOS. Você deve remover a opção do DOM em select.focus e retorná-la e selecioná-la em select.blur para que funcione.
Radek Pech

-1; como a resposta de Nobita usandohidden (que é "normalmente implementado em CSS" usando de display: nonequalquer maneira), usando display: noneem um optionnão funciona no Safari; a opção ainda aparece.
Mark Amery de

50

A maneira adequada e semântica é usar uma opção de marcador de posição :

  • Adicione um optionelemento como o primeiro filho doselect
  • Conjunto value= "" para issooption
  • Defina o texto do espaço reservado como o conteúdo daquele option
  • Adicione o requiredatributo aoselect

Isso forçará o usuário a selecionar outra opção para poder enviar o formulário, e os navegadores devem processar o optionconforme desejado:

Se um elemento select contiver uma opção de rótulo de espaço reservado, espera-se que o agente do usuário renderize essa opção de uma maneira que transmita que é um rótulo, em vez de uma opção válida do controle.

No entanto, a maioria dos navegadores o processará normalmente option. Portanto, teremos que consertá-lo manualmente, adicionando o seguinte ao 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>


Deve-se notar que mesmo isso (que é a tentativa mais completa de resolver esse problema de todas as respostas aqui) não funciona no Safari, seja no iOS ou Mac. A opção continuará quando a seleção for aberta.
Mark Amery

@MarkAmery Eu sugiro que você faça como é proposto na resposta de @Nobita e simplesmente adicione o hiddenatributo à tag de opção de espaço reservado em vez de display: noneparecer que a maioria dos navegadores móveis ignora o display: noneatributo CSS e é ainda mais semanticamente correto na minha opinião.
Gaboik1

@ Gaboik1 Nos comentários sobre essa resposta, observei que hiddengeralmente é implementado como display: nonenos bastidores (e a especificação sugere explicitamente isso como uma implementação "típica"). Como tal, ficaria surpreso se houvesse algum navegador - móvel ou outro - que hiddenfuncionasse, mas display: nonenão funcionasse. Você pode fornecer algum exemplo?
Mark Amery

21

Como você não pode usar marcadores de posição atribuídos para selecttags, não acredito que haja alguma maneira de fazer exatamente o que você está pedindo com HTML / CSS puro. Você pode, no entanto, fazer algo assim:

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

"Selecionar idioma" aparecerá no menu suspenso, mas uma vez que outra opção for selecionada, não será possível selecioná-la novamente.

Espero que ajude.


2
Descobri que o melhor é a combinação de disabled e selecionado com style = "display: none;". desativado é útil quando você deseja executar a validação - garante que nenhuma opção ativada esteja selecionada por padrão.
Illarion Kovalchuk

-1 porque outras respostas aqui (notavelmente Nobtia e Oriol) fornecem tanto mais detalhes explicativos quanto soluções muito mais completas.
Mark Amery de

7

Experimente isto:

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

No CSS:

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

Esta resposta não contém nada que outras respostas também não contenham em mais detalhes, além de ter uma formatação incorreta; -1.
Mark Amery de

5

Eu tenho uma solução com um intervalo exibido acima do select até que uma seleção seja feita. O intervalo exibe a mensagem padrão e, portanto, não está na lista de proposições:

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

Eu fiz um jsfiddle para demonstração . Testado com Firefox e IE8.


O Chrome no OSX sempre mostra a primeira opção selecionada, mas parece ser específico do OSX, porque todas as soluções fornecidas aqui levam à seleção da primeira opção visível.
Gamadril

em vez de spanusar legende isso seria perfeito oulabel
karlcow

Esta é uma abordagem interessante, e a única maneira possível que vejo de fazer esse comportamento funcionar no Safari, mas está mal implementada aqui; você precisa pelo menos pointer-events: noneem seu intervalo para permitir a passagem de cliques para selecionar.
Mark Amery de

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

você pode, é claro, mover o css para um arquivo css se quiser e colocar um script para capturar o escbotão para selecionar o desativado novamente. Ao contrário das outras respostas semelhantes que coloquei value="", se você enviar o (s) valor (es) da sua lista de seleção com um formulário, ela não conterá "escolheu algo". Em asp.net mvc 5 enviado como json compilado com var obj = { prop:$('#ddl').val(),...};e JSON.stringify(obj);o valor de prop será nulo.


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');​​​​​​​
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.