Запретить пользователям снимать последний установленный флажок asp: CheckBoxList с использованием Javascript - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть следующие asp:CheckBoxList, которые получают некоторые значения из базы данных.

<asp:CheckBoxList ID="chkExpType" runat="server" OnChange="javascript: SetFilterValuesToHiddenFields();" AutoPostBack="false" ClientIDMode="Static"></asp:CheckBoxList>

<asp:CheckBoxList ID="chkOrganism" runat="server" OnChange="javascript: SetFilterValuesToHiddenFields();" AutoPostBack="false" ClientIDMode="Static"></asp:CheckBoxList>

Они оба вызывают одну и ту же функцию Javascript, в которой я пытаюсь проверить, является ли выбранный флажок каждого CheckBoxList последним выбранным, чтобы запретить пользователям отменять выбор. Проще говоря, я бы хотел, чтобы в каждом CheckBoxList всегда был хотя бы один флажок. Если в обеих категориях есть хотя бы один выбранный флажок, я бы хотел отправить постбэк. Если пользователи пытаются отменить выбор последней в одной из этих категорий, я хочу предупредить их и снова установить флажок последнего отмененного выбора.

<script>
var lastSelectionForOrganism;
var lastSelectionForExpType;

function SetFilterValuesToHiddenFields() {

    var chkBoxExpType = document.getElementById('<%= chkExpType.ClientID %>');
    var options = chkBoxExpType.getElementsByTagName('input');
    var expTypeValues = "";
    for (var i = 0; i < options.length; i++) {
        if (options[i].checked) {
            expTypeValues = expTypeValues + "," + options[i].value;
        }
    }
    expTypeValues = expTypeValues.substring(1);
    if (expTypeValues.length === 1) {
        lastSelectionForExpType = expTypeValues;
    }

    var chkBoxOrganism = document.getElementById('<%= chkOrganism.ClientID %>');
    var options = chkBoxOrganism.getElementsByTagName('input');
    var organismValues = "";
    for (var i = 0; i < options.length; i++) {
        if (options[i].checked) {
            organismValues = organismValues + "," + options[i].value;
        }
    }
    organismValues = organismValues.substring(1);
    if (organismValues.length === 1) {
        lastSelectionForOrganism = organismValues;
    }


    if (hidfieldSelectedExpType.value && hidfieldSelectedOrganisms.value) {
        var val = "FilterChange";
        setTimeout(function () { __doPostBack(document.forms[0].name, val); }, 1);
    }
    else {
        if (lastSelectionForOrganism) {
            alert("last organism: " + lastSelectionForOrganism);
        }
        if (lastSelectionForExpType) {
            alert("last exp type: " + lastSelectionForExpType);
        }
    }

    return false;
}
</script>

Проблема в том, что в моем коде я могу получить значение отмеченных флажков после щелчка, что означает, что если щелкнуть последний флажок, я получу значение undefined, потому что оно становится непроверенным до того, как я получу его. значение. Надеюсь, мое объяснение не очень грязное. Буду признателен за любые отзывы.

EDIT:

На всякий случай, если это может оказаться полезным для кого-то еще, мне удалось реализовать вышеуказанную логику, используя следующий фрагмент кода:

<script>
var lastCheckedOrganism;

var $checksOrganism = $('input[id^="chkOrganism"]').click(function(e) {
var numCheckedOrganism = $checksOrganism.filter(':checked').length;
if (numCheckedOrganism < 1) {
    alert("At least one organism should be selected.");
    lastCheckedOrganism = this;
    lastCheckedOrganism.checked = true;
    return false;
} else {
    //do postback
}
});
<script>

И точно такой же код для второй asp:CheckBoxList, изменив только следующую часть:

$('input[id^="chkExpType"]')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...