引子:HTML复选框可以设置为indeterminate
,它既不会选中也不会选中。即使在这种不确定状态下,仍然存在潜在的布尔checked
状态。
单击不确定复选框后,它将失去indeterminate
状态。根据浏览器(Firefox),它还可以切换checked
属性。
This jsfiddle说明了这种情况。在Firefox中,单击其中一个复选框会导致它们切换其初始的基础checked
状态。在IE中,checked
属性在第一次单击时保持不变。
我希望所有浏览器的行为都相同,即使这意味着额外的javascript。不幸的是,indeterminate
属性在 onclick
处理程序(或onchange
和jquery change
)被调用之前设置为false ,所以我可以'检测是否要求点击indeterminate
复选框。
mouseup
和keyup
(用于空格键切换)事件显示先前的indeterminate
状态,但我不想那么具体:它似乎很脆弱。
我可以在复选框(data-indeterminate
或类似名称)上维护一个单独的属性,但我想知道是否有一个我缺少的简单解决方案,和/或是否有其他人遇到类似问题。
答案 0 :(得分:17)
如果您希望在所有浏览器上点击(或至少在IE,Chrome和FF5 +上)检查一个不定型复选框,则需要正确初始化已检查的属性,如图所示这里http://jsfiddle.net/K6nrT/6/。我写了以下函数来帮助你:
/// Gives a checkbox the inderminate state and the right
/// checked state so that it becomes checked on click
/// on click on IE, Chrome and Firefox 5+
function makeIndeterminate(checkbox)
{
checkbox.checked = getCheckedStateForIndeterminate();
checkbox.indeterminate = true;
}
以及依赖于特征检测的有趣功能:
/// Determine the checked state to give to a checkbox
/// with indeterminate state, so that it becomes checked
/// on click on IE, Chrome and Firefox 5+
function getCheckedStateForIndeterminate()
{
// Create a unchecked checkbox with indeterminate state
var test = document.createElement("input");
test.type = "checkbox";
test.checked = false;
test.indeterminate = true;
// Try to click the checkbox
var body = document.body;
body.appendChild(test); // Required to work on FF
test.click();
body.removeChild(test); // Required to work on FF
// Check if the checkbox is now checked and cache the result
if (test.checked)
{
getCheckedStateForIndeterminate = function () { return false; };
return false;
}
else
{
getCheckedStateForIndeterminate = function () { return true; };
return true;
}
}
没有图像技巧,没有jQuery,没有额外的属性,也没有涉及事件处理。这仅依赖于简单的JavaScript初始化(请注意,不能在HTML标记中设置“indeterminate”属性,因此无论如何都需要JavaScript初始化。)
答案 1 :(得分:0)
这解决了我的问题
$(".checkbox").click(function(){
$(this).change();
});
答案 2 :(得分:0)
我不确定使用函数来设置不确定复选框的值将是很好的解决方案,因为:
但我喜欢聪明的方法来确定浏览器的工作原理。
因此,您可以检查isCheckedAfterIndeterminate()
而不是通常window.navigator.userAgent.indexOf('Trident') >= 0
来查看它是IE(或者其他浏览器以不寻常的方式工作)。
所以我的解决方案将是:
/// Determine the checked state to give to a checkbox
/// with indeterminate state, so that it becomes checked
/// on click on IE, Chrome and Firefox 5+
function isCheckedAfterIndeterminate()
{
// Create a unchecked checkbox with indeterminate state
var test = document.createElement("input");
test.type = "checkbox";
test.checked = false;
test.indeterminate = true;
// Try to click the checkbox
var body = document.body;
body.appendChild(test); // Required to work on FF
test.click();
body.removeChild(test); // Required to work on FF
// Check if the checkbox is now checked and cache the result
if (test.checked) {
isCheckedAfterIndeterminate = function () { return false; };
return false;
} else {
isCheckedAfterIndeterminate = function () { return true; };
return true;
}
}
// Fix indeterminate checkbox behavoiur for some browsers.
if ( isCheckedAfterIndeterminate() ) {
$(function(){
$(document).on('mousedown', 'input', function(){
// Only fire the change event if the input is indeterminate.
if ( this.indeterminate ) {
this.indeterminate = false;
$(this).trigger('change');
}
});
});
}
答案 3 :(得分:-1)
制作您自己的可点击图片并使用一些java(脚本)使其表现得像那样。 我怀疑有多少用户会理解这种状态,所以在你使用它的地方要小心。