удалить элемент из массива, когда флажок снят - PullRequest
0 голосов
/ 23 ноября 2010

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

if ($('input[name="'+category+'"]:checked'))
    item_id[category] = $(this).attr("id");
else 
    item_id.splice(category, 1);

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

Если кто-то может решить это, это было бы очень признательно.

Ответы [ 4 ]

2 голосов
/ 23 ноября 2010

Селекторы jQuery всегда возвращают объект, независимо от того, соответствует элемент или нет.

То, что вы фактически получили, это:

if (new Object())
    item_id[category] = $(this).attr("id");
else 
    item_id.splice(category, 1);

Объекты всегда правдивы (независимо от того,пустой объект (или объект, инициализированный Джоном Резигом), поэтому этот оператор if никогда не выполнит else.

. Вероятно, вам нужно:

if ($('input[name="'+category+'"]:checked').length)
    item_id[category] = $(this).attr("id");
else 
    item_id.splice(category, 1);

Какие проверкивместо этого свойство length.

Это все равно не будет работать, так как splice() сместит все элементы в вашем массиве;делая category неправильным.

Если вы привязываете событие к ряду элементов-флажков, было бы неразумно использовать .bind() (и его аналоги .click()), так как этот метод будет связывать событиедля каждого флажка.Вместо этого используйте .live() или .delegate();это свяжет одно событие с предком всех элементов флажков и будет прослушивать событие (используя всплывающее окно событий JavaScripts), что гораздо более эффективно.

Принимая во внимание оба эти момента,Вы могли бы представить себе что-то вроде этого.

$(yourJquerySelector).live('change', function () {
    var category = '?' // (this.value ?)

    item_id[category] = this.checked ? this.id : undefined;
});
1 голос
/ 23 ноября 2010

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

Javascript Array - метод indexOf: http://www.tutorialspoint.com/javascript/array_indexof.htm

<script>

if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(elt /*, from*/)
  {
    var len = this.length;

    var from = Number(arguments[1]) || 0;
    from = (from < 0)
         ? Math.ceil(from)
         : Math.floor(from);
    if (from < 0)
      from += len;

    for (; from < len; from++)
    {
      if (from in this &&
          this[from] === elt)
        return from;
    }
    return -1;
  };
}

$(function() {

    var checkedItems = new Array();

    $(":checkbox").change(function () {
        if($(this).attr('checked'))
        {
        checkedItems.push($(this).attr("id"));
         }
        else
        {
        var index = checkedItems.indexOf($(this).attr("id"));
        checkedItems.splice(index,1);
        }
    });

});
</script>   

HTML

<input type="checkbox" id="c1" value="1">
<input type="checkbox" id="c2" value="2">
<input type="checkbox" id="c3" value="3">
1 голос
/ 23 ноября 2010

Измените условие if на:

$('input[name="'+category+'"]').is(':checked')

Как уже упоминал Мэтт, ваше текущее условие if является селектором, который возвращает список элементов jQuery. Проверка числа возвращаемых элементов (с использованием свойства length) также поможет.

1 голос
/ 23 ноября 2010

Функция splice предназначена для возврата удаленного, поэтому начните отладку, отобразив возвращаемое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...