Eu tenho uma carga de caixas de seleção marcadas por padrão. Meus usuários provavelmente desmarcarão algumas (se houver) das caixas de seleção e deixarão o restante marcado.
Existe alguma maneira de tornar o formulário POST as caixas de seleção que não estão marcadas, e não as que estão marcadas?
checkbox
elemento é terrível? Eles são um controle binário, eles devem enviar valores binários.A solução que eu mais gostei até agora é colocar uma entrada oculta com o mesmo nome da caixa de seleção que pode não estar marcada. Eu acho que funciona para que, se a caixa de seleção não estiver marcada, a entrada oculta ainda for bem-sucedida e enviada ao servidor, mas se a caixa de seleção estiver marcada, ela substituirá a entrada oculta antes dela. Dessa forma, você não precisa acompanhar quais valores nos dados publicados devem vir das caixas de seleção.
fonte
Eu o resolvi usando JavaScript vanilla:
Cuidado para não haver espaços ou quebras de linha entre esses dois elementos de entrada!
Você pode usar
this.previousSibling.previousSibling
para obter elementos "superiores".Com o PHP, você pode verificar o campo oculto nomeado para 0 (não definido) ou 1 (definido).
fonte
<fieldset name='fs1'> <input type="text" name="somefield[]"> <input type="checkbox" name="live[]"> </fieldset> <fieldset name='fs2'> <input type="text" name="somefield[]"> <input type="checkbox" name="live[]"> </fieldset>
* Suponha que houvesse novas linhas lá. Eles não parecem estar trabalhando em blocos de códigos de mini-marcaçãopreviousElementSibling
vez depreviousSibling
. É suportado em quase todos os lugares e ignora nós de texto.Meu favorito pessoal é adicionar um campo oculto com o mesmo nome que será usado se a caixa de seleção estiver desmarcada. Mas a solução não é tão fácil quanto parece.
Se você adicionar este código:
O navegador realmente não se importa com o que você faz aqui. O navegador enviará os dois parâmetros para o servidor, e o servidor precisará decidir o que fazer com eles.
O PHP, por exemplo, usa o último valor como aquele a ser usado (consulte: Posição autorizada das chaves de consulta HTTP GET duplicadas )
Mas outros sistemas com os quais trabalhei (baseados em Java) fazem o caminho inverso - eles oferecem apenas o primeiro valor. Em vez disso, o .NET fornecerá uma matriz com os dois elementos
Vou tentar testar isso com node.js, Python e Perl em algum momento.
fonte
request.getParameterValues
Uma técnica comum para contornar isso é carregar uma variável oculta junto com cada caixa de seleção.
No lado do servidor, primeiro detectamos a lista de variáveis ocultas e, para cada variável oculta, tentamos ver se a entrada da caixa de seleção correspondente é enviada nos dados do formulário ou não.
O algoritmo do lado do servidor provavelmente se pareceria com:
O exposto acima não responde exatamente à pergunta, mas fornece um meio alternativo de obter funcionalidade semelhante.
fonte
você não precisa criar um campo oculto para todas as caixas de seleção, basta copiar meu código. ele mudará o valor da caixa de seleção, se não estiver marcado, o
value
atribuirá0
e, se a caixa de seleção estiver marcada, atribuirávalue
ao1
fonte
Se você deixar de fora o nome da caixa de seleção, ela não será aprovada. Somente a matriz test_checkbox.
fonte
Você pode fazer algum Javascript no evento de envio do formulário. É tudo o que você pode fazer, porém, não há como convencer os navegadores a fazer isso sozinhos. Isso também significa que seu formulário será quebrado para usuários sem Javascript. Melhor é saber no servidor quais caixas de seleção existem, para que você possa deduzir que aqueles ausentes dos valores do formulário postado (
$_POST
em PHP) estão desmarcados.fonte
$_REQUEST
é uma boa prática, pois permite a reutilização de algum código se o seu script suportar os dois métodos.Na verdade, eu faria o seguinte.
Tenha meu campo de entrada oculto com o mesmo nome na entrada da caixa de seleção
e então, quando eu postar, removo primeiro os valores duplicados capturados na matriz $ _POST, depois que exibem cada um dos valores exclusivos.
Eu recebi isso de um post remover valores duplicados da matriz
fonte
checkbox_name[]
cada valor será inserido em uma matriz, que você poderá extrair. Ex:$_POST['checkbox_name'][0]
e assim por diante com o incremento de quantos campos tinham o mesmo nome. Outro exemplo é se você tiver três campos nomeados,field_name[]
poderá obter o segundo valor defield_name
like$_POST['field_name'][1]
. Seu objetivo pode ser incrível se você tiver vários campos com o mesmo nome."Eu segui a abordagem do servidor. Parece funcionar bem - obrigado. - reach4thelasers 01/12/2009 às 15:19" Gostaria de recomendá-lo ao proprietário. Como citado: a solução javascript depende de como o manipulador do servidor (não o verifiquei)
tal como
fonte
Sei que esta pergunta tem 3 anos, mas encontrei uma solução que acho que funciona muito bem.
Você pode verificar se a variável $ _POST está atribuída e salvá-la em uma variável.
a função isset () verifica se a variável $ _POST está atribuída. Por lógica, se não estiver atribuído, a caixa de seleção não estará marcada.
fonte
A maioria das respostas aqui requer o uso de JavaScript ou controles de entrada duplicados. Às vezes, isso precisa ser tratado inteiramente no lado do servidor.
Acredito que a chave (pretendida) para resolver esse problema comum é o controle de entrada de envio do formulário.
Para interpretar e manipular valores desmarcados para caixas de seleção com êxito, você precisa ter o seguinte conhecimento:
Ao verificar se o formulário foi enviado (um valor é atribuído ao elemento de entrada do envio), qualquer valor desmarcado da caixa de seleção pode ser assumido .
Por exemplo:
Ao usar o PHP, é bastante trivial detectar quais caixas de seleção foram marcadas.
Os dados iniciais podem ser carregados em cada carregamento da página, mas só devem ser modificados se o formulário foi enviado. Como os nomes das caixas de seleção são conhecidos antecipadamente, eles podem ser percorridos e inspecionados individualmente, para que a ausência de seus valores individuais indique que não estão marcados.
fonte
Eu tentei a versão de Sam primeiro. Boa ideia, mas faz com que haja vários elementos no formulário com o mesmo nome. Se você usar qualquer javascript que encontre elementos com base no nome, ele retornará uma matriz de elementos.
Eu elaborei a idéia de Shailesh em PHP, funciona para mim. Aqui está o meu código:
fonte
Também gosto da solução de que você acabou de postar um campo de entrada extra, usar JavaScript parece um pouco hacky para mim.
Dependendo do que você usa para o back-end, depende de qual entrada será a primeira.
Para um servidor back-end em que a primeira ocorrência é usada (JSP), faça o seguinte.
Para um servidor backend em que a última ocorrência é usada (PHP, Rails), faça o seguinte.
Para um servidor backend em que todas as ocorrências são armazenadas em um tipo de dados da lista (
[]
,array
). (Python / Zope)Você pode postar na ordem que quiser, basta tentar obter o valor da entrada com o
checkbox
atributo type Portanto, o primeiro índice da lista se a caixa de seleção estiver antes do elemento oculto e o último índice se a caixa de seleção estiver após o elemento oculto.Para um servidor em que todas as ocorrências são concatenadas com uma vírgula (ASP.NET / IIS), você precisará (dividir / explodir) a cadeia de caracteres usando uma vírgula como delimitador para criar um tipo de dados da lista. (
[]
)Agora você pode tentar pegar o primeiro índice da lista se a caixa de seleção estiver antes do elemento oculto e pegar o último índice se a caixa de seleção estiver após o elemento oculto.
fonte da imagem
fonte
Eu uso esse bloco de jQuery, que adicionará uma entrada oculta no momento do envio a todas as caixas de seleção desmarcadas. Isso garantirá que você sempre obtenha um valor enviado para cada caixa de seleção, sempre, sem sobrecarregar sua marcação e correndo o risco de esquecer de fazê-lo em uma caixa de seleção que você adicionar posteriormente. Também é independente de qualquer pilha de back-end (PHP, Ruby, etc.) que você está usando.
fonte
Você também pode interceptar o evento form.submit e reverter a verificação antes de enviar
fonte
Vejo que essa pergunta é antiga e tem muitas respostas, mas darei meu centavo de qualquer maneira. Meu voto é para a solução javascript no evento 'submit' do formulário, como alguns apontaram. Sem duplicar as entradas (especialmente se você tiver nomes longos e atributos com código php misturado com html), sem problemas no lado do servidor (que exigiria conhecer todos os nomes de campos e verificá-los um por um), basta buscar todos os itens não verificados , atribua a eles um valor 0 (ou o que você precisar para indicar um status 'não verificado') e altere o atributo 'verificado' para verdadeiro
Dessa forma, você terá uma matriz $ _POST como esta:
fonte
fonte
O que eu fiz foi um pouco diferente. Primeiro, alterei os valores de todas as caixas de seleção desmarcadas. Para "0", selecione todos eles, para que o valor seja enviado.
fonte
Eu preferiria agrupar o $ _POST
se importa, se o POST não tiver o valor 'checkboxname', ele foi desmarcado, então, atribua um valor.
você pode criar uma matriz de seus valores de ckeckbox e criar uma função que verifique se os valores existem, caso contrário, importa que estejam desmarcados e você pode atribuir um valor
fonte
O exemplo de ações do Ajax é (': verificado') usado jQuery em vez de .val ();
os parâmetros obterão valor em VERDADEIRO OU FALSO.
fonte
As caixas de seleção geralmente representam dados binários armazenados no banco de dados como valores Sim / Não, S / N ou 1/0. As caixas de seleção HTML têm natureza ruim para enviar valor ao servidor somente se a caixa de seleção estiver marcada! Isso significa que o script do servidor em outro site deve saber com antecedência quais são todas as caixas de seleção possíveis na página da Web para poder armazenar valores positivos (marcados) ou negativos (não marcados). Na verdade, apenas valores negativos são problemáticos (quando o usuário desmarca o valor previamente verificado (pré) - como o servidor pode saber disso quando nada é enviado se não souber antecipadamente que esse nome deve ser enviado). Se você possui um script do lado do servidor que cria dinamicamente o script UPDATE, há um problema porque você não sabe quais caixas de seleção devem ser recebidas para definir o valor Y para as verificadas e o valor N para as desmarcadas (não recebidas).
Como eu armazeno os valores 'Y' e 'N' no meu banco de dados e os represento por meio de caixas de seleção marcadas e desmarcadas na página, adicionei um campo oculto para cada valor (caixa de seleção) com os valores 'Y' e 'N' e utilizo as caixas de seleção apenas para visual representação e use a função JavaScript simples check () para definir o valor de se de acordo com a seleção.
use um ouvinte JavaScript onclick e chame a função check () para cada caixa de seleção na minha página da web:
Dessa forma, os valores 'Y' ou 'N' são sempre enviados para o script do lado do servidor, ele sabe quais são os campos que devem ser atualizados e não há necessidade de converter o valor do checbox "on" em 'Y' ou a caixa de seleção não recebida em 'N '
NOTA: espaço em branco ou nova linha também é um irmão, então aqui eu preciso de .previousSibling.previousSibling.value. Se não houver espaço entre, apenas .previousSibling.value
Você não precisa adicionar explicitamente o ouvinte do onclick como antes, pode usar a biblioteca jQuery para adicionar dinamicamente o ouvinte de cliques com a função para alterar o valor de todas as caixas de seleção da sua página:
fonte
Todas as respostas são ótimas, mas se você tiver várias caixas de seleção em um formulário com o mesmo nome e desejar postar o status de cada caixa de seleção. Em seguida, resolvi esse problema colocando um campo oculto com a caixa de seleção (nome relacionado ao que eu quero).
em seguida, controle o status da alteração da caixa de seleção abaixo do código jquery:
agora, ao alterar qualquer caixa de seleção, ele mudará o valor do campo oculto relacionado. E no servidor você pode procurar apenas campos ocultos em vez de caixas de seleção.
Espero que isso ajude alguém a ter esse tipo de problema. torcer :)
fonte
O problema com as caixas de seleção é que, se não estiverem marcadas, não serão postadas no seu formulário. Se você marcar uma caixa de seleção e postar um formulário, receberá o valor da caixa de seleção na variável $ _POST que pode ser usada para processar um formulário, se estiver desmarcada, nenhum valor será adicionado à variável $ _POST.
No PHP, você normalmente solucionaria esse problema realizando uma verificação isset () no elemento da caixa de seleção. Se o elemento que você espera não estiver definido na variável $ _POST, sabemos que a caixa de seleção não está marcada e o valor pode ser falso.
Mas se você criou um formulário dinâmico, nem sempre saberá o atributo name de suas caixas de seleção; se não souber o nome da caixa de seleção, não poderá usar a função isset para verificar se este foi enviado com a variável $ _POST.
fonte
fonte
Existe uma solução melhor. Primeiro, forneça o atributo name apenas às caixas de seleção marcadas. Em seguida, no clique
submit
, através de um JavaScript,function
você marca todas as caixas desmarcadas. Então, quando vocêsubmit
apenas aqueles serão recuperadosform collection
naqueles que têmname
propriedades.Vantagem: Não há necessidade de criar caixas ocultas extras e manipulá-las.
fonte
O @cpburnz acertou, mas com muito código, aqui está a mesma idéia usando menos código:
JS:
HTML (observe o nome do campo usando um nome de matriz):
E para PHP:
fonte
Versão jQuery da resposta de @ vishnu.
Se você estiver usando o jQuery 1.5 ou abaixo, use a função .attr () em vez de .prop ()
fonte
Esta solução é inspirada na de @ desw.
Se seus nomes de entrada estiverem no "estilo de formulário", você perderá a associação do índice de matriz com os valores da sua caixa de cheques assim que uma caixa de verificação for marcada, incrementando essa "dissociação" em uma unidade cada vez que uma caixa de cheques for marcada. Pode ser o caso de um formulário para inserir algo como funcionários compostos por alguns campos, por exemplo:
Caso você insira três funcionários ao mesmo tempo e o primeiro e o segundo sejam únicos, você terminará com uma
isSingle
matriz de 5 elementos , para que não seja possível iterar de uma só vez pelas três matrizes para, por exemplo, , insira funcionários em um banco de dados.Você pode superar isso com algum pós-processamento fácil de matriz. Estou usando PHP no lado do servidor e fiz isso:
fonte
Portanto, esta solução é um exagero para esta pergunta, mas me ajudou quando tive a mesma caixa de seleção que ocorreu várias vezes para linhas diferentes em uma tabela. Eu precisava conhecer a linha que a caixa de seleção representava e também o estado da caixa de seleção (marcada / desmarcada).
O que fiz foi retirar o atributo name das minhas entradas da caixa de seleção, dar a elas a mesma classe e criar uma entrada oculta que contivesse o equivalente JSON dos dados.
HTML
Javascript para executar no envio do formulário
A string json será passada com o formulário como $ _POST ["has-permission-values"]. No PHP, decodifique a string em uma matriz e você terá uma matriz associativa que possui cada linha e o valor verdadeiro / falso para cada caixa de seleção correspondente. É muito fácil percorrer e comparar com os valores atuais do banco de dados.
fonte