POST odznaczone pola wyboru HTML


303

Mam mnóstwo pól wyboru, które są domyślnie zaznaczone. Moi użytkownicy prawdopodobnie odznaczą kilka (jeśli w ogóle) pól wyboru, a resztę pozostawią zaznaczone.

Czy istnieje sposób, aby formularz POST był polami wyboru, które nie są zaznaczone, zamiast tych, które zaznaczone?

Odpowiedzi:


217

Dodaj ukryte wejście dla pola wyboru z innym identyfikatorem:

<input id='testName' type='checkbox' value='Yes' name='testName'>
<input id='testNameHidden' type='hidden' value='No' name='testName'>

Przed przesłaniem formularza wyłącz ukryte dane wejściowe na podstawie sprawdzonego warunku:

if(document.getElementById("testName").checked) {
    document.getElementById('testNameHidden').disabled = true;
}

58
Jeśli wybierasz takie rozwiązanie oparte na znacznikach, prawdopodobnie lepiej jest umieścić ukryte dane wejściowe na pierwszym miejscu, na wiele innych odpowiedzi. Jeśli używasz PHP, możesz pozbyć się zależności od javascript, ponieważ używana jest tylko ostatnia wartość.
Ben

12
gamov, mylisz się, etykiety są dołączane do danych wejściowych na podstawie atrybutu id, a nie atrybutu nazwy wejściowej
Justin Emery

