【发布时间】:2014-09-13 01:23:19
【问题描述】:
我有 2 个复选框和第三个用作“全部切换”的复选框。我有以下标准:
- 当其他 2 个复选框均未选中时,“toggle all”也应取消选中。
- 当另外两个复选框都被选中时,“toggle all”也应该被选中。
- 当仅选中一个其他复选框时,应选中“全部切换”并禁用以显示“半选中”状态。
另外,应该可以点击“toggle all”来选中或取消选中另外2个(如果“toggle all”是半选中的,两个都应该选中)。
我创建了以下 JS/jQuery 函数:
function setPdfDialogPriceCheckboxes(pElement)
{
var tSuperCheckbox = jQuery("#superCheckbox").next();
var tCheckbox1 = jQuery("#checkbox1");
var tCheckbox2 = jQuery("#checkbox2");
console.log(pElement.id);
if(pElement.id == "superCheckbox")
{
tSuperCheckbox.click();
var tCheckAll = tSuperCheckbox.is(':checked');
if(tCheckbox1.is(':checked') != tCheckAll)
{
tCheckbox1.click();
}
if(tCheckbox2.is(':checked') != tCheckAll)
{
tCheckbox2.click();
}
}
else
{
if(tCheckbox1.is(':checked') && tCheckbox2.is(':checked'))
{
tSuperCheckbox.prop('checked', true);
tSuperCheckbox.prop('disabled', false);
}
else if(tCheckbox1.is(':checked') || tCheckbox2.is(':checked'))
{
tSuperCheckbox.prop('checked', true);
tSuperCheckbox.prop('disabled', true);
}
else
{
tSuperCheckbox.prop('checked', false);
tSuperCheckbox.prop('disabled', false);
}
}
}
另外,“toggle all”复选框有一个覆盖的 div,防止直接点击它,所以即使复选框被禁用,我也可以处理 onclick()-Events:
<div style="position: relative; ">
<div id="superCheckbox" onclick="setPdfDialogPriceCheckboxes(this)" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 9999; "></div>
<input type="checkbox" />
</div>
我在这里为此创建了一个小提琴:http://jsfiddle.net/9mhag8b6/
它适用于 Firefox 和 Chrome,但 Internet Explorer 似乎只是忽略了覆盖的 div,让我直接单击复选框。
我知道我可能会使用“不确定”来显示复选框上的半选中状态,但我宁愿这样。我目前的解决方法是改用图像,但在所有浏览器上看起来都一样,而复选框不同。
任何帮助将不胜感激。
【问题讨论】:
-
“另外,“toggle all”复选框有一个重叠的 div,防止直接点击它” 你为什么要这样做?只是阻止点击。
-
为什么不使用
<label>而不是div并利用复选框的默认标签单击行为?您正在做的事情过于复杂,并试图重新发明轮子 -
由于仅选中一个其他复选框时,toggle-all 复选框可以(并且将会)被禁用,因此它将无法触发 onclick() 事件。因此,div 处理事件。标签也一样,因为复选框被禁用,它可能不会做任何事情。
-
为什么不将处理程序绑定到复选框?方法没有意义
-
我试过这个很好,但处理程序不会在禁用的复选框上触发。至少不在 Firefox 上,所以我没有费心测试其他浏览器。
标签: javascript jquery internet-explorer checkbox