昨天在开辟的时刻同事帮助写了一小段JS代码,取数据的时刻用到了之前都没用过的
$(this).data('xxx')
的这类情势,厥后看了手册才晓得在HTML5中能够对元素举行自定义属性。花样类似于data-xxx="value"
,然后能够用JQ中的.data()
要领举行存取数据。
厥后GG了一番不知怎样搜刮的又发现了一个attr()
和prop()
区分的一些诠释。
操纵对象差别
在jQuery中attr
示意HTML文档节点属性,而prop
则示意JS对象属性。
<!-- 这里的id、class、data_id均是该元素文档节点的attribute -->
<div id="message" class="test" data_id="123"></div>
<script type="text/javascript">
// 这里的name、age、url均是obj的property
var obj = { name: "CodePlayer", age: 18, url: "http://www.365mini.com/" };
</script>
在jQuery中,prop()
函数的设想目的是用于设置或猎取指定DOM元素(指的是JS对象,Element范例)上的属性(property);attr()
函数的设想目的是用于设置或猎取指定DOM元素所对应的文档节点上的属性(attribute)。
<!-- attr()函数针对的是该文档节点的attribute -->
<div id="message" class="test" data_id="123"></div>
<script type="text/javascript">
// prop()函数针对的是该DOM元素(msg)本身的property
var msg = document.getElementById("message");
var $msg = $(msg);
</script>
固然,在jQuery的底层完成中,函数attr()
和prop()
的功用都是经由过程JS原生的Element对象(如上述代码中的msg)完成的。attr()
函数重要依靠的是Element对象的getAttribute()
和setAttribute()
两个要领。prop()
函数重要依靠的则是JS中原生的对象属性猎取和设置体式格局。
javascript
<div id="message" class="test" data_id="123"></div> <script type="text/javascript"> var msg = document.getElementById("message"); var $msg = $(msg); /* *** attr()依靠的是Element对象的element.getAttribute( attribute ) 和 element.setAttribute( attribute, value ) *** */ // 相当于 msg.setAttribute("data_id", 145); $msg.attr("data_id", 145); // 相当于 msg.getAttribute("data_id"); var dataId = $msg.attr("data_id"); // 145 /* *** attr()依靠的是JS原生的 element[property] 和 element[property] = value; *** */ // 相当于 msg["pid"] = "pid值"; $msg.prop("pid", "pid值"); // 相当于 msg["pid"]; var testProp = $msg.prop("pid"); // pid值 </script>
固然,jQuery对这些操纵体式格局举行了封装,使我们操纵起来越发轻易(比方以对象情势同时设置多个属性),而且完成了跨浏览器兼容。
另外,虽然prop()
针对的是DOM元素的property,而不是元素节点的attribute。不过DOM元素某些属性的变动也会影响到元素节点上对应的属性。比方,property的id对应attribute的id,property的className对应attribute的class
。
<div id="message" class="test" data_id="123"></div>
<script type="text/javascript">
var msg = document.getElementById("message");
var $msg = $(msg);
document.writeln( $msg.attr("class") ); // test
$msg.prop("className", "newTest");
// 修正className(property)致使class(attitude)也随之变动
document.writeln( $msg.attr("class") ); // newTest
</script>
运用版本差别
attr()
是jQuery 1.0版本就有的函数,prop()
是jQuery 1.6版本新增的函数。毫无疑问,在1.6之前,你只能运用attr()
函数;1.6及今后版本,你能够依据实际需要挑选对应的函数。
设置属性值范例差别
由于attr()
函数操纵的是文档节点的属性,因而设置的属性值只能是字符串范例,假如不是字符串范例,也会挪用其toString()要领,将其转为字符串范例。prop()
函数操纵的是JS对象的属性,因而设置的属性值能够为包含数组和对象在内的恣意范例。
其他的细节题目
在jQuery 1.6之前,只要attr()
函数可用,该函数不仅负担了attribute的设置和猎取事情,还同时负担了property的设置和猎取事情。比方:在jQuery 1.6之前,attr()
也能够设置或猎取tagName、className、nodeName、nodeType等DOM元素的property。
直到jQuery 1.6新增prop()
函数,并用来负担property的设置或猎取事情以后,attr()
才只用来担任attribute的设置和猎取事情。
★★★★★
另外,关于表单元素的checked
、selected
、disabled
等属性,在jQuery 1.6之前,attr()
猎取这些属性的返回值为Boolean范例:假如被选中(或禁用)就返回true,不然返回false。
★★★★★
然则从1.6最先,运用attr()
猎取这些属性的返回值为String范例,假如被选中(或禁用)就返回checked
、selected
或disabled
,不然(即元素节点没有该属性)返回undefined。而且,在某些版本中,这些属性值示意文档加载时的初始状况值,纵然以后变动了这些元素的选中(或禁用)状况,对应的属性值也不会发作转变。由于jQuery以为:attribute的checked、selected、disabled就是示意该属性初始状况的值,property的checked、selected、disabled才示意该属性及时状况的值(值为true或false)。
因而,在jQuery 1.6及今后版本中,请运用prop()
函数来设置或猎取checked
、selected
、disabled
等属性。关于别的能够用prop()
完成的操纵,也只管运用prop()
函数。