我一直在根据此CSS-tricks文章中的演示实现三态复选框。但是,我做了一个小的更改,我也通过$(el).val()设置了输入值,因此0是不确定的,并且1被检查了:

inputs.on('click.tristate', function () {
    el = $(this);
    switch (el.data('checked')) {

        // unchecked, going indeterminate
        case -1:
            el.data('checked', 0);
            el.val(0)
            el.prop('indeterminate', true);
            break;

            // indeterminate, going checked
        case 0:
            el.data('checked', 1);
            el.val(1);
            el.prop('indeterminate', false);
            el.prop('checked', true);
            break;

            // checked, going unchecked
        default:
            el.data('checked', -1);
            el.prop('indeterminate', false);
            el.prop('checked', false);
    }
});


这可以按预期的方式工作-单击它可以在状态之间进行切换,并且在发送表单时,它将不确定地发送为0,将其发送为1(并且未选中它根本不会发送)。

现在我在设置初始值时遇到了麻烦。我添加了这个:

inputs.each(function () {
    if ($(this).data('checked') === 0) {
        this.indeterminate = true;
        this.value = 0;
        return;
    }
    if (this.checked) $(this).data('checked', 1);
    else              $(this).data('checked', -1);
});


它在视觉上有效,但是如果您运行$('form').serialize(),则会看到它将不确定的输入视为未选中(即未添加)。如果单击几次,然后进行完整循环,它将添加它。那有什么呢?

我做了一个JSFiddle Demo来演示行为。我尝试了多种不同的方法来定义初始值,但似乎无法使不确定字段作为需要添加的内容。

我能做什么?

最佳答案

我猜我发现关于HTML属性的是BUG> Here

<input type="checkbox" name="cb2" value='0' data-checked='0' checked="false" class="tristate-checkbox" />


关于复选框值和序列化的问题,有一个explanation

通常以一种方式序列化句柄复选框:checked = false等于不显示,而checked = true等于显示某些内容。


  jQuery序列化紧密模仿标准格式
  由浏览器序列化,然后附加到查询字符串或
  请求中的POST正文。未选中的复选框不包含在
  浏览器,这真的很有意义,因为它们具有布尔状态

07-24 09:50
查看更多