14
Trudno uwierzyć, że autorzy tak to zaprojektowali. Dlaczego nie wysłać wszystkich pól wejściowych z pewną wartością domyślną dla niezaznaczonych :( Byłoby to znacznie jaśniejsze rozwiązanie niż zaimplementowanie ukrytych pól „hack”. Musiało być jasne, że będzie ono potrzebne i musieli zobacz to z góry
Srneczek

34
To jest tak hackerskie.
EralpB

65
Czy jestem jedynym, który uważa, że ​​konstrukcja checkboxelementu jest okropna? Są kontrolą binarną, powinny wysyłać wartości binarne.
alexw 21.04.16

473

Rozwiązaniem, które najbardziej mi się podobało, jest umieszczenie ukrytego wejścia o tej samej nazwie co pole wyboru, które może nie być zaznaczone. Myślę, że działa tak, że jeśli pole wyboru nie jest zaznaczone, ukryte dane wejściowe są nadal udane i wysyłane do serwera, ale jeśli pole wyboru jest zaznaczone, zastąpi ukryte dane wejściowe przed nim. W ten sposób nie musisz śledzić, które wartości w opublikowanych danych powinny pochodzić z pól wyboru.

<form>
  <input type='hidden' value='0' name='selfdestruct'>
  <input type='checkbox' value='1' name='selfdestruct'>
</form>

3
Teraz, gdy ponownie przeczytałem pytanie, wydaje się, że tak naprawdę nie było to, czego chciałeś. Jednak dotarłem do tego pytania, gdy próbowałem znaleźć tę odpowiedź, więc może może być przydatna dla kogoś innego.
Sam

2
.NET jest inny, zamiast tego zobacz stackoverflow.com/questions/7600817/...
KCD

121
Należy zauważyć, że jeśli zaznaczysz to pole, przeglądarka wyśle ​​zarówno wartości ukryte, jak i pola wyboru. To rozwiązanie polega następnie na obsłudze przez serwer zmiennej post z tymi 2 wartościami. Jeśli bierze tylko ostatnią wartość (np. PHP), twój kod będzie działał zgodnie z oczekiwaniami. Jednak niektóre serwery traktują to inaczej, niektóre wybierają pierwszą wartość, a inne umieszczają obie wartości w liście / tablicy.
Michael Ekoka,

1
Ta odpowiedź opiera się na założeniu, że możesz polegać tylko na jednym z dwóch jednakowych nazwanych danych wejściowych, które zostaną przesłane do serwera - nie rozumiem, dlaczego otrzymało tyle głosów poparcia?
Muleskinner

7
@sam nie wiesz skąd masz ten pomysł? Gdy dwa lub więcej kontrolek zostanie nazwanych tak samo, oba zostaną wysłane na serwer po przesłaniu (dla pól wyboru, tylko jeśli zaznaczone) - sposób ich obsługi na serwerze zależy od implementacji po stronie serwera. Jeśli mi nie wierzysz, sam możesz to sprawdzić, monitorując ruch za pomocą narzędzia takiego jak skrzypek.
Muleskinner

75

Rozwiązałem go za pomocą waniliowego JavaScript:

<input type="hidden" name="checkboxName" value="0"><input type="checkbox" onclick="this.previousSibling.value=1-this.previousSibling.value">

Uważaj, aby nie wstawić spacji ani podziałów między tymi dwoma elementami wejściowymi!

Możesz użyć, this.previousSibling.previousSiblingaby uzyskać „górne” elementy.

Za pomocą PHP możesz sprawdzić nazwane ukryte pole pod kątem 0 (nie ustawiono) lub 1 (ustaw).


Dlaczego nie możesz mieć spacji lub podziałów między dwoma elementami?
Michael Potter

@MichaelPotter: this.previousSibling otrzyma białe znaki jako rodzeństwo, więc to nie działa.
Marcel Ennix

4
Och, to jest idealne! Rozwiązuje problem publikowania wielu zestawów pól ze zduplikowanymi nazwanymi polami. Żadne inne rozwiązanie tego nie robi. Stosując metodę Marcela, wysłane pola będą miały tablice o równej długości. Więc ten scenariusz: <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>* Załóżmy, że były tam nowe linie. Wydaje się, że nie działają w blokach kodu mini-znaczników
Brian Layman

1
To powinna być zaakceptowana odpowiedź. Działa z tablicami (ex / name = "soup []")
jdavid05

2
Możesz użyć previousElementSiblingzamiast previousSibling. Jest obsługiwany prawie wszędzie i ignoruje węzły tekstowe.
MarSoft,

23

Moim osobistym ulubionym jest dodanie ukrytego pola o tej samej nazwie, które będzie używane, jeśli pole wyboru nie jest zaznaczone. Ale rozwiązanie nie jest tak proste, jak mogłoby się wydawać.

Jeśli dodasz ten kod:

<form>
  <input type='hidden' value='0' name='selfdestruct'>
  <input type='checkbox' value='1' name='selfdestruct'>
</form>

Przeglądarka tak naprawdę nie dba o to, co tu robisz. Przeglądarka prześle oba parametry do serwera, a serwer musi zdecydować, co z nimi zrobić.

Na przykład PHP przyjmuje ostatnią wartość jako tę, której należy użyć (patrz: Autorytatywna pozycja zduplikowanych kluczy zapytania HTTP GET )

Ale inne systemy, z którymi współpracowałem (oparte na Javie) robią to na odwrót - oferują tylko pierwszą wartość. Zamiast tego .NET daje tablicę zawierającą oba elementy

Spróbuję to kiedyś przetestować przy pomocy node.js, Python i Perl.


2
Ruby i node.js przyjmą ostatnią wartość ze zduplikowanych pól formularza. Z tego powodu metody pomocnicze Ruby on Rails konstruują pola wyboru w ten sposób.
nzifnab

7
Wystarczy podsumować - opiera się on na ataku o nazwie Zanieczyszczenie parametrów HTTP i został przeanalizowany przez OWASP: owasp.org/images/b/ba/AppsecEU09_CarettoniDiPaola_v0.8.pdf (strona 9), gdzie można znaleźć listę 20 systemy systemowe i zobacz, jak sobie z tym radzą.
SimonSimCity

1
Serwlety Java dają wszystko, o ile dzwoniszrequest.getParameterValues
mauhiz

20

Powszechną techniką jest noszenie ukrytej zmiennej wraz z każdym polem wyboru.

<input type="checkbox" name="mycheckbox" />
<input type="hidden" name="mycheckbox.hidden"/>

Po stronie serwera najpierw wykrywamy listę ukrytych zmiennych i dla każdej z ukrytych zmiennych staramy się sprawdzić, czy odpowiedni wpis pola wyboru został przesłany w danych formularza, czy nie.

Algorytm po stronie serwera prawdopodobnie wyglądałby tak:

for input in form data such that input.name endswith .hidden
  checkboxName = input.name.rstrip('.hidden')
  if chceckbName is not in form, user has unchecked this checkbox

Powyższe nie odpowiada dokładnie na pytanie, ale zapewnia alternatywny sposób osiągnięcia podobnej funkcjonalności.


20

nie musisz tworzyć ukrytego pola dla wszystkich pól wyboru, po prostu skopiuj mój kod. zmieni wartość pola wyboru, jeśli nie jest zaznaczone value, przypisze 0i jeśli pole wyboru jest zaznaczone, przypisze valuedo1

$("form").submit(function () {

    var this_master = $(this);

    this_master.find('input[type="checkbox"]').each( function () {
        var checkbox_this = $(this);


        if( checkbox_this.is(":checked") == true ) {
            checkbox_this.attr('value','1');
        } else {
            checkbox_this.prop('checked',true);
            //DONT' ITS JUST CHECK THE CHECKBOX TO SUBMIT FORM DATA    
            checkbox_this.attr('value','0');
        }
    })
})

1
To rozwiązanie działa dobrze i bardziej elegancko niż zanieczyszczanie Dom ukrytymi polami.
Prasad Paranjape

9
Powoduje to, że pole jest tymczasowo zaznaczane podczas przesyłania formularza. Jest to mylące (co najwyżej) dla użytkownika.
Mark Fraser

12
$('input[type=checkbox]').on("change",function(){
    var target = $(this).parent().find('input[type=hidden]').val();
    if(target == 0)
    {
        target = 1;
    }
    else
    {
        target = 0;
    }
    $(this).parent().find('input[type=hidden]').val(target);
});

<p>
    <input type="checkbox" />
    <input type="hidden" name="test_checkbox[]" value="0" />
</p>
<p>
    <input type="checkbox" />
    <input type="hidden" name="test_checkbox[]" value="0" />
</p>
<p>
    <input type="checkbox" />
    <input type="hidden" name="test_checkbox[]" value="0" />
</p>

Jeśli pominiesz nazwę pola wyboru, nie zostanie ono przekazane. Tylko tablica test_checkbox.


1
Bardzo świetne rozwiązanie, ale w moim przypadku funkcja live () nie działa, więc użyłem metody on (): $ ('input [type = checkbox]'). On ("change", function () {...}) ;
Massa

4
LIVE jest przestarzałe. Nie używaj go już do odpowiedzi w przepełnieniu stosu. Amem.
Ismael,

Ta odpowiedź jest naprawdę najlepsza. Działa zgodnie z oczekiwaniami. Nawet dla pola wyboru grupy.
Alemoh Rapheal Baja

11

Możesz wykonać JavaScript w zdarzeniu przesyłania formularza. To wszystko, co możesz zrobić, nie ma sposobu, aby przeglądarki zrobiły to same. Oznacza to również, że Twój formularz zostanie uszkodzony dla użytkowników bez Javascript. Lepiej jest wiedzieć na serwerze, jakie są pola wyboru, dzięki czemu można wywnioskować, że te nieobecne w wartościach formularza wysłanego ( $_POSTw PHP) są odznaczone.


2
od wersji PHP 4.1 możesz również użyć $ _REQUEST php.net/manual/en/reserved.variables.request.php
Karl Adler

$_REQUESTjest dobrą praktyką, ponieważ pozwala na ponowne użycie kodu, jeśli skrypt obsługuje obie metody.
nullability

9

Właściwie zrobiłbym następujące.

Mam moje ukryte pole wejściowe o tej samej nazwie z danymi wejściowymi pola wyboru

<input type="hidden" name="checkbox_name[]" value="0" />
<input type="checkbox" name="checkbox_name[]" value="1" />

a następnie, gdy publikuję, najpierw usuwam zduplikowane wartości zebrane w tablicy $ _POST, na podstawie tych, które wyświetlają każdą z unikalnych wartości.

  $posted = array_unique($_POST['checkbox_name']);
  foreach($posted as $value){
    print $value;
  }

Dostałem to z posta usuń zduplikowane wartości z tablicy


Jaki jest cel [] wartości pola nazwy?
Michael Potter

@MichaelPotter Dzieje się tak, gdy wiadomość zostanie wysłana do PHP, będzie ona odczytywać nazwę `checkbox_name []
Twister1002

@ Twister1002, myślę, że opisałeś cel atrybutu name, a nie cel dodania [] do nazwy. Przeprowadziłem wyszukiwanie w sieci i wygląda na to, że niektórzy robią to z nazwami: groupname [nazwa elementu], aby pogrupować pola razem, ale nie znalazłem wyjaśnienia dla pustego [].
Michael Potter

1
@MichaelPotter Przepraszamy, myślałem, że skończyłem to oświadczenie. Ale najwyraźniej nie. Pozwól mi to powtórzyć. Kiedy zostanie wysłany do php, procesor PHP odczyta go jako tablicę. Tak więc przy każdej nazwie checkbox_name[]każda wartość zostanie wprowadzona do tablicy, którą możesz następnie pobrać. Np .: $_POST['checkbox_name'][0]i tak dalej z przyrostem liczby pól o tej samej nazwie. Innym przykładem jest to, że jeśli masz trzy pola o nazwie field_name[], możesz uzyskać drugą wartość field_namepodobną $_POST['field_name'][1]. Jego cel może być niesamowity, jeśli masz kilka pól o tej samej nazwie.
Twister1002

8

„Poszedłem z podejściem serwerowym. Wydaje się, że działa dobrze - dzięki. - reach4thelasers Dec 1 '09 o 15:19” Chciałbym polecić to od właściciela. Jak cytowano: rozwiązanie javascript zależy od sposobu obsługi serwera (nie sprawdziłem go)

Jak na przykład

if(!isset($_POST["checkbox"]) or empty($_POST["checkbox"])) $_POST["checkbox"]="something";

8

Wiem, że to pytanie ma 3 lata, ale znalazłem rozwiązanie, które moim zdaniem działa całkiem dobrze.

Możesz sprawdzić, czy zmienna $ _POST jest przypisana i zapisać ją w zmiennej.

$value = isset($_POST['checkboxname'] ? 'YES' : 'NO';

funkcja isset () sprawdza, czy przypisana jest zmienna $ _POST. Logicznie, jeśli nie jest przypisany, pole wyboru nie jest zaznaczone.


Jest to o wiele lepsze, ponieważ najpopularniejsza odpowiedź to okropne rozwiązanie dla czytników ekranu.
Kevin Waterson

7

Większość odpowiedzi tutaj wymaga użycia JavaScript lub zduplikowanych kontrolek wejściowych. Czasami należy to załatwić całkowicie po stronie serwera.

Uważam, że (zamierzonym) kluczem do rozwiązania tego powszechnego problemu jest kontrola wprowadzania danych w formularzu.

Aby zinterpretować i obsługiwać niezaznaczone wartości pól wyboru, musisz mieć wiedzę na temat:

  1. Nazwy pól wyboru
  2. Nazwa elementu wejściowego przesyłania formularza

Sprawdzając, czy formularz został przesłany (wartość jest przypisywana do elementu wejściowego przesyłania), można założyć wszelkie niezaznaczone wartości pól wyboru .

Na przykład:

<form name="form" method="post">
  <input name="value1" type="checkbox" value="1">Checkbox One<br/>
  <input name="value2" type="checkbox" value="1" checked="checked">Checkbox Two<br/>
  <input name="value3" type="checkbox" value="1">Checkbox Three<br/>
  <input name="submit" type="submit" value="Submit">
</form>

Podczas korzystania z PHP dość proste jest wykrycie, które pola wyboru zostały zaznaczone.

<?php

$checkboxNames = array('value1', 'value2', 'value3');

// Persisted (previous) checkbox state may be loaded 
// from storage, such as the user's session or a database.
$checkboxesThatAreChecked = array(); 

// Only process if the form was actually submitted.
// This provides an opportunity to update the user's 
// session data, or to persist the new state of the data.

if (!empty($_POST['submit'])) {
    foreach ($checkboxNames as $checkboxName) {
        if (!empty($_POST[$checkboxName])) {
            $checkboxesThatAreChecked[] = $checkboxName;
        }
    }
    // The new state of the checkboxes can be persisted 
    // in session or database by inspecting the values 
    // in $checkboxesThatAreChecked.
    print_r($checkboxesThatAreChecked);
}

?>

Dane początkowe można załadować przy każdym ładowaniu strony, ale należy je zmodyfikować tylko wtedy, gdy formularz został przesłany. Ponieważ nazwy pól wyboru są znane wcześniej, można je przeglądać i sprawdzać indywidualnie, tak że brak ich indywidualnych wartości wskazuje, że nie są zaznaczone.


6

Najpierw wypróbowałem wersję Sama. Dobry pomysł, ale powoduje, że w formularzu jest wiele elementów o tej samej nazwie. Jeśli użyjesz dowolnego języka JavaScript, który znajdzie elementy na podstawie nazwy, zwróci teraz tablicę elementów.

Opracowałem pomysł Shailesh w PHP, to działa dla mnie. Oto mój kod:

/ * Usuń pola „.hidden”, jeśli oryginał jest obecny, użyj wartości „.hidden”, jeśli nie. * /
foreach ($ _POST ['frmmain'] jako $ nazwa_pola => wartość $)
{
    // Patrz tylko na elementy kończące się na „.hidden”
    if (! substr ($ nazwa_pola, -strlen ('. ukryty'))) {
        złamać;
    }

    // uzyskaj nazwę bez „.hidden”
    $ real_name = substr ($ key, strlen ($ field_name) - strlen ('. hidden'));

    // Utwórz „fałszywe” oryginalne pole z wartością w „.hidden”, jeśli oryginał nie istnieje
    if (! array_key_exists ($ real_name, $ POST_copy)) {
        $ _POST [$ real_name] = $ wartość;
    }

    // Usuń element „.hidden”
    nieustawiony ($ _ POST [$ nazwa_pola]);
}

6

Podoba mi się również rozwiązanie, w którym po prostu dodajesz dodatkowe pole wejściowe, używając JavaScript wydaje mi się trochę nieprzyzwoity.

W zależności od tego, czego używasz, backend będzie zależeć od tego, które dane wejściowe będą pierwsze.

W przypadku serwera zaplecza, w którym używane jest pierwsze wystąpienie (JSP), wykonaj następujące czynności.

  <input type="checkbox" value="1" name="checkbox_1"/>
  <input type="hidden" value="0" name="checkbox_1"/>


W przypadku serwera zaplecza, w którym używane jest ostatnie wystąpienie (PHP, Rails), wykonaj następujące czynności.

  <input type="hidden" value="0" name="checkbox_1"/>
  <input type="checkbox" value="1" name="checkbox_1"/>


Dla zaplecza serwera, w którym wszystkie wystąpienia są przechowywane w typie danych listy ( [], array). (Python / Zope)

Możesz pisać w dowolnej kolejności, wystarczy spróbować uzyskać wartość z danych wejściowych za pomocą checkboxatrybutu type. Tak więc pierwszy indeks listy, jeśli pole wyboru znajdowało się przed ukrytym elementem, a ostatni indeks, jeśli pole wyboru znajdowało się za ukrytym elementem.


W przypadku serwera zaplecza, w którym wszystkie wystąpienia są łączone przecinkiem (ASP.NET / IIS) Konieczne będzie (podzielenie / rozbicie) ciągu przy użyciu przecinka jako separatora, aby utworzyć typ danych listy. ( [])

Teraz możesz spróbować pobrać pierwszy indeks listy, jeśli pole wyboru znajdowało się przed ukrytym elementem, i pobrać ostatni indeks, jeśli pole wyboru znajdowało się za ukrytym elementem.

Obsługa parametrów zaplecza

Źródło obrazu


6

Korzystam z tego bloku jQuery, który doda ukryte dane wejściowe w czasie przesyłania do każdego niezaznaczonego pola wyboru. Gwarantuje to, że zawsze otrzymujesz wartość przesłaną dla każdego pola wyboru, za każdym razem, bez zaśmiecania znaczników i ryzykując, że zapomnisz zrobić to na polu wyboru, które dodasz później. Jest także niezależny od stosu backendu (PHP, Ruby itp.), Którego używasz.

// Add an event listener on #form's submit action...
$("#form").submit(
    function() {

        // For each unchecked checkbox on the form...
        $(this).find($("input:checkbox:not(:checked)")).each(

            // Create a hidden field with the same name as the checkbox and a value of 0
            // You could just as easily use "off", "false", or whatever you want to get
            // when the checkbox is empty.
            function(index) {
                var input = $('<input />');
                input.attr('type', 'hidden');
                input.attr('name', $(this).attr("name")); // Same name as the checkbox
                input.attr('value', "0"); // or 'off', 'false', 'no', whatever

                // append it to the form the checkbox is in just as it's being submitted
                var form = $(this)[0].form;
                $(form).append(input);

            }   // end function inside each()
        );      // end each() argument list

        return true;    // Don't abort the form submit

    }   // end function inside submit()
);      // end submit() argument list

5

Możesz również przechwycić zdarzenie form.submit i sprawdzić wstecz przed przesłaniem

$('form').submit(function(event){
    $('input[type=checkbox]').prop('checked', function(index, value){
        return !value;
    });
});

4

Widzę, że to pytanie jest stare i ma tak wiele odpowiedzi, ale i tak dam swój grosz. Głosuję za rozwiązaniem JavaScript w zdarzeniu „prześlij” formularza, jak niektórzy zauważyli. Nie podwajaj danych wejściowych (zwłaszcza jeśli masz długie nazwy i atrybuty z kodem php zmieszanym z HTML), nie ma kłopotów po stronie serwera (które wymagałyby znajomości wszystkich nazw pól i sprawdzania ich jeden po drugim), po prostu pobierz wszystkie niezaznaczone elementy , przypisz im wartość 0 (lub cokolwiek, czego potrzebujesz, aby wskazać status „niezaznaczony”), a następnie zmień ich atrybut „sprawdzony” na true

    $('form').submit(function(e){
    var b = $("input:checkbox:not(:checked)");
    $(b).each(function () {
        $(this).val(0); //Set whatever value you need for 'not checked'
        $(this).attr("checked", true);
    });
    return true;
});

w ten sposób będziesz mieć tablicę $ _POST taką jak ta:

Array
(
            [field1] => 1
            [field2] => 0
)

Nie działa po mojej stronie. Próbuję to zrobić, ale nadal nie publikuje wszystkich pól wyboru. [kod] $ („# filtr wejściowy”). zmiana (funkcja (e) {console.log ('sublmit'); var b = $ ("input: checkbox: not (: zaznaczony)"); $ (b) .each (function () {$ (this) .val (2); $ (this) .attr („zaznaczone”, prawda);}); $ („# filter”). Submit ();}); [/ code]
Lio

Wykonał dla mnie lewę. Jedyną wadą - w formularzu przesyłania, każde pole wyboru zostało zaznaczone. Może to być mylące dla użytkownika, ale ponieważ strona przeładowuje się po przesłaniu formularza, myślę, że to drobny problem.
Oksana Romaniv

Jak powiedział Oksana, sprawdza wszystkie pola wyboru, w tym wszystkie wymagane pola wyboru, których użytkownik nie wybrał, umożliwiając przesłanie formularza bez zgody użytkownika na pewne warunki.
bskool

4
$('form').submit(function () {
    $(this).find('input[type="checkbox"]').each( function () {
        var checkbox = $(this);
        if( checkbox.is(':checked')) {
            checkbox.attr('value','1');
        } else {
            checkbox.after().append(checkbox.clone().attr({type:'hidden', value:0}));
            checkbox.prop('disabled', true);
        }
    })
});

1
To zadziałało dla mnie. Zamiast używać .submit użyłbyś .click. Następnie usuń bit, który wyłącza pola wyboru. Potem działa idealnie.
cgrouge

1
Najlepsza odpowiedź nie wymaga dodawania kolejnych ukrytych danych wejściowych dla każdego z nich
Sky

3

To, co zrobiłem, było trochę inne. Najpierw zmieniłem wartości wszystkich niezaznaczonych pól wyboru. Aby „0”, a następnie zaznacz je wszystkie, aby wartość została przesłana.

function checkboxvalues(){
  $("#checkbox-container input:checkbox").each(function({ 
    if($(this).prop("checked")!=true){
      $(this).val("0");
      $(this).prop("checked", true);
    }
  });
}


Odpowiedź jest dobra, ale chcę wiedzieć, czy różni się od odpowiedzi @Rameez SOOMRO?
Imran Qamer

Podobny wynik końcowy, tylko w ten sposób nie zmienisz wartości zaznaczonych pól wyboru.
Seborreia,

2

Wolałbym zestawić $ _POST

if (!$_POST['checkboxname']) !$_POST['checkboxname'] = 0;

nie ma znaczenia, jeśli test POST nie ma wartości „checkboxname”, został odznaczony, więc przypisz wartość.

możesz utworzyć tablicę swoich wartości ckeckbox i stworzyć funkcję, która sprawdza, czy wartości istnieją, jeśli nie, to znaczy, że nie są zaznaczone i możesz przypisać wartość


1

Przykładem akcji Ajax jest (': zaznaczone') używane jQuery zamiast .val ();

            var params = {
                books: $('input#users').is(':checked'),
                news : $('input#news').is(':checked'),
                magazine : $('input#magazine').is(':checked')
            };

parametry otrzymają wartość PRAWDA LUB FAŁSZ.


1

Pola wyboru zwykle reprezentują dane binarne, które są przechowywane w bazie danych jako wartości Tak / Nie, Y / N lub 1/0. Pola wyboru HTML mają złą naturę wysyłania wartości do serwera tylko wtedy, gdy pole wyboru jest zaznaczone! Oznacza to, że skrypt serwera w innej witrynie musi wiedzieć z góry, jakie są wszystkie możliwe pola wyboru na stronie internetowej, aby móc przechowywać wartości dodatnie (zaznaczone) lub ujemne (niezaznaczone). W rzeczywistości problem stanowią tylko wartości ujemne (gdy użytkownik odznaczy poprzednio (wstępnie) sprawdzoną wartość - w jaki sposób serwer może to wiedzieć, gdy nic nie jest wysyłane, jeśli nie wie z góry, że ta nazwa powinna zostać wysłana). Jeśli masz skrypt po stronie serwera, który dynamicznie tworzy skrypt UPDATE, istnieje problem, ponieważ nie wiesz, jakie wszystkie pola wyboru powinny zostać odebrane, aby ustawić wartość Y dla zaznaczonych i wartość N dla niezaznaczonych (nieodebranych).

Ponieważ przechowuję wartości „Y” i „N” w mojej bazie danych i reprezentuję je za pomocą zaznaczonych i niezaznaczonych pól wyboru na stronie, dodałem ukryte pole dla każdej wartości (pole wyboru) z wartościami „Y” i „N”, a następnie używam pól wyboru wyłącznie do celów wizualnych reprezentacja i użyj prostej funkcji JavaScript check (), aby ustawić wartość if zgodnie z wyborem.

<input type="hidden" id="N1" name="N1" value="Y" />
<input type="checkbox"<?php if($N1==='Y') echo ' checked="checked"'; ?> onclick="check(this);" />
<label for="N1">Checkbox #1</label>

użyj jednego detektora JavaScript onclick i wywołania funkcji check () dla każdego pola wyboru na mojej stronie:

function check(me)
{
  if(me.checked)
  {
    me.previousSibling.previousSibling.value='Y';
  }
  else
  {
    me.previousSibling.previousSibling.value='N';
  }
}

W ten sposób wartości „Y” lub „N” są zawsze wysyłane do skryptu po stronie serwera, wie, jakie są pola, które należy zaktualizować, i nie ma potrzeby konwersji wartości checbox „on” na „Y” lub nieotrzymanego pola wyboru na „N „.

UWAGA: biała spacja lub nowa linia jest również rodzeństwem, więc tutaj potrzebuję .previousSibling.previousSibling.value. Jeśli między nimi nie ma spacji, tylko .previousSibling.value


Nie musisz jawnie dodawać detektora kliknięcia, jak wcześniej, możesz użyć biblioteki jQuery, aby dynamicznie dodać detektor kliknięć z funkcją zmiany wartości wszystkich pól wyboru na stronie:

$('input[type=checkbox]').click(function()
{
  if(this.checked)
  {
    $(this).prev().val('Y');
  }
  else
  {
    $(this).prev().val('N');
  }
});

1

Wszystkie odpowiedzi są świetne, ale jeśli masz wiele pól wyboru w formularzu o tej samej nazwie i chcesz opublikować status każdego pola wyboru. Następnie rozwiązałem ten problem, umieszczając ukryte pole z polem wyboru (nazwa związana z tym, czego chcę).

<input type="hidden" class="checkbox_handler" name="is_admin[]" value="0" />
<input type="checkbox" name="is_admin_ck[]" value="1" />

następnie kontroluj status zmiany pola wyboru, korzystając z poniższego kodu jquery:

$(documen).on("change", "input[type='checkbox']", function() {
    var checkbox_val = ( this.checked ) ? 1 : 0;
    $(this).siblings('input.checkbox_handler').val(checkbox_val);
});

teraz po zmianie dowolnego pola wyboru zmieni wartość powiązanego ukrytego pola. A na serwerze możesz patrzeć tylko na ukryte pola zamiast pól wyboru.

Mam nadzieję, że to pomoże komuś mieć tego rodzaju problem. dopingować :)


1

Problem z polami wyboru polega na tym, że jeśli nie są zaznaczone, to nie są publikowane w formularzu. Jeśli zaznaczysz pole wyboru i opublikujesz formularz, otrzymasz wartość pola wyboru w zmiennej $ _POST, której możesz użyć do przetworzenia formularza, jeśli nie jest zaznaczone, żadna wartość nie zostanie dodana do zmiennej $ _POST.

W PHP normalnie można obejść ten problem, wykonując kontrolę isset () na elemencie checkbox. Jeśli oczekiwanego elementu nie ma w zmiennej $ _POST, wiemy, że pole wyboru nie jest zaznaczone, a wartość może być fałszywa.

if(!isset($_POST['checkbox1']))
{
     $checkboxValue = false;
} else {
     $checkboxValue = $_POST['checkbox1'];
}

Ale jeśli utworzyłeś formularz dynamiczny, nie zawsze będziesz znać atrybut nazwy swoich pól wyboru, jeśli nie znasz nazwy pola wyboru, nie możesz użyć funkcji isset, aby sprawdzić, czy została wysłana za pomocą zmienna $ _POST.


1
function SubmitCheckBox(obj) {
     obj.value   = obj.checked ? "on" : "off";
     obj.checked = true;
     return obj.form.submit();
}

<input type=checkbox name="foo" onChange="return SubmitCheckBox(this);">

0

Istnieje lepsze obejście. Przede wszystkim podaj atrybut name tylko dla zaznaczonych pól wyboru. Następnie kliknijsubmit , poprzez JavaScript functionzaznaczasz wszystkie niezaznaczone pola. Więc kiedy submittylko oni zostaną odzyskani w form collectiontych, którzy mają namewłasność.

  //removing name attribute from all checked checkboxes
                  var a = $('input:checkbox:checked');
                   $(a).each(function () {
                       $(this).removeAttr("name");        
                   });

   // checking all unchecked checkboxes
                   var b = $("input:checkbox:not(:checked)");
                   $(b).each(function () {
                       $(this).attr("checked", true);
                   });

Korzyść: Nie trzeba tworzyć dodatkowych ukrytych skrzynek i manipulować nimi.


0

@cpburnz ma rację, ale za dużo kodu, oto ten sam pomysł, używając mniej kodu:

JS:

// jQuery OnLoad
$(function(){
    // Listen to input type checkbox on change event
    $("input[type=checkbox]").change(function(){
        $(this).parent().find('input[type=hidden]').val((this.checked)?1:0);
    });
});

HTML (zanotuj nazwę pola za pomocą nazwy tablicy):

<div>
    <input type="checkbox" checked="checked">
    <input type="hidden" name="field_name[34]" value="1"/>
</div>
<div>
    <input type="checkbox">
    <input type="hidden" name="field_name[35]" value="0"/>
</div>
<div>

A dla PHP:

<div>
    <input type="checkbox"<?=($boolean)?' checked="checked"':''?>>
    <input type="hidden" name="field_name[<?=$item_id?>]" value="<?=($boolean)?1:0?>"/>
</div>

0

jQuery wersja odpowiedzi @ vishnu.

if($('#testName').is(":checked")){
    $('#testNameHidden').prop('disabled', true);
}

Jeśli używasz jQuery 1.5 lub niższej, użyj funkcji .attr () zamiast .prop ()


0

To rozwiązanie jest zainspirowane rozwiązaniem @ desw's.

Jeśli twoje nazwy wejściowe są w „stylu formularza”, utracisz powiązanie indeksu tablicowego z wartościami chekbox, gdy tylko zostanie sprawdzony jeden chekbox, zwiększając to „rozłączenie” o jedną jednostkę za każdym razem, gdy sprawdzany jest chekbox. Może tak być w przypadku formularza wstawiania czegoś takiego jak pracownicy złożeni z niektórych pól, na przykład:

<input type="text" name="employee[]" />
<input type="hidden" name="isSingle[] value="no" />
<input type="checkbox" name="isSingle[] value="yes" />

Jeśli wstawisz trzech pracowników naraz, a pierwszy i drugi są samotni, skończysz z 5-elementową isSingletablicą, więc nie będziesz w stanie iterować od razu przez trzy tablice, aby na przykład , wstaw pracowników do bazy danych.

Możesz temu zaradzić, stosując proste przetwarzanie końcowe tablicy. Używam PHP po stronie serwera i zrobiłem to:

$j = 0;
$areSingles = $_POST['isSingle'];
foreach($areSingles as $isSingle){
  if($isSingle=='yes'){
    unset($areSingles[$j-1]);
  }
  $j++;
}
$areSingles = array_values($areSingles);

0

To rozwiązanie jest przesadą w przypadku tego pytania, ale pomogło mi, gdy miałem to samo pole wyboru, które występowało wiele razy dla różnych wierszy w tabeli. Musiałem znać wiersz reprezentowany przez pole wyboru, a także znać stan tego pola wyboru (zaznaczone / niezaznaczone).

To, co zrobiłem, to usunięcie atrybutu name z moich danych wejściowych pola wyboru, nadanie im tej samej klasy i utworzenie ukrytego wejścia, w którym będzie przechowywany odpowiednik danych JSON.

HTML

 <table id="permissions-table">
    <tr>
	<td>
	    <input type="checkbox" class="has-permission-cb" value="Jim">
	    <input type="checkbox" class="has-permission-cb" value="Bob">
	    <input type="checkbox" class="has-permission-cb" value="Suzy">
	</td>
    </tr>
 </table>
 <input type="hidden" id="has-permissions-values" name="has-permissions-values" value="">

JavaScript do uruchomienia na formularzu prześlij

var perms = {};
$(".has-permission-checkbox").each(function(){
  var userName = this.value;
  var val = ($(this).prop("checked")) ? 1 : 0
  perms[userName] = {"hasPermission" : val};
});
$("#has-permissions-values").val(JSON.stringify(perms));

Ciąg json zostanie przekazany w postaci $ _POST [„has-permissions-values”]. W PHP zdekoduj ciąg do tablicy, a będziesz miał tablicę asocjacyjną, która ma każdy wiersz i wartość true / false dla każdego odpowiedniego pola wyboru. Dzięki temu bardzo łatwo jest przejść i porównać z bieżącymi wartościami w bazie danych.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.