Twitter Bootstrap 3 рушится, когда установлен флажок

Аккордеон должен свернуть на отмеченном флажке. И должен быть скрыт, когда он не контролируется.

Вот код: http://jsfiddle.net/UwL5L/2/

Почему не проверяет?

            <div class="panel-group driving-license-settings" id="accordion">
                <div class="panel panel-default">
                    <div class="panel-heading">
                          <h4 class="panel-title">
                            <a data-toggle="collapse" data-parent="#accordion" href="#collapseOne">
                                <input type="checkbox" value=""> I have Driver License  
                            </a>
                          </h4>
                    </div>
                    <div id="collapseOne" class="panel-collapse collapse in">
                        <div class="panel-body">
                            <div class="driving-license-kind">
                                <div class="checkbox">
                                    <input type="checkbox" value="">A
                                </div>
                                <div class="checkbox">
                                    <input type="checkbox" value="">B
                                </div>
                                <div class="checkbox">
                                    <input type="checkbox" value="">C
                                </div>
                                <div class="checkbox">
                                    <input type="checkbox" value="">D
                                </div>
                                <div class="checkbox">
                                    <input type="checkbox" value="">E
                                </div>                                                                                                          
                            </div>
                        </div>
                    </div>
                </div>
            </div>

person Dj.Sunrise    schedule 18.03.2014    source источник
comment
Не хотите уточнить?   -  person aborted    schedule 18.03.2014


Ответы (8)


ОБНОВЛЕНИЕ: Ниже приведен лучший ответ... Здесь -> *


