Привет Я создал функцию javascript, чтобы проверить, превышает ли количество выбранных модулей заданное значение. Поэтому каждый раз, когда вызывается флажок, вызывается функция, и функция проходит через все флажки и вычисляет общее количество, чтобы увидеть, больше ли оно. Но проблема в том, что пользователь проверяет флажок, и если суммарные кредиты больше, чем значение, я хочу установить флажок как checked = false. Но я не могу установить этот флажок. Есть ли функция отмены последнего клика в javascript?Как отменить последний установленный флажок?
ответ
Я знаю, что это не тот ответ, который вы искали, но не лучше ли было бы отключить все снятые флажки, когда будет достигнуто максимальное количество проверок?
Я не думаю, что есть, но вы всегда можете сохранить ссылку на последний флажок, поэтому, когда вам нужно его проверить, у вас есть это прямо там.
Это именно то, что он просит! : P – Seb
Тот же ответ, который вы ему дали, без кода, который вы положили туда xD. –
Не совсем, но вы можете легко подделать его, сохранив последний щелчок. Этот код может не работать дословно, но вы получите идею:
<script>
var last_checked_box;
function onBoxClicked(box) {
if (box.checked) last_checked_box = box;
}
function undoLastBox() {
if (last_checked_box) last_checked_box.checked = false;
}
</script>
<input type="checkbox" id="box1" onClick="onBoxClicked(this)"/>
...
Это сделало бы трюк, но здесь вам не хватает правильных функций для вычисления верхнего предела. Я даю вам полное решение в моем ответе :) – Seb
@ Эрик: зачем сохранять идентификаторы ящиков, а не ссылку на сам ящик, то есть 'last_checked_box = box'? – Christoph
@SebaGR - Ваш ответ лучше для его конкретной ситуации, но кто-то другой, кто может найти этот вопрос в поиске Google, может не иметь одинаковых требований. Я также не хотел предполагать, что он будет использовать jQuery. –
Использование jQuery, вы могли бы сделать что-то вроде:
var MAX_CREDITS = 50; // just as an example
$("input[type=checkbox]").change(function(){
var totalCredits = 0;
$("input[type=checkbox]").each(function(){
// augment totalCredits accordingly to each checkbox.
});
if(totalCredits > MAX_CREDITS){
$(this).removeAttr("checked");
}
});
Если вы никогда не использовали JQuery раньше, это, безусловно, является подобно боль для глаз; но, как вы видите, это очень мощно, и ваша проблема может быть решена в нескольких строках. Я бы порекомендовал вам его изучить и попробовал;)
Предлагаю либо проверить, было ли проверено максимальное количество объектов, либо если true удалил проверку все одним и тем же методом или вы установили значение в какое-то скрытое текстовое поле с идентификатором вашего последнего флажка, чтобы вы могли ссылаться на него снова.
Вот минимальный, но полностью функциональный и JQuery-менее решение:
<script>
function isBox(element) {
return element.form && element.form === document.forms[0] &&
element.nodeName.toLowerCase() === 'input' &&
element.type === 'checkbox';
}
function remaining(dR) {
var field = document.forms[0].elements[0],
value = +field.value;
if(dR) return field.value = value + dR;
else return value;
}
function listener(event) {
var box = (event && event.target) ||
(window.event && window.event.srcElement);
if(isBox(box)) {
if(box.checked) {
if(remaining() > 0)
remaining(-1);
else box.checked = false;
}
else remaining(+1);
}
}
if(document.addEventListener)
document.addEventListener('click', listener, false);
else if(document.attachEvent)
document.attachEvent('onclick', listener);
</script>
<form>
<p>remaining: <input type="text" readonly="readonly" value="2"></p>
<p><input type="checkbox" id="b1"><label for="b1">box1</label></p>
<p><input type="checkbox" id="b2"><label for="b2">box2</label></p>
<p><input type="checkbox" id="b3"><label for="b3">box3</label></p>
</form>
Это не нормальное поведение для любого пользователя ... это не будет служить в качестве удобного опыта. – Seb
@SebaGR: почему? отображая сообщение, информирующее пользователя о том, что общая сумма была достигнута, а затем отключить все непроверенные поля и визуально отметить соответствующие ярлыки, которые отлично подходят для меня. – Christoph
Согласен. Вы можете расширить опыт, вычислив оставшуюся сумму и отключив эти флажки, которые, если флажок будет добавлен, превысят максимальную сумму. Таким образом, если max = 50, и вы выбрали 47, флажок со значением = 5 будет отключен, и флажок со значением = 3 будет по-прежнему доступен :) – Danita