2009-03-11 3 views
3

Привет Я создал функцию javascript, чтобы проверить, превышает ли количество выбранных модулей заданное значение. Поэтому каждый раз, когда вызывается флажок, вызывается функция, и функция проходит через все флажки и вычисляет общее количество, чтобы увидеть, больше ли оно. Но проблема в том, что пользователь проверяет флажок, и если суммарные кредиты больше, чем значение, я хочу установить флажок как checked = false. Но я не могу установить этот флажок. Есть ли функция отмены последнего клика в javascript?Как отменить последний установленный флажок?

ответ

1

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

+0

Это не нормальное поведение для любого пользователя ... это не будет служить в качестве удобного опыта. – Seb

+0

@SebaGR: почему? отображая сообщение, информирующее пользователя о том, что общая сумма была достигнута, а затем отключить все непроверенные поля и визуально отметить соответствующие ярлыки, которые отлично подходят для меня. – Christoph

+0

Согласен. Вы можете расширить опыт, вычислив оставшуюся сумму и отключив эти флажки, которые, если флажок будет добавлен, превысят максимальную сумму. Таким образом, если max = 50, и вы выбрали 47, флажок со значением = 5 будет отключен, и флажок со значением = 3 будет по-прежнему доступен :) – Danita

0

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

+0

Это именно то, что он просит! : P – Seb

+0

Тот же ответ, который вы ему дали, без кода, который вы положили туда xD. –

7

Не совсем, но вы можете легко подделать его, сохранив последний щелчок. Этот код может не работать дословно, но вы получите идею:

<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)"/> 
... 
+0

Это сделало бы трюк, но здесь вам не хватает правильных функций для вычисления верхнего предела. Я даю вам полное решение в моем ответе :) – Seb

+0

@ Эрик: зачем сохранять идентификаторы ящиков, а не ссылку на сам ящик, то есть 'last_checked_box = box'? – Christoph

+0

@SebaGR - Ваш ответ лучше для его конкретной ситуации, но кто-то другой, кто может найти этот вопрос в поиске Google, может не иметь одинаковых требований. Я также не хотел предполагать, что он будет использовать jQuery. –

6

Использование 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 раньше, это, безусловно, является подобно боль для глаз; но, как вы видите, это очень мощно, и ваша проблема может быть решена в нескольких строках. Я бы порекомендовал вам его изучить и попробовал;)

0

Предлагаю либо проверить, было ли проверено максимальное количество объектов, либо если true удалил проверку все одним и тем же методом или вы установили значение в какое-то скрытое текстовое поле с идентификатором вашего последнего флажка, чтобы вы могли ссылаться на него снова.

0

Вот минимальный, но полностью функциональный и 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> 

 Смежные вопросы

  • Нет связанных вопросов^_^