JS (Fiddle: http://jsfiddle.net/h44PJ /):

$('.collapse').collapse();

// Don't collapse on checkbox click
$('.panel-heading h4 a input[type=checkbox]').on('click', function(e) {
    e.stopPropagation();
});

// Cancel show event if not checked
$('#collapseOne').on('show.bs.collapse', function(e) {
    if(!$('.panel-heading h4 a input[type=checkbox]').is(':checked'))
    {
        return false;
    }
});

ОБНОВЛЕНИЕ (Fiddle: http://jsfiddle.net/h44PJ/567/):

$('.collapse').collapse();

$('.panel-heading h4 a input[type=checkbox]').on('click', function(e) {
    e.stopPropagation();
    $(this).parent().trigger('click');   // <---  HERE
});

$('#collapseOne').on('show.bs.collapse', function(e) {
    if(!$('.panel-heading h4 a input[type=checkbox]').is(':checked'))
    {
        return false;
    }
});
person BENARD Patrick    schedule 18.03.2014
comment
Да, проверяет. Но это не работает как коллапс. Как я уже сказал, он должен свернуть, установив флажок. - person Dj.Sunrise; 18.03.2014
comment
@YenneInfo Не могли бы вы взглянуть на мой вопрос, он почти такой же, как этот? stackoverflow.com/questions/22480524 / - person bambi; 14.02.2015
comment
@bambiinela поделитесь ссылкой на свой вопрос, пожалуйста - person BENARD Patrick; 14.02.2015
comment
Извините, неправильную ссылку вставил. Вот мой вопрос: stackoverflow.com/questions/28517366/ - person bambi; 14.02.2015
comment
если дважды быстро щелкнуть по флажку, область отобразится, но флажок будет снят. - person BlackICE; 04.06.2015
comment
Вы также можете установить флажок, развернуть его, затем снять флажок, и он останется показанным. - person WolfieeifloW; 27.07.2018
comment
@WolfieeifloW Я предлагаю вам прочитать часть «обновление» ... Она решает проблему, о которой вы говорите ... - person BENARD Patrick; 27.07.2018

Вот мое решение, которое работает, добавляя оболочку метки к флажку вместо гиперссылки:

<div class="checkbox">
    <label data-toggle="collapse" data-target="#collapseOne">
        <input type="checkbox"/> I have Driver License  
    </label>
</div>

http://jsfiddle.net/L0h3s7uf/1/

person Gavin    schedule 23.03.2015
comment
ИМО, это лучший ответ здесь. Это приводит к наименьшему объему написания кода, сворачиванию правильных элементов и дает корректно работающий флажок, который не принимает поведение и стиль, подобный ссылке. Кажется, это единственный ответ, который действительно решает проблему ОП. Рад, что я тоже нашел его, потому что это решило и мою проблему. - person digijim; 01.05.2015
comment
Нет, если дважды быстро щелкнуть по флажку, область отобразится, но флажок будет снят. - person BlackICE; 04.06.2015
comment
@BlackICE тогда не нажимай так быстро. Это отличный ответ! - person SpoiledTechie.com; 16.02.2017
comment
@SpoiledTechie.com сообщить моим пользователям и QA, что - person BlackICE; 18.02.2017

Вам даже не нужно инициализировать .collapse. Просто измените заголовок на:

<h4 class="panel-title">
  <input type="checkbox" value="" data-toggle="collapse" data-target="#collapseOne" /> I have Driver License	
</h4>

person Igor Mizak    schedule 27.11.2016
comment
это кажется наиболее логичным ответом, который работает, по крайней мере, в Firefox 61.0.1 (чего я не могу сказать об обходном пути обертывания в метке выше) - однако я предполагаю, что указание переключателя данных и цели данных было не всегда работает для типа ввода = флажок - person hello_earth; 06.09.2019

Посмотри на это. Я сделал это и работает нормально.

<script> 
        $(function () {

            if($('#id_checkbox').prop('checked'))
            {
                $('#id_collapse').collapse();
            }
        });

</script>
person LegustasBR    schedule 17.04.2015

Я разработал причудливый флажок для сворачивания содержимого аккордеона.

<h4 class="panel-title">
    <label data-toggle="collapse" data-target="#collapseOne" class="control-toggle">
        <input type="checkbox" />
        <div class="toggle-button"></div>
    </label>
    I have Driver License   
</h4>

Надеюсь вам, ребята, нравится это :-)

Ссылка на скрипку: http://jsfiddle.net/ajay1008/fkrehhna/

person Ajay.R1008    schedule 28.02.2017

Я столкнулся с той же проблемой и нашел ответ в этом видео: http://www.lynda.com/Bootstrap-tutorials/Adding-check-box-using-collapse-enhance-usability/161098/176537-4.html Надеюсь, это поможет! Я использую его сейчас, чтобы свернуть полный div под флажком, очень просто. Единственная проблема заключается в том, что если вы дважды щелкнете по нему быстро, он испортится, но обычно этого не происходит.

person Hugo Tognolo    schedule 21.08.2014
comment
Ответы со ссылками, но без подробностей о фактическом решении, не приветствуются на SO. Если ссылка не работает, ваш ответ устаревает. Не говоря уже о том, что для просмотра этого видео требуется хотя бы пробная подписка на Lynda.com. - person digijim; 01.05.2015

Я знаю, что это старый вопрос, но у меня были некоторые проблемы с Firefox и перезагрузкой страниц, из-за которых флажок оставался установленным, а содержимое скрыто - не очень хороший пользовательский опыт.

IMO, проще всего просто добавить/удалить класс для скрытия/отображения контента в зависимости от состояния флажка.

Вот мой пример кода для этого


$(document).ready(function()
{
    $('input[type=checkbox][data-toggle^=toggle]').on('change',
          function (e) {
                let checkbox = $(this);
                let target=$(checkbox.data('target'));
                if (checkbox.is(":checked")) {
                    target.addClass("show");
                    target.addClass("in");
                } else {
                    target.removeClass("show");
                    target.removeClass("in");
                }
            }
    );
    /* Make sure the state is correct - especially after Pressing F5 */
    $('input[type=checkbox][data-toggle^=toggle]').each(
        function (index, elem) {
                let checkbox = $(this);
                let target=$(checkbox.data('target'));
                if (checkbox.is(":checked")) {
                    target.addClass("show");
                    target.addClass("in");
                } else {
                    target.removeClass("show");
                    target.removeClass("in");
                }
        }
    )
});

Как видите, вам нужно просто добавить элементы data-toggle=toggle и data-target к вашему вводу следующим образом:

<input id="license" type="checkbox" data-toggle="toggle" data-target="#collapseOne"><label for="license">I have Driver License</label>

Пример можно найти здесь: https://jsfiddle.net/Kound/z95cLt86/8/

Код работает для начальной загрузки 3 (.in) и начальной загрузки 4 (.show). Адаптируйте его к своим потребностям.

PS: код также работает в сочетании с https://github.com/gitbrent/bootstrap4-toggle/

person Kound    schedule 30.11.2019

person    schedule
comment
Добро пожаловать в StackOverflow. Постарайтесь яснее объяснить, почему это ответ на вопрос. - person Jeroen Heier; 20.08.2019