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

У меня есть эта форма с вопросами, в которых используются флажки и радиокнопки, для вопросов флажков может быть указано максимальное количество флажков, необходимых для перехода к следующему вопросу. Для флажков и переключателей я использую кнопки начальной загрузки.

https://getbootstrap.com/docs/4.1/components/buttons/

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

Любая подсказка о том, как я могу сделать эту работу? Я пробовал.click вместо.change, но потом, когда я получаю проверенное количество, я получаю неправильный номер.

Автор сценария:

function checkboxHandler(aThis){
    if($('.pro-block.pb-active').find('.proanalysecheck:checked').length > $(aThis).data('max')) {
        if($(aThis).prop('checked') == true){
            $(aThis).parent('label').button('toggle');
        }
    }
}


$('#frmProinvite .proanalysecheck').change( function(e) {
    checkboxHandler(this);
});

.pb-block.pb-active это текущий вопрос div и .proanalysecheck это входной класс.

1 ответ

Решение

Как насчет использования флага, который указывает, что изменение вызвано достижением максимальных значений? Это должно сделать работу.

var changeByMaxReached = false; 
function checkboxHandler(aThis){
    if(!changeByMaxReached && $('.pro-block.pb-active').find('.proanalysecheck:checked').length > $(aThis).data('max')) {
        if($(aThis).prop('checked') == true){
            changeByMaxReached = true;
            $(aThis).parent('label').button('toggle');
        }
    }
}


$('#frmProinvite .proanalysecheck').change( function(e) {
    if (!changeByMaxReached) {
        checkboxHandler(this);
    } 
    changeByMaxReached = false;
});
Другие вопросы по тегам