zoukankan      html  css  js  c++  java
  • jquery中prop()方法和attr()方法的区别浅析

    jquery1.6中新加了一个方法prop(),一直没用过它,官方解释只有一句话:获取在匹配的元素集中的第一个元素的属性值。

    大家都知道有的浏览器只要写disabled,checked就可以了,而有的要写成disabled = "disabled",checked="checked",比如用attr("checked")获取checkbox的checked属性时选中的时候可以取到值,值为"checked"但没选中获取值就是undefined。

    jq提供新的方法“prop”来获取这些属性,就是来解决这个问题的,以前我们使用attr获取checked属性时返回"checked"和"",现在使用prop方法获取属性则统一返回true和false。

    那么,什么时候使用attr(),什么时候使用prop()?
    1.在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>

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

    /* *** prop()依赖的是JS原生的 element[property] 和 element[property] = value; *** */

    // 相当于 msg["pid"] = "pid值";
    $msg.prop("pid", "pid值");

    // 相当于 msg["pid"];
    var testProp = $msg.prop("pid"); // pid值
    </script>


    3.虽然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>

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

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

    项目中jquery升级的时候大家要注意这点!

    注意事项

    1、如果通过prop()函数更改<input>和<button>元素的type属性,在多数浏览器上将会抛出一个错误,因为该属性一般不允许在后期更改。

    2、如果使用prop()函数操作表单元素的checkedselecteddisabled等属性,如果该元素被选中(或禁用),则返回true,否则(意即HTML中没有该属性)返回false

    3、prop()函数还可以设置或返回DOM元素的Element对象上的某些属性,例如:tagName、selectedIndex、nodeName、nodeType、ownerDocument、defaultChecked和defaultSelected等属性。

    4、在IE9及更早版本中,如果使用prop()函数设置的属性值不是一个简单的原始值(String、Number、Boolean),并且在对应的DOM元素被销毁之前,该属性没有被移除,则可能会导致内存泄漏问题。如果你只是为了存储数据,建议你使用data()函数,以避免内存泄漏问题。

    以下是官方建议attr(),prop()的使用:

    Attribute/Property.attr().prop()
    accesskey  
    align  
    async
    autofocus
    checked
    class  
    contenteditable  
    draggable  
    href  
    id  
    label  
    location ( i.e. window.location )
    multiple
    readOnly
    rel  
    selected
    src  
    tabindex  
    title  
    type  
    width ( if needed over .width() )  
  • 相关阅读:
    4. 变量
    3.进制的转换
    2 java程序入门
    truncate/delete/drop 区别
    sql server查询优化方法(海量数据)
    C#将DataTable转化成数组
    jq获取表格同一行第一列的内容
    C#将时间格式由yyyyMMdd转化成yyyy-MM-dd
    Easyui改变单元格背景颜色和字体颜色
    js判断数组中是否含有某元素(indexOf/includes)
  • 原文地址:https://www.cnblogs.com/zh-1721342390/p/6548573.html
Copyright © 2011-2022 走看看