フォーム送信時にチェックされている場合にのみチェックボックス入力値データを送信するのはブラウザの標準的な動作ですか?
値データが提供されていない場合、デフォルト値は常に "on"ですか?
上記が正しいと仮定して、すべてのブラウザでこの一貫した動作はありますか?
はい、標準の動作では、チェックボックスがチェックされている場合にのみ値が送信されます。これは通常、すべてのデータがフォームから返されるわけではないため、サーバー側でどのチェックボックスを期待しているかを覚えておく必要があることを意味します。
デフォルト値は常に "on"です。これはブラウザ間で一貫しているはずです。
これは W3C HTML 4勧告 でカバーされています。
チェックボックス(およびラジオボタン)は、ユーザーが切り替えることができるオン/オフスイッチです。制御要素のchecked属性が設定されているとき、スイッチは "on"です。フォームが送信されると、 "on"チェックボックスコントロールのみが成功する可能性があります。
HTMLでは、各<input />
要素は単一の(一意ではない)名前と値のペアに関連付けられます。このペアは、<input />
が「成功」した場合にのみ、後続のリクエスト(この場合、POSTリクエストボディ)で送信されます。
したがって、<form>
DOMにこれらの入力がある場合:
<input type="text" name="one" value="foo" />
<input type="text" name="two" value="bar" disabled="disabled" />
<input type="text" name="three" value="first" />
<input type="text" name="three" value="second" />
<input type="checkbox" name="four" value="baz" />
<input type="checkbox" name="five" value="baz" checked="checked" />
<input type="checkbox" name="six" value="qux" checked="checked" disabled="disabled" />
<input type="checkbox" name="" value="seven" checked="checked" />
<input type="radio" name="eight" value="corge" />
<input type="radio" name="eight" value="grault" checked="checked" />
<input type="radio" name="eight" value="garply" />
サーバーに送信されるこれらの名前と値のペアを生成します。
one=foo
three=first
three=second
five=baz
eight=grault
次のことに注意してください。
two
およびsix
は、disabled
属性が設定されているため除外されました。three
が2回送信されました。four
はcheckbox
ではないchecked
であるため送信されませんでしたsix
属性の優先順位が高いため、checked
にもかかわらず、disabled
は送信されませんでした。seven
にはname=""
属性が送信されていないため、送信されません。あなたの質問に関して:チェックされていないチェックボックスは、名前と値のペアがサーバーに送信されないことがわかりますが、同じ名前を共有する他の入力が送信されます。
ASP.NET MVCのようなフレームワークは、次のように、レンダリングされたHTML内のすべてのcheckbox
入力をhidden
入力と(驚くほど)ペアリングすることにより、この問題を回避します。
@Html.CheckBoxFor( m => m.SomeBooleanProperty )
レンダリング:
<input type="checkbox" name="SomeBooleanProperty" value="true" />
<input type="hidden" name="SomeBooleanProperty" value="false" />
ユーザーがチェックボックスをチェックしない場合、以下がサーバーに送信されます。
SomeBooleanProperty=false
ユーザーがチェックボックスをオンにすると、両方が送信されます。
SomeBooleanProperty=true
SomeBooleanProperty=false
ただし、サーバーは=false
バージョンを参照するため、=true
バージョンを無視します。したがって、=true
バージョンが表示されない場合、チェックボックスがレンダリングされ、ユーザーがチェックしなかったと判断できますit-SomeBooleanProperty
入力がまったくレンダリングされないのに対して。
チェックボックスがチェックされていない場合は、フォーム送信時に送信されたデータには寄与しません。
HTML5セクション 4.10.22.4フォームデータセットの作成 フォームデータの作成方法を説明します。
次の条件のいずれかが満たされている場合は、この要素についてこれらのサブステップをスキップしてください。[...]
Field要素は、type属性がCheckbox状態にあり、checkednessがfalseである入力要素です。
on
がない場合は、デフォルト値のvalue
が指定されます。
そうではなく、field要素がtype属性がCheckbox状態またはRadio Button状態にあるinput要素である場合は、さらに次のネストしたサブステップを実行します。
Field要素にvalue属性が指定されている場合は、valueをその属性の値とします。それ以外の場合は、valueを文字列 "on"にします。
このように、チェックされていないチェックボックスはフォームデータ構築中にスキップされます。
HTML4 の下でも同様の動作が必要です。これは、準拠しているすべてのブラウザからこの動作を期待することが合理的です。
チェックボックスがチェックされている場合に限り、チェックボックスは値 'on'を転記します。あなたが隠し入力を使用することができますキャッチチェックボックス値に夢中
JS:
var chk = $('input[type="checkbox"]');
chk.each(function(){
var v = $(this).attr('checked') == 'checked'?1:0;
$(this).after('<input type="hidden" name="'+$(this).attr('rel')+'" value="'+v+'" />');
});
chk.change(function(){
var v = $(this).is(':checked')?1:0;
$(this).next('input[type="hidden"]').val(v);
});
HTML:
<label>Active</label><input rel="active" type="checkbox" />
フォーム送信時にチェックされている場合にのみチェックボックス入力値データを送信するのはブラウザの標準的な動作ですか?
そうでなければ、チェックボックスが実際にチェックされたかどうかを判断する確実な方法がないので(値が変更された場合、チェックされた場合の希望の値がチェックされた値と同じ場合に交換)。
値データが提供されていない場合、デフォルト値は常に "on"ですか?
他の回答では、 "on"がデフォルトであることを確認しています。ただし、値に興味がない場合は、次のようにしてください。
if (isset($_POST['the_checkbox'])){
// name="the_checkbox" is checked
}
HTML 4の仕様から、ほとんどすべてのブラウザで一貫しているはずです。
http://www.w3.org/TR/html401/interact/forms.html#checkbox
チェックボックス(およびラジオボタン)は、ユーザーが切り替えることができるオン/オフスイッチです。制御要素のchecked属性が設定されているとき、スイッチは "on"です。フォームが送信されると、 "on"チェックボックスコントロールのみが成功する可能性があります。
成功は次のように定義されています。
成功したコントロールは送信に対して "有効"です。コントロールが成功するたびに、送信されたフォームデータセットの一部として、コントロール名と現在の値がペアになります。成功したコントロールはFORM要素内で定義され、コントロール名を持たなければなりません。
入力タイプ= "隠し" name = "is_main"値= "0"
入力タイプ= "チェックボックス"名前= "is_main"値= "1"
だから私はアプリケーションでやったようにあなたはこのように制御することができます。チェックした場合は値1、それ以外の場合は0を送信
上記の答えのどれも私を満足させませんでした。私は最善の解決策は隠された入力を含めることです---同じ名前を持つ各チェックボックス入力before。
<input type="hidden" name="foo[]" value="off"/>
<input type="checkbox" name="foo[]"/>
それからサーバー側では、ちょっとしたアルゴリズムを使って、HTMLのようなものを得ることができます。
function checkboxHack(array $checkbox_input): array
{
$foo = [];
foreach($checkbox_input as $value) {
if($value === 'on') {
array_pop($foo);
}
$foo[] = $value;
}
return $foo;
}
これは生の入力になります
array (
0 => 'off',
1 => 'on',
2 => 'off',
3 => 'off',
4 => 'on',
5 => 'off',
6 => 'on',
),
そして関数は戻ります
array (
0 => 'on',
1 => 'off',
2 => 'on',
3 => 'on',
)
チェックボックスを動的に生成するページ(フォーム)があるので、これらの回答は非常に役立ちました。私の解決策はここの多くのものと非常に似ていますが、私はそれが実行するのがより簡単であると考えるのを助けることができません。
まず私のチェックボックスに合わせて隠し入力ボックスを配置します。
<td><input class = "chkhide" type="hidden" name="delete_milestone[]" value="off"/><input type="checkbox" name="delete_milestone[]" class="chk_milestone" ></td>
すべてのcheckboxes
が選択されていない場合、hiddenフィールドによって返される値はすべてoffになります。
たとえば、ここに動的に挿入された5つのチェックボックスがあり、フォームPOSTS
には次の値があります。
'delete_milestone' =>
array (size=7)
0 => string 'off' (length=3)
1 => string 'off' (length=3)
2 => string 'off' (length=3)
3 => string 'on' (length=2)
4 => string 'off' (length=3)
5 => string 'on' (length=2)
6 => string 'off' (length=3)
これは、3番目と4番目のチェックボックスだけがon
またはchecked
であることを示しています。
基本的に、ダミーまたは非表示の入力フィールドは、offインデックスの下に"on"がない限り、すべてがオフであることを示しています。
。
ASP.NETの変種と同じですが、実際のチェックボックスの前に(同じ名前の)隠し入力を同じ名前で入れます。最後の値だけが送信されます。このようにしてボックスがチェックされるとその名前と値 "on"が送信され、チェックされていない場合は対応する隠し入力の名前とあなたがそれに与えたい値を送信します。最後に、$ _POST配列に、チェックされている要素とチェックされていない要素がすべて含まれ、 "on"と "false"の値、重複するキーは含まれません。 PHPで簡単に処理できます。
フォームの送信時に送信されない未チェックのチェックボックスについても同じ問題を抱えているので、チェックボックスの項目をミラー化する以外の解決策を考え出しました。
チェックされていないチェックボックスをすべて取得する
var checkboxQueryString;
$form.find ("input[type=\"checkbox\"]:not( \":checked\")" ).each(function( i, e ) {
checkboxQueryString += "&" + $( e ).attr( "name" ) + "=N"
});