2012-04-27 46 views
1

我在网上做了大量的搜索,发现将$('#checkbox').attr('checked')当作字符串的例子,以及其他将它当作布尔值的例子。

在我的情况,我觉得这种说法按预期工作:

$('#AcceptAgreement').attr('checked', false); 

但是这一次没有:

if ($('#AcceptAgreement').attr('checked') == true) 

第二种说法是错误的,因为实际上的价值是“检查”。

那它是哪一个呢?它是一个字符串还是布尔值,以及如何以可靠的方式读写它?

+0

的只是使用“检查”属性'你几乎总是需要的道具()方法,而不是ATTR()方法。 prop()只接受一个布尔值,attr同时接受这两个值,但可能会更慢,或者可能不是访问元素属性的正确方法。' – Ohgodwhy 2012-04-27 21:10:03

+0

也许它的历史可以追溯到IE允许带有checked = 1'','disabled ='true'',但不能在其他浏览器上使用 – 2012-04-27 21:20:27

回答

3

这取决于您使用的是哪个版本的jQuery。

checked既是属性又是属性。在老版本的jQuery中,.attr()总是返回属性,而不是通常为布尔值的属性。较新版本的jquery(1.6+)有一个名为.prop的新方法,它返回布尔属性值,而.attr()现在可以正确返回字符串值。我不确定属性是否随时更新。

+0

听起来没错。看起来我有1.7.1。似乎到目前为止工作可靠。 – 2012-04-27 21:16:37

1

这是一个字符串,但jQuery允许您使用布尔值进行设置,然后相应地更改属性。将其设置为“false”会导致attr('checked')返回undefined

+0

jQuery的设计者是否假设我只想设置它,但没有读取它? – 2012-04-27 21:09:42

+0

@Jonathan Wood:我看不到他们的想法。我只知道他们做了什么。:P – 2012-04-27 21:10:08

+0

@JonathanWood它是在'.attr'实际返回一个布尔值时''prop'方法添加之前所做的。 – 2012-04-27 21:20:07

0

要写出您必须使用:

,如果你想,如果它被选中可以使用知道:

if($('#AcceptAgreement').attr('checked')) 
+0

但是您的第一个代码段也按照我的方式工作,第二个代码段导致我在问题中描述的问题。 – 2012-04-27 21:12:59

0

你可以使用:

if ($('#AcceptAgreement').is(':checked')) 
{ 
    //... 
} 

或shortend:

$('#isAgeSelected').is(':checked') ? /*true*/ : /*false*/ ; 
1

没有找出数据类型

console.log(typeof $('#AcceptAgreement').attr('checked')); 

不过的jQuery 1.7之前,用于返回属性值的根本途径,现在它返回纯字符串。

另一种替代方案是.prop('checked'),它返回布尔值。

4

也许你不应该使用属性,改变状态的DOM节点

$('#AcceptAgreement')[0].checked = false 
if ($('#AcceptAgreement')[0].checked) 
+0

+1。没有“可能”关于它。这绝对是最明智和最可靠的选择。 – 2012-04-27 21:41:03