zoukankan      html  css  js  c++  java
  • jQuery函数attr()和prop()的区别

    在jQuery中,attr()函数和prop()函数都用于设置或获取指定的属性,它们的参数和用法也几乎完全相同。

    但不得不说的是,这两个函数的用处却并不相同。下面我们来详细介绍这两个函数之间的区别。

    1、操作对象不同

    很明显,attrprop分别是单词attributeproperty的缩写,并且它们均表示"属性"的意思。

    不过,在jQuery中,attributeproperty却是两个不同的概念。attribute表示HTML文档节点的属性,property表示JS对象的属性。

    1 <!-- 这里的id、class、data_id均是该元素文档节点的attribute -->
    2 <div id="message" class="test" data_id="123"></div>
    3 
    4 <script type="text/javascript">
    5 // 这里的name、age、url均是obj的property
    6 var obj = { name: "CodePlayer", age: 18, url: "http://www.365mini.com/" };
    7 </script>

    在jQuery中,prop()函数的设计目标是用于设置或获取指定DOM元素(指的是JS对象,Element类型)上的属性(property);attr()函数的设计目标是用于设置或获取指定DOM元素所对应的文档节点上的属性(attribute)。

    1 <!-- attr()函数针对的是该文档节点的attribute -->
    2 <div id="message" class="test" data_id="123"></div>
    3 
    4 <script type="text/javascript">
    5 // prop()函数针对的是该DOM元素(msg)自身的property
    6 var msg = document.getElementById("message");
    7 var $msg = $(msg);
    8 </script>

    当然,在jQuery的底层实现中,函数attr()prop()的功能都是通过JS原生的Element对象(如上述代码中的msg)实现的。attr()函数主要依赖的是Element对象的getAttribute()setAttribute()两个方法。prop()函数主要依赖的则是JS中原生的对象属性获取和设置方式。

     1 <div id="message" class="test" data_id="123"></div>
     2 <script type="text/javascript">
     3 var msg = document.getElementById("message");
     4 var $msg = $(msg);
     5 
     6 /* *** attr()依赖的是Element对象的element.getAttribute( attribute ) 和 element.setAttribute( attribute, value ) *** */
     7 
     8 // 相当于 msg.setAttribute("data_id", 145);
     9 $msg.attr("data_id", 145);
    10 
    11 // 相当于 msg.getAttribute("data_id");
    12 var dataId = $msg.attr("data_id"); // 145
    13 
    14 
    15 
    16 /* *** prop()依赖的是JS原生的 element[property] 和 element[property] = value; *** */
    17 
    18 // 相当于 msg["pid"] = "pid值";
    19 $msg.prop("pid", "pid值");
    20 
    21 // 相当于 msg["pid"];
    22 var testProp = $msg.prop("pid"); // pid值
    23 </script>

    当然,jQuery对这些操作方式进行了封装,使我们操作起来更加方便(比如以对象形式同时设置多个属性),并且实现了跨浏览器兼容。

    此外,虽然prop()针对的是DOM元素的property,而不是元素节点的attribute。不过DOM元素某些属性的更改也会影响到元素节点上对应的属性。例如,property的id对应attribute的id,property的className对应attribute的class

     1 <div id="message" class="test" data_id="123"></div>
     2 <script type="text/javascript">
     3 var msg = document.getElementById("message");
     4 var $msg = $(msg);
     5 
     6 document.writeln( $msg.attr("class") ); // test
     7 $msg.prop("className", "newTest");
     8 // 修改className(property)导致class(attitude)也随之更改
     9 document.writeln( $msg.attr("class") ); // newTest
    10 </script>

    运行代码

    2、应用版本不同

    attr()jQuery 1.0版本就有的函数,prop()jQuery 1.6版本新增的函数。毫无疑问,在1.6之前,你只能使用attr()函数;1.6及以后版本,你可以根据实际需要选择对应的函数。

    3、用于设置的属性值类型不同

    由于attr()函数操作的是文档节点的属性,因此设置的属性值只能是字符串类型,如果不是字符串类型,也会调用其toString()方法,将其转为字符串类型。

    prop()函数操作的是JS对象的属性,因此设置的属性值可以为包括数组和对象在内的任意类型。

    4、其他细节问题

    在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认为:attribute的checkedselecteddisabled就是表示该属性初始状态的值,property的checkedselecteddisabled才表示该属性实时状态的值(值为truefalse)。

    因此,在jQuery 1.6及以后版本中,请使用prop()函数来设置或获取checkedselecteddisabled等属性。对于其它能够用prop()实现的操作,也尽量使用prop()函数。

     1 <input id="uid" type="checkbox" checked="checked" value="1">
     2 
     3 <script type="text/javascript">
     4 // 当前jQuery版本为1.11.1
     5 var uid = document.getElementById("uid");
     6 var $uid = $(uid);
     7 
     8 document.writeln( $uid.attr("checked") ); // checked
     9 document.writeln( $uid.prop("checked") ); // true
    10 
    11 // 取消复选框uid的选中(将其设为false即可)
    12 // 相当于 uid.checked = false;
    13 $uid.prop("checked", false);
    14 
    15 // attr()获取的是初始状态的值,即使取消了选中,也不会改变
    16 document.writeln( $uid.attr("checked") ); // checked
    17 // prop()获取的值已经发生变化
    18 document.writeln( $uid.prop("checked") ); // false
    19 </script>
  • 相关阅读:
    VOA 2009/11/02 DEVELOPMENT REPORT In Kenya, a Better Life Through Mobile Money
    2009.11.26教育报道在美留学生数量创历史新高
    Java中如何实现Tree的数据结构算法
    The Python Tutorial
    VOA HEALTH REPORT Debate Over New Guidelines for Breast Cancer Screening
    VOA ECONOMICS REPORT Nearly Half of US Jobs Now Held by Women
    VOA ECONOMICS REPORT Junior Achievement Marks 90 Years of Business Education
    VOA 2009/11/07 IN THE NEWS A Second Term for Karzai; US Jobless Rate at 10.2%
    Ant入门
    Python 与系统管理
  • 原文地址:https://www.cnblogs.com/joyco773/p/5713468.html
Copyright © 2011-2022 走看看