Есть несколько вопросов, связанных с радиостанциями и блоками кнопок 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 этого, по-видимому, неполна, по крайней мере, в моих глазах - объяснение). Скажем, я бы хотел настроить прослушиватель для второй метки /checkbox/button и определить, активна ли/отмечена кнопка/флажок/кнопка/я установил следующий код:
$('#label2').on('click', function(){
console.log($(this).hasClass('active'));
});
Я ожидаю, что приведенный выше код будет, когда кнопка была нажата, чтобы "активировать" кнопку label/checkbox/, чтобы напечатать true на консоли. Он выводит false. Это происходит потому, что прослушиватель .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 - c'mon Bootstrap! Почему даже использовать флажок, если состояние инертное? Похоже на довольно ясный случай несогласованности, когда <label> может иметь класс active, но <checkbox> не имеет атрибута checked... (это то, что я имел в виду ранее, когда я сказал, что Javascript реализация этого, по-видимому, неполна)
На данный момент мне просто нужно инвертировать логику в моем обработчике, но это просто раздражает меня. В целом, я думаю, мой вопрос: Кто-нибудь испытал это и нашел лучшее решение (все еще просто используя jQuery и Bootstrap, нет альтернативных библиотек), которые не требуют инвертированной логики?
EDIT. Ниже приведено решение, но мой комментарий о <checkbox>, не имеющий атрибута checked, породил несколько другой вопрос/обсуждение. Можно выполнить запрос .is(':checked') на вложенном <checkbox>, чтобы получить правильное состояние в обработчике .on('change'), но если вы проверите DOM, этот атрибут никогда не будет установлен на <checkbox>. Меня беспокоит, что DOM не отражает состояние, которое я получаю с запросом .is(':checked')...
EDIT2. Еще одна странная причуда, которую я обнаружил, заключается в том, что с отъездом с помощью <button> для группы радио или группы флажков необходимо принять различные меры для извлечения и изменения некоторых из свойства кнопок "faux". В моем случае я хотел бы отключить/включить кнопки на основе различных пользовательских входов, но установка свойства disabled этого флажка не работает:
$('input').prop('disabled', true) //Doesn't render the button disabled
Это потому, что кнопка теперь фактически является <input>, содержащейся в <label>, которая написана как кнопка, поэтому теперь disabled необходимо установить на <label>. Это немного расстраивает, но не слишком сложно сделать с помощью метода jQuery .parent() (потому что я сохраняю указатель на ввод). Недовольство вызывает тот факт, что в случае кнопки я могу использовать метод .prop('disabled', true/false) для изменения свойства disabled, , но я не могу сделать то же самое, потому что теперь это <label>.
Это описано в документации jQuery attr (http://api.jquery.com/attr/), "Чтобы получить и изменить свойства DOM, такие как отмеченные, выбранные, или отключенное состояние элементов формы, используйте метод .prop()." A <button>, по-видимому, является элементом формы, тогда как a <label> не является (хотя я бы подумал, что это будет так). Теперь в моем коде я должен сознательно не забывать использовать .prop('disabled', true/false) для реальных кнопок и .attr('disabled', true/false) для кнопок faux. Я бы хотел, чтобы Bootstrap рассуждал о том, чтобы уйти с обычных кнопок... (и, возможно, так, что такие вещи, как .is(':checked'), могут работать, но это обязательно делает для некоторых других головных болей...)
EDIT3. Просто узнал, что после "нового соглашения" использования <input>, завернутого в <label>, не требуется. Вы все равно можете использовать кнопку, и ожидается, что будет происходить радио /checkbox... так много головной боли для ничего. Почему бы вам не показать оба варианта, Bootstrap???