jQuery prop和attr的区别

本文详细比较了jQuery中prop与attr两种方法的功能差异。prop用于解析原生property,适用于处理radio/checkbox及select标签等场景;而attr则通过Attr API进行属性的读取与修改。文中还提供了具体示例及jQuery源码片段来帮助理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 两者对比

jquery方法 原理 适合场景 缺陷
prop 解析原生property
element.property
radio/checkbox 
select标签
等需要读boolean和索引的场合
读不到自定义属性
如<a my='I'/> my属性读不到
attr 通过Attr API去读取
element.getAttribute(propertyName)
除prop场景外 可能读不到boolean或一些索引值
如checked,selectedIndex

 

prop方法

  例子

    在控制台输入

document.getElementsByTagName('a')[0].href

    控制台输出

"http://www.baidu.com/home/xman/show/liteoff"

     href就是标签a映射的DOM对象HTMLAnchorElement的原生属性。

      jQuery源码      

复制代码
prop: function( elem, name, value ) {
        var ret, hooks, notxml,
            nType = elem.nodeType;

        // don't get/set properties on text, comment and attribute nodes
        if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
            return;
        }

        notxml = nType !== 1 || !jQuery.isXMLDoc( elem );

        if ( notxml ) {
            // Fix name and attach hooks
            name = jQuery.propFix[ name ] || name;
            hooks = jQuery.propHooks[ name ];
        }

        if ( value !== undefined ) {
            if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
                return ret;

            } else {
                return ( elem[ name ] = value );//这里就是读原生property
            }

        } else {
            if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
                return ret;

            } else {
                return elem[ name ];
            }
        }
    }
复制代码

 

  

 attr方法

  例子

    在控制台输入

document.getElementsByTagName('a')[10].getAttribute('href')

   控制台输出

"http://www.hao123.com"

   getAttribute就是Attr类的查询API。其他还有删除、修改、增加。

     jQuery源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
attr: function ( elem, name, value, pass ) {
         var  ret, hooks, notxml,
             nType = elem.nodeType;
 
         // don't get/set attributes on text, comment and attribute nodes
         if  ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
             return ;
         }
 
         if  ( pass && jQuery.isFunction( jQuery.fn[ name ] ) ) {
             return  jQuery( elem )[ name ]( value );
         }
 
         // Fallback to prop when attributes are not supported
         if  ( typeof  elem.getAttribute === "undefined"  ) {
             return  jQuery.prop( elem, name, value );
         }
 
         notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
 
         // All attributes are lowercase
         // Grab necessary hook if one is defined
         if  ( notxml ) {
             name = name.toLowerCase();
             hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
         }
 
         if  ( value !== undefined ) {
 
             if  ( value === null  ) {
                 jQuery.removeAttr( elem, name );
                 return ;
 
             } else  if  ( hooks && "set"  in  hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
                 return  ret;
 
             } else  {
                 elem.setAttribute( name, value + ""  );
                 return  value;
             }
 
         } else  if  ( hooks && "get"  in  hooks && notxml && (ret = hooks.get( elem, name )) !== null  ) {
             return  ret;
 
         } else  {
 
              ret = elem.getAttribute( name ); //这里通过Attr API读取属性
 
             // Non-existent attributes return null, we normalize to undefined
             return  ret === null  ?
                 undefined :
                 ret;
         }
     }

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值