1.碰到的“坑”
<label>
<input type="checkbox" class="check-box" id="apple">苹果
<input type="checkbox" class="check-box" id="banana">香蕉
<input type="checkbox" class="check-box" id="pear">梨
</label>
假设我们把三个都选中,然后如下调用js想要取消苹果项的选中状态:
$("#apple").attr("checked",false);
结果,没有任何作用!
这就很让我困惑了,到底是为什么呢,checkebox的选中状态下checked=true,那按道理如果把checked设为false的话自然就是取消选中状态啊,道理是这样,没错!然后找原因,首先要知道在选中状态下的checked真的是true吗?试一下:
$("#apple").attr("checked");
得到的结果是undefined!!
到底是哪里出现了问题呢?带着这个疑惑在网上查找了一下,结果找到了prop( )这个方法,说是像复选框的checked是需要prop方法来读取的,而attr是无效的,试一下:
$("#apple").prop("checked");
得到的结果真的是 true!!那么这prop到底是何方神圣呢?让我们来探索一下。
2.何为prop( )方法?
.prop(propertyName)------->>获取匹配的元素集中第一个元素的属性(property)值(添加的版本: 1.6)。
.prop(propertyName,)
.prop()
方法只获得_第一_个匹配元素的属性值 。如果元素上没有该属性,或者如果没有匹配的元素。那么该方法会返回undefined
值。若要取得每个匹配元素的属性值(property),请使用循环结构,如jQuery .each()
或.map()
方法。
_attributes_和_properties_之间的差异在特定情况下是很重要。jQuery 1.6之前 ,.attr()
方法在取某些 attribute 的值时,会返回 property 的值,这就导致了结果的不一致。从 jQuery 1.6 开始, .prop()
方法 方法返回 property 的值,而.attr()
方法返回 attributes 的值。
例如, selectedIndex
, tagName
, nodeName
, nodeType
, ownerDocument
, defaultChecked
, 和 defaultSelected
应使用.prop()
方法进行取值或赋值。 在jQuery1.6之前,这些属性使用.attr()
方法取得,但是这并不是元素的attr
属性。他们没有相应的属性(attributes),只有特性(property)。
例如,考虑一个DOM元素的HTML标记中定义的<input type="checkbox" checked="checked" />
,并假设它是一个JavaScript变量命名的elem
:
elem.checked
true
(Boolean) 将随着复选框状态的改变而改变
$(elem).prop("checked")
true
(Boolean) 将随着复选框状态的改变而改变
elem.getAttribute("checked")
"checked"
(String) 复选框的初始状态;不会改变
$(elem).attr("checked")
(1.6)
"checked"
(String) 复选框的初始状态;不会改变
$(elem).attr("checked")
(1.6.1+)
"checked"
(String) 将随着复选框状态的改变而改变
$(elem).attr("checked")
(pre-1.6)
true
(Boolean) 将随着复选框状态的改变而改变
根据W3C的表单规范 ,在checked
属性是一个布尔属性, 这意味着,如果这个属性(attribute)是目前存在, 即使,该属性没有对应的值,或者被设置为空字符串值,或甚至是"false",相应的属性(property)为true。 这才是真正的所有布尔属性(attributes)。
然而,要记住的最重要的概念是checked
特性(attribute)不是对应它checked
属性(property)。特性(attribute)实际对应的是defaultChecked
属性(property),而且仅用于设置复选框最初的值。checked
特性(attribute)值不会因为复选框的状态而改变,而checked
属性(property)会因为复选框的状态而改变。因此, 跨浏览器兼容的方法来确定一个复选框是否被选中,是使用该属性(property):
if ( elem.checked )
if ( $(elem).prop("checked") )
if ( $(elem).is(":checked") )
对于其他的动态属性,同样是true,比如 selected
和 value
.