У меня есть следующие 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"]')