Este é realmente um problema do jQuery? Ou talvez a lista suspensa simplesmente não funcione com o atributo somente leitura?
Ilia G
Kanishka Panamaldeniya já lhe deu a resposta correta (deve torná-la uma resposta em vez de um comentário).
qbantek
2
O menu suspenso nem sempre é somente leitura. Somente leitura significa que você pode ver seu valor, mas não pode alterá-lo.
Suncat2000
Respostas:
182
$('#cf_1268591').attr("disabled",true);
drop down é sempre somente leitura. o que você pode fazer é desativá-lo
se você trabalha com um formulário, os campos desabilitados não são enviados, então use um campo oculto para armazenar o valor da lista suspensa desabilitada
Desativar uma lista suspensa não envia. Vou tentar sua solução.
Karim Ali
3
Um problema em desabilitar uma seleção (lista suspensa) é que o foco é perdido em alguns navegadores (por exemplo, IE9). Isso pode ser um problema se o elemento select estiver sendo desabilitado enquanto uma chamada ajax é processada, por exemplo, quando a posição do usuário no formulário é perdida.
Chris
1
Obrigado por sua sugestão. Só uma pergunta; como eu armazenaria o valor suspenso em um campo oculto? Você teria algum código de exemplo para isso?
kramer65 de
2
Outra "solução alternativa" seria habilitar esses campos antes do envio do formulário. Ou no meu caso onde enviei os dados no formato JSON (habilitar, obter dados, desabilitar novamente): var disabled = $ (yourform) .find (': input: disabled'). RemoveAttr ('disabled'); var data = getFormJSONData ($ (yourform)); disabled.attr ('desativado', 'desativado');
KDT
4
Você deveria estar usando prop()agora.
alex
144
Tive o mesmo problema, minha solução foi desabilitar todas as opções não selecionadas. Muito fácil com jQuery:
$('option:not(:selected)').attr('disabled',true);
Editar =>
Se você tiver vários menus suspensos na mesma página, desative todas as opções não selecionadas em select-ID conforme abaixo.
Boa ideia! Para usar as melhores práticas com as versões atuais do jQuery, eu usaria o método prop para definir o valor desativado. ie$('option:not(:selected)').prop('disabled', true);
Chris O'Connell
Esta é uma solução muito inteligente!
Jacques
1
SIM! boa ideia.
Eric
1
Esta deve ser a resposta n ° 1.
Erwan Clügairtz de
22
Experimente este .. sem desabilitar o valor selecionado ..
<scriptsrc="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><ahref="#">Click here to enable readonly</a><select><option>Example 1</option><optionselected>Example 2</option><option>Example 3</option></select>
Abordagem muito legal, mas o usuário ainda pode usar TAB no teclado para selecionar um valor.
Ricardo Martins
1
@RicardoMartins obrigado, atualizou a resposta para evitar mudança com TAB
Lucas Bustamante
12
Eu desativaria o campo. Então, quando o formulário for enviado, faça com que ele não seja desativado. Na minha opinião, isso é mais fácil do que lidar com campos ocultos.
//disable the field
$("#myFieldID").prop("disabled",true);//right before the form submits, we re-enable the fields, to make them submit.
$("#myFormID").submit(function(event){
$("#myFieldID").prop("disabled",false);});
Ótimo (pequeno) trecho de código, obrigado. Ele desativa os menus suspensos para que não possam ser alterados, mas ainda permite que seus valores sejam enviados. Muito útil.
Alex Hopkins
3
Esta linha faz seleções com o readonlyatributo somente leitura:
Este código armazenará primeiro a seleção original em cada menu suspenso. Então, se o usuário alterar a seleção, ele redefinirá o menu suspenso para sua seleção original.
//store the original selection
$("select :selected").each(function(){
$(this).parent().data("default",this);});//change the selction back to the original
$("select").change(function(e){
$($(this).data("default")).prop("selected",true);});
É um artigo antigo, mas quero alertar as pessoas que irão encontrá-lo. Tenha cuidado com o atributo desativado com elemento obtido por nome. Estranho, mas parece não funcionar muito.
Sim, eu sei que é melhor eu usar prop e não attr, mas pelo menos agora prop não funcionará por causa da versão antiga do jquery, e agora não posso atualizá-lo, não pergunte por quê ... a diferença de html é apenas adicionada id:. ..
Descobri que a melhor maneira de fazer isso é usar CSS para remover eventos de ponteiro e modificar a opacidade no menu suspenso (tente 0,5). Isso dá a impressão ao usuário de que está desabilitado normalmente, mas ainda publica dados.
Concedido, isso tem alguns problemas de compatibilidade com versões anteriores, mas na minha opinião é uma opção melhor do que contornar o problema irritante de desabilitar / somente leitura.
não é bom se a opção atualmente selecionada não for a primeira na lista como neste exemplo: jsfiddle.net/4aHcD/19
Homer
@Homer, o código se destina a redefini-lo após qualquer alteração e funciona nesse sentido. Se você quiser que ele seja executado inicialmente em vez de alterar o valor inicial sozinho por algum motivo, você sempre pode chamar o evento de mudança em seu elemento depois de declarar o evento, usando $("select").change(), assim, jsfiddle.net/4aHcD/20
Alex Turpin
2
quando a página é carregada pela primeira vez, se o terceiro item for selecionado e o usuário tentar alterá-lo para o segundo item, seu código altera a seleção para o primeiro item. Eu não acho que não deveria fazer isso. Aqui está um exemplo do que eu acho que o OP queria, um menu suspenso que não mudará seu valor selecionado com base na interação do usuário: jsfiddle.net/4aHcD/22
Homer
O que eu preciso e o que o OP estava solicitando era uma maneira de torná- lo somente leitura. Isso significa que você pode ver o valor ou valores selecionados, mas não pode alterá-los. Isso significa que a exibição imita a aparência do controle editável sem ser capaz de editá-lo.
Suncat2000
0
Tente fazer uma string vazia ao "pressionar a tecla"
Aqui está uma ligeira variação nas outras respostas que sugerem o uso de desativado. Como o atributo "disabled" pode ter qualquer valor e ainda assim ser desativado, você pode defini-lo como somente leitura, como disabled = "somente leitura". Isso desabilitará o controle, como de costume, e também permitirá que você facilmente estilize-o de forma diferente dos controles desabilitados regulares, com CSS como:
select[disabled=readonly]{.... styles you like for read-only
}
Se você deseja que os dados sejam incluídos no envio, use os campos ocultos ou habilite antes de enviar, conforme detalhado nas outras respostas.
Como @Kanishka disse, se desativarmos um elemento do formulário, ele não será enviado. Eu criei um snippet para este problema. Quando o elemento de seleção está desativado, ele cria um campo de entrada oculto e armazena o valor. Quando está ativado, ele exclui os campos de entrada ocultos criados.
jQuery(document).ready(function($){var $dropDown = $('#my-select'),
name = $dropDown.prop('name'),
$form = $dropDown.parent('form');
$dropDown.data('original-name', name);//store the name in the data attribute
$('#toggle').on('click',function(event){if($dropDown.is('.disabled')){//enable it
$form.find('input[type="hidden"][name='+ name +']').remove();// remove the hidden fields if any
$dropDown.removeClass('disabled')//remove disable class .prop({
name: name,
disabled:false});//restore the name and enable }else{//disable it var $hiddenInput = $('<input/>',{
type:'hidden',
name: name,
value: $dropDown.val()});
$form.append($hiddenInput);//append the hidden field with same name and value from the dropdown field
$dropDown.addClass('disabled')//disable class.prop({'name': name +"_1",
disabled:true});//change name and disbale }});});
Respostas:
drop down é sempre somente leitura. o que você pode fazer é desativá-lo
se você trabalha com um formulário, os campos desabilitados não são enviados, então use um campo oculto para armazenar o valor da lista suspensa desabilitada
fonte
prop()
agora.Tive o mesmo problema, minha solução foi desabilitar todas as opções não selecionadas. Muito fácil com jQuery:
Editar => Se você tiver vários menus suspensos na mesma página, desative todas as opções não selecionadas em select-ID conforme abaixo.
fonte
$('option:not(:selected)').prop('disabled', true);
Experimente este .. sem desabilitar o valor selecionado ..
Funciona para mim..
fonte
Isso é o que você está procurando:
Funciona como um encanto.
fonte
tabindex="-1"
Definir um elemento com
disabled
não enviará os dados, mas osselect
elementos nãoreadonly
.Você pode simular um
readonly
emselect
usar CSS para estilizar e JS para evitar a mudança com guia:Em seguida, use-o como:
Resultado:
Exibir trecho de código
fonte
Eu desativaria o campo. Então, quando o formulário for enviado, faça com que ele não seja desativado. Na minha opinião, isso é mais fácil do que lidar com campos ocultos.
fonte
Jquery simples para remover opções não selecionadas.
fonte
Para simplificar as coisas, aqui está um plugin jQuery que faz isso sem complicações: https://github.com/haggen/readonly
fonte
Esta linha faz seleções com o
readonly
atributo somente leitura:fonte
Este código armazenará primeiro a seleção original em cada menu suspenso. Então, se o usuário alterar a seleção, ele redefinirá o menu suspenso para sua seleção original.
http://jsfiddle.net/4aHcD/22/
fonte
A opção mais fácil para mim foi selecionar como somente leitura e adicionar:
Você não precisa escrever nenhuma lógica extra. Sem entradas ocultas ou desativado e reativado no envio do formulário.
fonte
É um artigo antigo, mas quero alertar as pessoas que irão encontrá-lo. Tenha cuidado com o atributo desativado com elemento obtido por nome. Estranho, mas parece não funcionar muito.
isso não funciona:
Este trabalho:
Sim, eu sei que é melhor eu usar prop e não attr, mas pelo menos agora prop não funcionará por causa da versão antiga do jquery, e agora não posso atualizá-lo, não pergunte por quê ... a diferença de html é apenas adicionada id:. ..
...
Não encontrei erros no script, e na versão com nome não houve erros no console. Mas é claro que pode ser meu erro no código
Visto em: Chrome 26 no Win 7 Pro
Desculpe pela gramática ruim.
fonte
Descobri que a melhor maneira de fazer isso é usar CSS para remover eventos de ponteiro e modificar a opacidade no menu suspenso (tente 0,5). Isso dá a impressão ao usuário de que está desabilitado normalmente, mas ainda publica dados.
Concedido, isso tem alguns problemas de compatibilidade com versões anteriores, mas na minha opinião é uma opção melhor do que contornar o problema irritante de desabilitar / somente leitura.
fonte
Você também pode desativá-lo e, no momento em que fizer a chamada de envio, ativá-lo. Acho que é a maneira mais fácil :)
fonte
Funciona muito bem
Com isso eu posso ver as opções, mas não consigo selecioná-las
fonte
Não existe uma lista suspensa somente leitura. O que você pode fazer é redefini-lo para o primeiro valor manualmente após cada alteração.
http://jsfiddle.net/4aHcD/
fonte
$("select").change()
, assim, jsfiddle.net/4aHcD/20Tente fazer uma string vazia ao "pressionar a tecla"
O Html é:
O Jquery é:
// faça após a ativação com string vazia
fonte
Talvez você possa tentar desta forma
Isso define o primeiro valor do menu suspenso como o padrão e parece somente leitura
fonte
suporte a html5:
`
fonte
Aqui está uma ligeira variação nas outras respostas que sugerem o uso de desativado. Como o atributo "disabled" pode ter qualquer valor e ainda assim ser desativado, você pode defini-lo como somente leitura, como disabled = "somente leitura". Isso desabilitará o controle, como de costume, e também permitirá que você facilmente estilize-o de forma diferente dos controles desabilitados regulares, com CSS como:
Se você deseja que os dados sejam incluídos no envio, use os campos ocultos ou habilite antes de enviar, conforme detalhado nas outras respostas.
fonte
Como @Kanishka disse, se desativarmos um elemento do formulário, ele não será enviado. Eu criei um snippet para este problema. Quando o elemento de seleção está desativado, ele cria um campo de entrada oculto e armazena o valor. Quando está ativado, ele exclui os campos de entrada ocultos criados.
Mais informações
fonte