码迷,mamicode.com
首页 > Web开发 > 详细

jQuery prop和attr的区别

时间:2014-09-17 21:45:42      阅读:332      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   color   io   java   ar   strong   

 两者对比

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源码

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;
		}
	}

  

 

jQuery prop和attr的区别

标签:des   style   blog   http   color   io   java   ar   strong   

原文地址:http://www.cnblogs.com/mominger/p/3978039.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!