Eu tenho uma caixa de seleção que, em determinadas condições, precisa ser desativada. Acontece que o HTTP não publica entradas desativadas.
Como posso contornar isso? enviando a entrada mesmo que ela esteja desativada e mantendo a entrada desativada?
html
forms
html-input
Um aprendiz
fonte
fonte
Respostas:
UPDATE :
READONLY
não funciona em caixas de seleçãoVocê pode usar,
disabled="disabled"
mas neste momento o valor da caixa de seleção não aparecerá emPOST
valores. Uma das estratégias é adicionar um campo oculto contendo o valor da caixa de seleção no mesmo formulário e ler o valor novamente desse campoSimplesmente mudedisabled
parareadonly
fonte
<input name="foo" value="bar" readonly="readonly" />
readonly
não funcionará, pois você não poderá postar o valor de uma caixa de seleção com essa tag, usedisabled
junto com o elemento de entrada oculto para manter o valor da caixa de seleção. Veja como: stackoverflow.com/a/8274787/448816Eu resolvi esse problema.
Como a
readonly="readonly"
tag não está funcionando (tentei navegadores diferentes), você deve usardisabled="disabled"
. Mas o valor da sua caixa de seleção não será publicado ...Aqui está a minha solução:
Para obter a aparência "somente leitura" e o valor da caixa de seleção POST ao mesmo tempo, basta adicionar uma "entrada" oculta com o mesmo nome e valor da sua caixa de seleção . Você deve mantê-lo próximo à sua caixa de seleção ou entre as mesmas
<form></form>
tags:Além disso, apenas para que você saiba
readonly="readonly", readonly="true", readonly="",
ou simplesmenteREADONLY
não vai resolver isso! Passei algumas horas para descobrir!Essa referência também NÃO é relevante (pode não ser ainda, ou não é mais, não tenho idéia): http://www.w3schools.com/tags/att_input_readonly.asp
fonte
Se você estiver satisfeito com o JQuery, remova o atributo desativado ao enviar o formulário:
fonte
<select>
ou<textfield>
ou outros elementos HTML que suportam odisabled
atributo, é possível selecioná-los e ativar todos com:$( "*:disabled" ).removeAttr("disabled");
Você pode lidar com isso dessa maneira ... Para cada caixa de seleção, crie um campo oculto com o mesmo
name
atributo. Mas defina o valor desse campo oculto com algum valor padrão que você possa testar. Por exemplo..Se a caixa de seleção estiver "marcada" quando o formulário for enviado, o valor desse parâmetro será
Se a caixa de seleção não estiver marcada, o valor será
Você pode usar qualquer valor em vez de "false", mas entende a ideia.
fonte
Comecei com o problema: "como POST / enviar uma caixa de seleção de entrada que está desativada?" e na minha resposta pulei o comentário: "Se queremos desativar uma caixa de seleção, certamente precisamos manter um valor prefixado (marcado ou desmarcado) e também queremos que o usuário esteja ciente disso (caso contrário, devemos usar um tipo oculto e não é uma caixa de seleção) ". Na minha resposta, supus que queremos manter sempre uma caixa de seleção marcada e esse código funciona dessa maneira. Se clicarmos nessa caixa de verificação, ela será verificada para sempre e seu valor será POSTADO / Enviado! Da mesma forma, se eu escrever onclick = "this.checked = false" sem marcado = "marcado" (nota: o padrão é desmarcado), ele será desmarcado para sempre e seu valor não será POSTADO / Enviado !.
fonte
crie uma classe css, por exemplo:
aplique esta classe em vez do atributo desativado
fonte
A maneira mais simples de fazer isso é:
Isso impedirá que o usuário desmarque essa caixa de seleção e ainda enviará seu valor quando o formulário for enviado. Desmarque a opção se desejar que o usuário não consiga marcar esta caixa de seleção.
Além disso, você pode usar o javascript para limpar o onclick depois que uma determinada condição for atendida (se é isso que você procura). Aqui está um rabisco baixo e sujo mostrando o que quero dizer. Não é perfeito, mas você entende.
http://jsfiddle.net/vwUUc/
fonte
Isso funciona como um encanto:
A única desvantagem é o piscar rápido dos campos de entrada desativados ao enviar. Pelo menos no meu cenário, isso não é um problema!
fonte
Não desative; em vez disso, defina-o como somente leitura, embora isso não tenha efeito, pois não permite que o usuário altere o estado. Mas você pode usar o jQuery para aplicar isso (impeça o usuário de alterar o estado da caixa de seleção:
Isso pressupõe que todas as caixas de seleção que você não deseja modificar tenham o atributo "somente leitura". por exemplo.
fonte
Desde a:
Vou lhe oferecer outra possibilidade:
Defina sua caixa de seleção como desativada normalmente. E antes que o formulário seja enviado pelo usuário, ative esta caixa de seleção por JavaScript.
Como a caixa de seleção está ativada antes do envio do formulário, seu valor é lançado de maneira comum. A única coisa que não é muito agradável com esta solução é que essa caixa de seleção fica ativada por um tempo e pode ser vista pelos usuários. Mas é apenas um detalhe com o qual posso viver.
fonte
Infelizmente, não existe uma solução "simples". O atributo somente leitura não pode ser aplicado às caixas de seleção. Eu li as especificações do W3 sobre a caixa de seleção e encontrei o culpado:
Se um controle não tiver um valor atual quando o formulário for enviado, os agentes do usuário não precisarão tratá-lo como um controle bem-sucedido. ( http://www.w3.org/TR/html401/interact/forms.html#h-17.13.2 )
Isso faz com que o estado desmarcado e o estado desabilitado resultem no mesmo valor analisado.
A única maneira completa de fazer isso é adicionar uma entrada oculta com o mesmo nome com javascript ao enviar o formulário .
Você pode usar o pequeno trecho que fiz para isso:
Ele procura o primeiro formulário no documento, reúne todas as entradas e pesquisa entradas desativadas. Quando uma entrada desativada é encontrada, uma entrada oculta é criada no parentNode com o mesmo nome e o valor 'on' (se o estado estiver 'marcado') e '' (se o estado for '' - não marcado).
Esta função deve ser acionada pelo evento 'onsubmit' no elemento FORM como:
fonte
Adicione
onsubmit="this['*nameofyourcheckbox*'].disabled=false"
ao formulário.fonte
Não há outra opção além de um
hidden
campo, portanto, tente usar umhidden
campo como demonstrado no código abaixo:fonte
A função some_name é um exemplo de uma cláusula anterior para gerenciar a segunda caixa de seleção marcada (lança seu valor) ou desmarcada (não lança seu valor) de acordo com a cláusula e o usuário não pode modificar seu status; não há necessidade de gerenciar qualquer desativação da segunda caixa de seleção
fonte
Você pode mantê-lo desativado conforme desejado e remover o atributo desativado antes do envio do formulário.
fonte
Adicionando
onclick="this.checked=true"
Resolva meu problema:Exemplo:
fonte
Aqui está outra solução alternativa que pode ser controlada pelo back-end.
ASPX
No ASPX.CS
A classe é adicionada apenas para fins de estilo.
fonte
Acabei de combinar as sugestões de HTML, JS e CSS nas respostas aqui
HTML:
jQuery:
CSS:
Como o elemento não está 'desativado', ele ainda passa pelo POST.
fonte