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');
}
});