选中复选框后,我会向数组中添加一个元素,并且在取消选中时我需要将其删除。我使用splice删除元素。当它未被检查时,我似乎无法调用事件。我试过用这个:
if ($('input[name="'+category+'"]:checked'))
item_id[category] = $(this).attr("id");
else
item_id.splice(category, 1);
当选中复选框时,它会添加所需的元素,但是当它未选中时似乎不会删除它。变量类别是一个循环变量,是正确的。
如果有人可以解决这个问题,我们将不胜感激。
答案 0 :(得分:2)
jQuery选择器总是返回一个对象,无论元素是否匹配。
你有效得到的是:
if (new Object())
item_id[category] = $(this).attr("id");
else
item_id.splice(category, 1);
对象始终是真实的(无论它是空对象,还是John Resig初始化的对象),因此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 :(得分:1)
splice
函数用于返回已删除的内容,因此请通过显示其返回值来启动调试。
答案 2 :(得分:1)
将您的if条件更改为:
$('input[name="'+category+'"]').is(':checked')
如Matt所述,您当前的if条件是一个返回jQuery元素列表的选择器。测试返回的元素数量(使用length属性)也可以解决问题。
答案 3 :(得分:1)
说实话并不完全确定你是什么,但这是我的解决方案,希望它能以某种方式为你服务
Javascript数组 - 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">