Czy to standardowe zachowanie przeglądarek, aby wysyłać dane wartości wejściowej pola wyboru tylko wtedy, gdy są one sprawdzane po przesłaniu formularza?
A jeśli nie podano danych wartości, czy wartość domyślna jest zawsze „włączona”?
Zakładając, że powyższe jest prawidłowe, czy to spójne zachowanie we wszystkich przeglądarkach?
<select>
z dwiema opcjamion
ioff
:-)W HTML każdy
<input />
element jest powiązany z jedną (ale nie unikalną) parą nazwa i wartość. Ta para jest wysyłana w kolejnym żądaniu (w tym przypadku w treści żądania POST) tylko wtedy, gdy<input />
jest „udana”.Więc jeśli masz te dane wejściowe w swoim
<form>
DOM:Wygeneruje te pary nazwa + wartość, które zostaną przesłane do serwera:
Zauważ, że:
two
isix
zostali wykluczeni, ponieważ mielidisabled
ustawiony atrybut.three
został wysłany dwukrotnie, ponieważ miał dwa prawidłowe dane wejściowe o tej samej nazwie.four
nie zostało wysłane, ponieważ tocheckbox
nie byłochecked
six
nie został wysłany pomimo tego,checked
żedisabled
atrybut ma wyższy priorytet.seven
nie maname=""
przesłanego atrybutu, więc nie został przesłany.W odniesieniu do twojego pytania: możesz zobaczyć, że pole wyboru, które nie jest zaznaczone, nie będzie w związku z tym przesyłane do serwera para nazwa-wartość - ale zostaną do niego wysłane inne dane wejściowe o tej samej nazwie.
Frameworki takie jak ASP.NET MVC działają w tym celu (ukradkowo) łącząc każde
checkbox
wejście zhidden
wejściem w renderowanym HTML, w następujący sposób:Renderuje:
Jeśli użytkownik nie zaznaczy pola wyboru, na serwer zostaną wysłane następujące informacje:
Jeśli użytkownik zaznaczy pole wyboru, oba zostaną wysłane:
Ale serwer zignoruje
=false
wersję, ponieważ ją widzi=true
, a więc jeśli jej nie widzi=true
, może stwierdzić, że pole wyboru zostało zrenderowane i że użytkownik go nie sprawdził - w przeciwieństwie doSomeBooleanProperty
braku renderowania danych wejściowych.źródło
[]
na końcu nazwy wejściowej, domyślnym zachowaniem jest przesłanie tylko ostatniego elementu o tej nazwie, tak długo, jak ukryte dane wejściowe znajdują się przed polem wyboru, będzie działać.[]
sufiks nie jest częścią specyfikacji HTML, a przeglądarki nie traktują tego specjalnie. Bez[]
PHP pozwoli na dostęp tylko do jednej wartości (ostatniej wartości) zamiast wszystkich wartości.Jeśli pole wyboru nie jest zaznaczone, nie ma wpływu na dane przesyłane przy składaniu formularza.
Sekcja HTML5 4.10.22.4 Konstruowanie zestawu danych formularza opisuje sposób konstruowania danych formularza:
a następnie
on
określana jest wartość domyślna, jeśli jejvalue
brakuje:W ten sposób niezaznaczone pola wyboru są pomijane podczas budowy danych formularza.
Podobne zachowanie jest wymagane w HTML4 . Można oczekiwać tego zachowania od wszystkich zgodnych przeglądarek.
źródło
Pola wyboru wysyłają wartość „on” tylko wtedy, gdy pole wyboru jest zaznaczone. Zaraz po złapaniu wartości pola wyboru możesz użyć ukrytych danych wejściowych
JS :
HTML :
źródło
Tak, ponieważ w przeciwnym razie nie byłoby solidnego sposobu ustalenia, czy pole wyboru zostało faktycznie zaznaczone, czy nie (jeśli zmieniłoby to wartość, może istnieć przypadek, gdy żądana wartość, jeśli została sprawdzona, byłaby taka sama jak ta, którą była zamieniony na).
Inne odpowiedzi potwierdzają, że „włączone” jest ustawieniem domyślnym. Jeśli jednak nie jesteś zainteresowany tą wartością, po prostu użyj:
źródło
Ze specyfikacji HTML 4, która powinna być spójna w prawie wszystkich przeglądarkach:
http://www.w3.org/TR/html401/interact/forms.html#checkbox
Sukces definiuje się następująco:
źródło
typ wejścia = „ukryty” nazwa = „is_main” wartość = „0”
typ wejścia = „pole wyboru” nazwa = „is_main” wartość = „1”
więc możesz kontrolować tak jak ja w aplikacji. jeśli sprawdzi, wyślij wartość 1 w przeciwnym razie 0
źródło
Żadna z powyższych odpowiedzi mnie nie zadowoliła. Odkryłem, że najlepszym rozwiązaniem jest włączenie ukrytego wejścia przed każdym wejściem pola wyboru o tej samej nazwie.
<input type="hidden" name="foo[]" value="off"/>
<input type="checkbox" name="foo[]"/>
Następnie po stronie serwera, używając małego algorytmu, możesz uzyskać coś więcej niż HTML powinien zapewnić.
To będzie surowe wejście
Funkcja powróci
źródło
Mam stronę (formularz), która dynamicznie generuje pole wyboru, więc te odpowiedzi były bardzo pomocne. Moje rozwiązanie jest bardzo podobne do wielu tutaj, ale nie mogę przestać myśleć, że łatwiej jest je wdrożyć.
Najpierw ustawiam ukryte pole wprowadzania zgodnie z moim polem wyboru, tj
Teraz, jeśli wszystkie
checkboxes
zostaną odznaczone, wartości zwrócone przez ukryte pole zostaną wyłączone.Na przykład tutaj, z pięcioma dynamicznie wstawionymi polami wyboru, tworzą
POSTS
następujące wartości:To pokazuje, że tylko trzecie i czwarte pole wyboru to
on
lubchecked
.Zasadniczo lub ukryte pole wejściowe wskazuje po prostu, że wszystko jest wyłączone, chyba że pod indeksem wyłączenia znajduje się „on” , co daje indeks, którego potrzebujesz bez jednego wiersza kodu po stronie klienta.
.
źródło
Podobnie jak wariant ASP.NET, z tym wyjątkiem, że ukryte dane wejściowe o tej samej nazwie znajdują się przed rzeczywistym polem wyboru (o tej samej nazwie). Zostaną wysłane tylko ostatnie wartości. W ten sposób, jeśli pole jest zaznaczone, wówczas wysyłana jest jego nazwa i wartość „on”, natomiast jeśli nie jest zaznaczone, nazwa odpowiedniego ukrytego wejścia i dowolna wartość, jaką chcesz mu nadać, zostanie wysłana. Na koniec dostaniesz tablicę $ _POST do odczytu, ze wszystkimi zaznaczonymi i niezaznaczonymi elementami, wartościami „on” i „false”, bez duplikatów kluczy. Łatwy do przetworzenia w PHP.
źródło
Mając ten sam problem z niezaznaczonymi polami wyboru, które nie będą wysyłane przy przesyłaniu formularzy, wyszedłem z innym rozwiązaniem niż dublowanie elementów pola wyboru.
Pobieranie wszystkich niezaznaczonych pól wyboru z
źródło
Rozwiązałem problem z tym kodem:
Formularz HTML
i funkcję javascript, zmieniając formularz wartości pola wyboru:
a serwer sprawdził, czy wpis danych jest „włączony” czy „wyłączony”. Użyłem Playframework Java
źródło