De acordo com as especificações HTML, a select
tag em HTML não tem um readonly
atributo, apenas um disabled
atributo. Portanto, se você deseja impedir que o usuário altere a lista suspensa, é necessário usá-lo disabled
.
O único problema é que as entradas de formulário HTML desabilitadas não são incluídas nos dados POST / GET.
Qual é a melhor maneira de emular o readonly
atributo de uma select
tag e ainda obter os dados POST?
javascript
html
Jrgns
fonte
fonte
Respostas:
Você deve manter o
select
elemento,disabled
mas também adicionar outro ocultoinput
com o mesmo nome e valor.Se você reativar seu SELECT, copie seu valor para a entrada oculta em um evento onchange e desative (ou remova) a entrada oculta.
Aqui está uma demonstração:
fonte
selected
valor é postado de volta, não a lista inteira. Então, vocêhidden
senta diante do seuselect
e mantém o valor selecionado. Se a seleção for desativada para "somente leitura", a postagem posterior conterá apenas o valor da entrada oculta. Se a seleção estiver ativada, a opção selecionada visível "substituirá / substituirá" o valor oculto, e esse é o valor que será postado de volta.Nós também poderíamos usar isso
Desative todos, exceto a opção selecionada:
Dessa forma, o menu suspenso ainda funciona (e envia seu valor), mas o usuário não pode selecionar outro valor.
Demo
fonte
option
da tagdisabled
$("#yourSelectId option:not(:selected)).attr("disabled", "disabled")
Você pode reativar o objeto selecionado ao enviar.
EDIT : ou seja, normalmente desabilitando a tag select (com o atributo desabilitado) e, em seguida, reativando-a automaticamente antes de enviar o formulário:
Exemplo com jQuery:
Para desativá-lo:
Para reativá-lo antes do envio para que os dados GET / POST sejam incluídos:
Além disso, você pode reativar todas as entradas desativadas ou selecionar:
fonte
Outra maneira de fazer um
readOnly
atributo para umselect
elemento é usandocss
você poderia fazer como:
DEMO
fonte
... .on('mouseover', function(){ ... });
pointer-events: none
impede o foco do cursor do mouse. Para também impedir o foco do teclado, você pode complementá-lo desfocando imediatamente todos os eventos de foco:$('select').css('pointer-events', 'none').on('focus', function () {$(this).blur();});
Testado e funcionando no IE 6, 7 e 8b2, Firefox 2 e 3, Opera 9.62, Safari 3.2.1 para Windows e Google Chrome.
fonte
<select id="countries"> <option value="7" selected="selected">Country7</option> </select>
onchange = 'this.selectedIndex=this.defaultIndex; alert("You should not change this..");'
em vez de apenas mudando o índice selecionado em silêncio ..not-allowed
e a cor de fundo como#CCC
.Solução jQuery simples
Use isso se os seus selecionados tiverem a
readonly
classeOu isso se suas seleções tiverem o
readonly="readonly"
atributofonte
$(document).ready(function(){$('select option:not(:selected)').attr('disabled',true);});
funciona bem em seleção única. Nenhuma classe "somente leitura" é necessária. A seleção múltipla é problemática, pois se houver mais de uma opção já selecionada e, portanto, não desativada, e um usuário selecionar uma das opções não desativadas, as outras opções selecionadas anteriormente serão desmarcadas.$select.find('option').not(':selected').attr('disabled', 'disabled');
select[readonly]
para que você apenas adicione o atributo readonly ao elemento - dessa forma, você não precisa tratar as seleções de maneira diferente de qualquer outro tipo. O javascript aprimora progressivamente o efeito. Lembre-se de que esta solução (e a maioria das outras) apenas ajuda o agente do usuário a fornecer a melhor experiência do usuário - na verdade, não impõe nada (isso deve ser feito no servidor, se necessário).Solução CSS simples:
Isso resulta em Selecionar para ficar cinza com o cursor "desativar" agradável ao passar o mouse
e ao selecionar a lista de opções como "vazia", para que você não possa alterar seu valor.
fonte
Ainda outra opção mais contemporânea (sem trocadilhos) é desativar todas as opções do elemento de seleção que não o selecionado.
note, no entanto, que esse é um recurso do HTML 4.0 e, por exemplo, 6,7,8 beta 1 parecem não respeitar isso.
http://www.gtalbot.org/BrowserBugsSection/MSIE7Bugs/OptionDisabledSupport.html
fonte
Esta é a melhor solução que encontrei:
O código acima desativa todas as outras opções não selecionadas enquanto mantém a opção selecionada ativada. Ao fazer isso, a opção selecionada entrará nos dados de postagem posterior.
fonte
Eu sei que é tarde demais, mas isso pode ser feito com CSS simples:
O estilo oculta todas as opções e grupos quando a seleção está no
readonly
estado, para que o usuário não possa alterar sua seleção.Não são necessários hacks JavaScript.
fonte
Mais fácil ainda: adicione o atributo style à sua tag de seleção :
fonte
Esta é a melhor e mais simples solução. Você definirá um atributo readolny no seu select ou qualquer outro atributo como somente leitura de dados e faça o seguinte
fonte
Defina a seleção desativada quando planejar que seja somente leitura e remova o atributo desativado antes de enviar o formulário.
fonte
Além de desabilitar as opções que não deveriam ser selecionáveis, eu queria fazê-las desaparecer da lista, mas ainda assim poder habilitá-las caso precise:
Ele localiza todos os elementos selecionados com um atributo somente leitura, depois encontra todas as opções dentro daquelas que não estão selecionadas, depois os oculta e desativa.
É importante separar a consulta jquery em 2 por razões de desempenho, porque o jquery as lê da direita para a esquerda, o código:
primeiro encontrará todas as opções não selecionadas no documento e depois filtrará as que estão dentro das seleções com um atributo somente leitura.
fonte
.prop("disabled", true)
em vezUma abordagem simples do lado do servidor é remover todas as opções, exceto a que você deseja selecionar. Portanto, no Zend Framework 1.12, se o elemento $ for um Zend_Form_Element_Select:
fonte
Se você desativar um campo de formulário, ele não será enviado quando o formulário for enviado. Portanto, se você precisar de um
readonly
que funcione como odisabled
envio de valores, faça o seguinte:Após qualquer alteração nas propriedades somente leitura de um elemento.
fonte
Solução com tabindex. Funciona com entradas de texto selecionadas, mas também com texto.
Basta usar uma classe .disabled.
CSS:
JS:
HTML:
Edit: Com o Internet Explorer, você também precisa deste JS:
fonte
Seguindo a sugestão de Grant Wagners; Aqui está um trecho de jQuery que faz isso com funções de manipulador em vez de atributos diretos onXXX:
fonte
Eu resolvi isso com jquery:
fonte
Se você estiver usando o jquery validate, poderá fazer o seguinte abaixo, usei o atributo desativado sem problemas:
fonte
O que eu achei que funciona muito bem, com javascript simples (ou seja: nenhuma biblioteca JQuery necessária), é alterar o innerHTML da
<select>
tag para o valor restante único desejado.Antes:
Exemplo de Javascript:
Depois de:
Dessa forma, nenhum efeito visual muda, e isso POST / GET dentro do
<FORM>
.fonte
Em vez da seleção em si, você pode desativar todas as opções, exceto a opção atualmente selecionada. Isso dá a aparência de um menu suspenso em funcionamento, mas apenas a opção que você deseja transmitir é uma seleção válida.
fonte
solução html:
javascript:
remover:
edit: métodos de remoção adicionados
fonte
Simplesmente, remova o atributo desativado antes de enviar o formulário.
fonte
disabled="disabled" ->
obterá seu valor do banco de dados e mostrará no formulário.readonly="readonly" ->
você pode alterar seu valor na caixa de seleção, mas não foi possível salvar seu valor no seu banco de dados.fonte
Se o menu suspenso de seleção for somente leitura desde o nascimento e não precisar mudar, talvez você deva usar outro controle? Como um simples
<div>
(mais o campo de formulário oculto) ou um<input type="text">
?Adicionado: se o menu suspenso não for somente leitura o tempo todo e o JavaScript for usado para habilitá-lo / desativá-lo, isso ainda será uma solução - basta modificar o DOM on-the-fly.
fonte
Abaixo trabalhou para mim:
fonte
Eu o consegui ocultando a caixa de seleção e mostrando um
span
em seu lugar apenas com valor informativo. No caso de desativar a.readonly
classe, precisamos também remover os.toVanish
elementos e mostrar o.toShow
os.fonte
No IE, fui capaz de derrotar a abordagem onfocus => onblur clicando duas vezes. Mas lembrar o valor e restaurá-lo no evento onchange parece lidar com esse problema.
Você pode fazer similar sem expando propriedades usando uma variável javascript.
fonte
Aqui está uma tentativa de usar uma função jQuery personalizada para obter a funcionalidade (conforme mencionado aqui):
fonte