草庐IT

javascript - Twitter Bootstrap 获取复选框按钮组的状态

coder 2024-05-14 原文

有几个与 Twitter Bootstrap 的按钮单选/复选框组相关的问题,但似乎没有一个是新的 Bootstrap 约定(我使用的是 v3.3.4)或我正在解决我的问题。

旧约定是声明 <div class="btn-group">那包围了许多<button>的,而且周围的div也有data-toggle buttons-checkbox 的任一属性或 buttons-radio看起来像这样:

<div class="btn-group" data-toggle="buttons-checkbox">
    <button type="button" class="btn btn-primary">Btn 1</button>
    <button type="button" class="btn btn-primary">Btn 2</button>
    <button type="button" class="btn btn-primary">Btn 3</button>
</div>

但是,创建这些类型的组的约定已更改,如按钮的 Bootstrap Javascript 页面 ( http://getbootstrap.com/javascript/#buttons-checkbox-radio ) 所示:
<div class="btn-group" data-toggle="buttons">
  <label class="btn btn-primary active">
    <input type="checkbox" autocomplete="off" checked> Checkbox 1 (pre-checked)
  </label>
  <label class="btn btn-primary">
    <input type="checkbox" autocomplete="off"> Checkbox 2
  </label>
  <label class="btn btn-primary">
    <input type="checkbox" autocomplete="off"> Checkbox 3
  </label>
</div>

如您所见,按钮现在实际上是带有 checkbox 类型的子输入字段的标签。或 radio样式看起来像按钮。

我想设置一个.on('click')捕获刚刚被点击的按钮状态的事件,但是接下来的逻辑奇怪地倒退了(并且这个的 Javascript 实现似乎是不完整的,至少在我看来 - 解释如下)。说,我想为第二个标签/复选框/按钮设置一个监听器,并确定标签/复选框/按钮是否处于事件/选中状态 - 我将设置以下代码:
$('#label2').on('click', function(){
  console.log($(this).hasClass('active'));
});

我希望上面的代码在按下按钮以“激活”标签/复选框/按钮时打印 true到控制台。 它打印错误。 这是因为 .on('click')监听器在按钮状态更改之前被触发,因此我必须根据按钮状态反转我想要采取的任何操作的逻辑。对我来说似乎是倒退。 (jsFiddle 插图:http://jsfiddle.net/mmuelle4/qq816po7/)

还有一些其他库可以通过“明智”的方式捕捉到这一点,例如 Bootstrap Switch 库 ( http://www.bootstrap-switch.org/ )。 Bootstrap Switch 库有一个 switchChanged单击后捕获开关更改的事件,但提供单击后按钮/复选框的状态。

我以为我通过注册 .on('change') 找到了解决方案处理程序而不是 .on('click')处理程序,但我得到了相同的结果。

另外,如果 <label>单击后,嵌套 <checkbox>从不设置/取消设置 checked属性——来吧 Bootstrap!如果状态是惰性的,为什么还要使用复选框?似乎是一个非常明显的不一致案例,其中 <label>可以有一个类 active<checkbox>没有checked属性集...(这就是我之前说这个的Javascript实现看似不完整时的意思)

现在,我只需要在我的处理程序中反转逻辑,但这只是让我感到厌烦。总的来说,我想我的问题是 有没有人经历过这个并找到了一个不需要反向逻辑的更好的解决方案(仍然只使用 jQuery 和 Bootstrap,没有替代库)?

编辑 :下面有一个解决方案,但我对 <checkbox> 的评论没有 checked属性产生了一个略有不同的问题/讨论。一个可以执行 .is(':checked')查询嵌套 <checkbox>.on('change') 中获得正确的状态处理程序,但是如果您检查 DOM,该属性实际上从未在 <checkbox> 上设置过.让我烦恼的是 DOM 没有反射(reflect)我将收到的状态 .is(':checked')询问...

编辑2 :我发现的另一个奇怪的怪癖是,随着使用 <button> 的离开对于单选按钮或复选框按钮组,必须采取不同的措施来检索和更改“假”按钮的某些属性。就我而言,我想根据各种用户输入禁用/启用按钮,但设置 disabled复选框的属性不起作用:
$('input').prop('disabled', true) //Doesn't render the button disabled

这是因为按钮现在实际上是 <input>包含在 <label> 中样式为按钮,所以现在 disabled必须在 <label> 上设置.这有点令人沮丧,但用 jQuery 的 .parent() 做起来并不难。方法(因为我正在存储一个指向输入的指针)。令人沮丧的是,在按钮的情况下,我可以使用 .prop('disabled', true/false)更改 disabled 的方法属性(property), 但我不能这样做,因为现在它是 <label> .

这在 jQuery 的 attr 中有描述文档 ( http://api.jquery.com/attr/ ),“要检索和更改 DOM 属性,例如 表单元素 的选中、选中或禁用状态,请使用 .prop() 方法。”一个 <button>显然是一个表单元素,而 <label>不是(虽然我认为会是)。现在,在我的代码中,我必须有意识地记住使用 .prop('disabled', true/false)对于真正的按钮,和 .attr('disabled', true/false)用于人造按钮。我想看看 Bootstrap 与常规按钮不同的原因......(也许是这样的东西 .is(':checked') 可以工作,但它肯定会引起其他一些头痛......)

编辑3 :刚刚了解到遵循使用 <input> 的“新约定”包裹在 <label> 内是 不需要 .您仍然可以使用按钮,并且会出现预期的单选框/复选框行为......如此令人头疼。你为什么不炫耀这两个选项,Bootstrap???

最佳答案

引导带已经负责在被转换的原始元素上触发事件。所以你不必担心检查类(class)。

您所要做的就是为原始输入设置事件并检查原始输入的状态

$('label > input[type=checkbox]').on('change', function () {
    console.log($(this).is(':checked'));
});

演示 :http://jsfiddle.net/qq816po7/1/

关于javascript - Twitter Bootstrap 获取复选框按钮组的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29655237/

有关javascript - Twitter Bootstrap 获取复选框按钮组的状态的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby-on-rails - 跳过状态机方法的所有验证 - 2

    当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested

  3. ruby - 简单获取法拉第超时 - 2

    有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url

  4. ruby - 从 Ruby 中的主机名获取 IP 地址 - 2

    我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge

  5. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

  6. ruby-on-rails - 获取 inf-ruby 以使用 ruby​​ 版本管理器 (rvm) - 2

    我安装了ruby​​版本管理器,并将RVM安装的ruby​​实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby​​。有没有办法让emacs像shell一样尊重ruby​​的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el

  7. Ruby 从大范围中获取第 n 个项目 - 2

    假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit

  8. ruby - 字符串文字中的转义状态作为 `String#tr` 的参数 - 2

    对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一

  9. ruby - Net::HTTP 获取源代码和状态 - 2

    我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

  10. ruby - 没有类方法获取 Ruby 类名 - 2

    如何在Ruby中获取BasicObject实例的类名?例如,假设我有这个:classMyObjectSystem我怎样才能使这段代码成功?编辑:我发现Object的实例方法class被定义为returnrb_class_real(CLASS_OF(obj));。有什么方法可以从Ruby中使用它? 最佳答案 我花了一些时间研究irb并想出了这个:classBasicObjectdefclassklass=class这将为任何从BasicObject继承的对象提供一个#class您可以调用的方法。编辑评论中要求的进一步解释:假设你有对象

随机推荐