引导复选框/单选按钮不会更改 <input> 值

Posted

技术标签:

【中文标题】引导复选框/单选按钮不会更改 <input> 值【英文标题】:Bootstrap checkbox/radio buttons do not change <input> value 【发布时间】:2013-08-25 21:25:03 【问题描述】:

javascript page for Bootstrap 展示了一些很好的按钮使用来设置复选框和单选框的样式。例如,对于一个复选框,我可能会写

<div class="btn-group" data-toggle="buttons">
  <label class="btn btn-primary">
    <input type="checkbox"> Option 1
  </label>
</div>

然而,库实际上并没有改变底层&lt;input&gt; 字段的值——它只是改变&lt;label&gt; 字段是否具有active 类。我原以为它会更改复选框上的checked 属性。显然,我不只是将其配置错误——这就是 Bootstrap 站点上的示例的工作方式。

这实际上是预期的行为吗?如果是这样,它似乎毫无用处,因为人们会想要使用复选框字段。如果没有,我该如何正确配置 Bootstrap 复选框/单选按钮?

【问题讨论】:

目前他们并没有真正改变它...github.com/twbs/bootstrap/issues/14137 添加属性“name”允许发布复选框数据,如果这是您所希望的。 【参考方案1】:

您似乎错过了“激活”btn-group (documentation) 的调用。这是a demo 的工作:

<form id='testForm'>
    <div class="btn-group" data-toggle="buttons">
        <label class="btn btn-primary">
            <input type="checkbox" name='Option' value='1' />Option 1</label>
    </div>
</form>
<button class='btn' id='actionSubmit'>Submit</button>

<script>
    $('#actionSubmit').on('click', function (e) 
        e.preventDefault();
        alert($('#testForm').serialize());
    );

    $('.btn-group').button();
</script>

【讨论】:

其实没必要。数据属性会自行触发库。删除演示中的最后一行 JS ($('.btn-group').button()),它仍然有效。【参考方案2】:

输入上的checked 属性没有被修改,因为这不是在选中复选框输入时发生的变化——checked DOM 属性是变化的(true 或 false),Bootstrap 会正确处理这个(您可以在 Firebug 中检查元素,并在切换它们时查看 DOM 属性更改)。 checked 属性仅用于确定初始渲染 DOM 时的默认值。

如果你碰巧在 js/jQuery 中使用复选框/收音机,请记住这一点!如果您需要以编程方式检查复选框或单选按钮,$('input').attr('checked', 'checked'); 将无法完成工作。 $('input').prop('checked', true); 是你需要的。

这不是 Bootstrap 按钮的特殊行为,这是所有复选框/收音机的工作方式。

编辑:Firebug screenshot

编辑 2:添加来自 cmets 的文本,因为它似乎很有帮助。

【讨论】:

有趣!我以前没有意识到这种区别。 @jameshfisher 如果您碰巧使用复选框/收音机做任何 js/jQuery,请记住这一点!如果您需要以编程方式检查复选框或单选按钮,$('input').attr('checked', 'checked'); 将无法完成工作。 $('input').prop('checked', true); 是您所需要的。 @tomaroo 你上面的评论把我从 3 天的拉头发中救了出来。使用$('input').attr('checked', 'checked'); 而不是$('input').prop('checked', true);。救命稻草!【参考方案3】:

我正在为 MVC.NET 这样做,以防万一有人需要它:

@       
    var removeSelected = Model.Remove == true ? "active" : "";
    var buttonText = Model.Remove == true ? "Add" : "Remove";



    @html.HiddenFor(model => model.Remove)
    <div class="editor-field">
        <div class="btn-group" data-toggle="buttons-checkbox">
              <button type="button" id="RemoveButton" class="btn btn-primary @removeSelected" onclick="toggle();">@buttonText</button>  
        </div
    </div>


 function toggle() 
            var value = $("#Remove").val();
            if (value == "False") 
                $("#Remove").val("True");
                $("#RemoveButton").text("Add");
            
            else 
                $("#Remove").val("False");
                $("#RemoveButton").text("Remove");
                        
        

最后别忘了添加 bootstrap js 引用。

【讨论】:

以上是关于引导复选框/单选按钮不会更改 <input> 值的主要内容,如果未能解决你的问题,请参考以下文章

引导单选按钮文本组

如何在引导表中设置单选按钮或复选框的样式?

Google Chrome 中的引导复选框和单选按钮标签问题

Twitter引导单选按钮不起作用

单击事件不在引导单选按钮组中触发

如果选中单选按钮,如何选中复选框