jQuery中attr()和prop()要领的一些区分明白

昨天在开辟的时刻同事帮助写了一小段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的设置和猎取事情。

★★★★★
另外,关于表单元素的checkedselecteddisabled等属性,在jQuery 1.6之前,attr()猎取这些属性的返回值为Boolean范例假如被选中(或禁用)就返回true,不然返回false。
★★★★★
然则从1.6最先,运用attr()猎取这些属性的返回值为String范例,假如被选中(或禁用)就返回checkedselecteddisabled不然(即元素节点没有该属性)返回undefined。而且,在某些版本中,这些属性值示意文档加载时的初始状况值,纵然以后变动了这些元素的选中(或禁用)状况,对应的属性值也不会发作转变。由于jQuery以为:attributecheckedselecteddisabled就是示意该属性初始状况的值,property的checked、selected、disabled才示意该属性及时状况的值(值为true或false)。

因而,在jQuery 1.6及今后版本中,请运用prop()函数来设置或猎取checkedselecteddisabled等属性。关于别的能够用prop()完成的操纵,也只管运用prop()函数。

    原文作者:一个向往前端的后端工程师
    原文地址: https://segmentfault.com/a/1190000002680303
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