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 są zaznaczone?
checkbox
elementu jest okropna? Są kontrolą binarną, powinny wysyłać wartości binarne.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.
źródło
Rozwiązałem go za pomocą waniliowego JavaScript:
Uważaj, aby nie wstawić spacji ani podziałów między tymi dwoma elementami wejściowymi!
Możesz użyć,
this.previousSibling.previousSibling
aby uzyskać „górne” elementy.Za pomocą PHP możesz sprawdzić nazwane ukryte pole pod kątem 0 (nie ustawiono) lub 1 (ustaw).
źródło
<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ówpreviousElementSibling
zamiastpreviousSibling
. Jest obsługiwany prawie wszędzie i ignoruje węzły tekstowe.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:
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.
źródło
request.getParameterValues
Powszechną techniką jest noszenie ukrytej zmiennej wraz z każdym polem wyboru.
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:
Powyższe nie odpowiada dokładnie na pytanie, ale zapewnia alternatywny sposób osiągnięcia podobnej funkcjonalności.
źródło
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
, przypisze0
i jeśli pole wyboru jest zaznaczone, przypiszevalue
do1
źródło
Jeśli pominiesz nazwę pola wyboru, nie zostanie ono przekazane. Tylko tablica test_checkbox.
źródło
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 (
$_POST
w PHP) są odznaczone.źródło
$_REQUEST
jest dobrą praktyką, ponieważ pozwala na ponowne użycie kodu, jeśli skrypt obsługuje obie metody.Właściwie zrobiłbym następujące.
Mam moje ukryte pole wejściowe o tej samej nazwie z danymi wejściowymi pola wyboru
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.
Dostałem to z posta usuń zduplikowane wartości z tablicy
źródło
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 nazwiefield_name[]
, możesz uzyskać drugą wartośćfield_name
podobną$_POST['field_name'][1]
. Jego cel może być niesamowity, jeśli masz kilka pól o tej samej nazwie.„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
źródło
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.
funkcja isset () sprawdza, czy przypisana jest zmienna $ _POST. Logicznie, jeśli nie jest przypisany, pole wyboru nie jest zaznaczone.
źródło
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:
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:
Podczas korzystania z PHP dość proste jest wykrycie, które pola wyboru zostały zaznaczone.
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.
źródło
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:
źródło
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.
W przypadku serwera zaplecza, w którym używane jest ostatnie wystąpienie (PHP, Rails), wykonaj następujące czynności.
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ą
checkbox
atrybutu 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.
Źródło obrazu
źródło
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.
źródło
Możesz również przechwycić zdarzenie form.submit i sprawdzić wstecz przed przesłaniem
źródło
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
w ten sposób będziesz mieć tablicę $ _POST taką jak ta:
źródło
źródło
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.
źródło
Wolałbym zestawić $ _POST
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ść
źródło
Przykładem akcji Ajax jest (': zaznaczone') używane jQuery zamiast .val ();
parametry otrzymają wartość PRAWDA LUB FAŁSZ.
źródło
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.
użyj jednego detektora JavaScript onclick i wywołania funkcji check () dla każdego pola wyboru na mojej stronie:
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:
źródło
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ę).
następnie kontroluj status zmiany pola wyboru, korzystając z poniższego kodu jquery:
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ć :)
źródło
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.
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.
źródło
źródło
Istnieje lepsze obejście. Przede wszystkim podaj atrybut name tylko dla zaznaczonych pól wyboru. Następnie kliknij
submit
, poprzez JavaScriptfunction
zaznaczasz wszystkie niezaznaczone pola. Więc kiedysubmit
tylko oni zostaną odzyskani wform collection
tych, którzy mająname
własność.Korzyść: Nie trzeba tworzyć dodatkowych ukrytych skrzynek i manipulować nimi.
źródło
@cpburnz ma rację, ale za dużo kodu, oto ten sam pomysł, używając mniej kodu:
JS:
HTML (zanotuj nazwę pola za pomocą nazwy tablicy):
A dla PHP:
źródło
jQuery wersja odpowiedzi @ vishnu.
Jeśli używasz jQuery 1.5 lub niższej, użyj funkcji .attr () zamiast .prop ()
źródło
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:
Jeśli wstawisz trzech pracowników naraz, a pierwszy i drugi są samotni, skończysz z 5-elementową
isSingle
tablicą, 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:
źródło
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
JavaScript do uruchomienia na formularzu prześlij
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.
źródło