如果在表单提交时勾选复选框输入值数据,浏览器是否仅发送复选框输入值数据是标准行为?

如果没有提供值数据,默认值是否总是“on”?

假设上述假设是正确的,那么所有浏览器的这种行为是否一致呢?


当前回答

在你的帖子中

 'your_field': your_field.is(':checked'),

其他回答

浏览器只发送复选框输入是标准行为吗 价值数据是否在表单提交时进行检查?

是的,因为否则就没有可靠的方法来确定复选框是否被选中(如果它改变了值,则可能存在这样的情况,即当您选中的期望值与它被交换到的值相同时)。

如果没有提供值数据,默认值是否总是“on”?

其他答案证实“开”是默认值。但是,如果你对值不感兴趣,可以使用:

if (isset($_POST['the_checkbox'])){
    // name="the_checkbox" is checked
}

是的,标准行为是仅在选中复选框时才发送值。这通常意味着您需要有一种方法来记住您期望在服务器端出现哪些复选框,因为并非所有数据都是从表单返回的。

默认值总是“on”,这应该在不同浏览器中保持一致。

这在W3C HTML 4推荐中包含:

复选框(和单选按钮)是可以切换的开/关开关 由用户决定。当控制元件被检查时,开关是“打开”的 属性已设置。当提交表单时,只有“on”复选框 控制可以成功。

输入类型="hidden" name="is_main" value="0"

输入类型="checkbox" name="is_main" value="1"

所以你可以像我在应用程序中那样控制。 如果检查成功,则发送值1,否则为0

以上答案没有一个让我满意。 我发现最好的解决方案是在每个具有相同名称的复选框输入之前包含一个隐藏输入。

<输入类型=“隐藏”

<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',
)  

从HTML 4规范,应该是一致的几乎所有浏览器:

http://www.w3.org/TR/html401/interact/forms.html#checkbox

复选框(和单选按钮)是可以切换的开/关开关 由用户决定。当控制元件被检查时,开关是“打开”的 属性已设置。当提交表单时,只有“on”复选框 控制可以成功。

成功的定义如下:

一个成功的控件是“有效的”提交。每一个成功的 控件的控件名与其当前值配对,作为 提交的表单数据集。必须定义一个成功的控件 在FORM元素中,并且必须有控件名。