Селекторы 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;
});