皮皮网
皮皮网

【eco跟踪c 源码】【曹明成源码】【spring bean 注册源码】jquery attr 源码

来源:力扣源码 发表时间:2024-11-28 14:54:16

1.jquery中attr和prop的区别
2.jQuery学习之prop和attr的区别

jquery attr 源码

jquery中attr和prop的区别

       ç›¸æ¯”attr,prop是1.6.1才新出来的,两者从中文意思理解,都是获取/设置属性的方法(attributes和properties)。

       åªæ˜¯ï¼Œwindow或document中使用.attr()方法在jQuery1.6之前不能正常运行,因为window和document中不能有

       attributes。prop应运而生了。

       æ—¢ç„¶æˆ‘们想知道他们两的区别,最好就看看他们的源代码,不要被代码长度所吓到,我们只看关键的几句:

       attr: function( elem,源码eco跟踪c 源码 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 );

       // Non-existent attributes return null, we normalize to undefined

       return ret === null ?

       undefined :

       ret;

       }

       }

       prop方法代码(jQuery版本1.8.3)

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

       }

       } else {

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

       return ret;

       } else {

       return elem[ name ];

       }

       }

       }

       attr

       æ–¹æ³•é‡Œé¢ï¼Œæœ€å…³é”®çš„两行代码,elem.setAttribute( name, value + “” )和ret =

       elem.getAttribute( name ),很明显的看出来,使用的DOM的API

       setAttribute和getAttribute方法操作的属性元素节点。而prop方法里面,最关键的两行代码,return ( elem[

       name ] = value )和return elem[ name

       ],你可以理解成这样document.getElementById(el)[name] = value,这是转化成JS对象的一个属性。

       æ—¢ç„¶æ˜Žç™½äº†åŽŸç†æ˜¯è¿™æ ·ï¼Œæˆ‘们来看看一个例子:

       <input type="checkbox" id="test" abc="" />

       $(function(){

       el = $("#test");

       console.log(el.attr("style")); //undefined

       console.log(el.prop("style")); //CSSStyleDeclaration对象

       console.log(document.getElementById("test").style); //CSSStyleDeclaration对象

       });

       el.attr(“style”)

       è¾“出undefined,因为attr是获取的这个对象属性节点的值,很显然此时没有这个属性节点,自然输出

       undefinedel.prop(“style”)输出CSSStyleDeclaration对象,对于一个DOM对象,是具有原生的style对象

       å±žæ€§çš„,所以输出了style对象至于document.getElementById(“test”).style和上面那条一样

       æŽ¥ç€çœ‹ï¼š

       el.attr("abc","")

       console.log(el.attr("abc")); //

       console.log(el.prop("abc")); //undefined

       é¦–先用attr方法给这个对象添加abc节点属性,值为,可以看到html的结构也变了

       el.attr(“abc”)输出结果为,再正常不过了el.prop(“abc”)输出undefined,因为abc是在这个的属性节点中,所以通过prop是取不到的

       el.prop("abc", "");

       console.log(el.attr("abc")); //

       console.log(el.prop("abc")); //

       æˆ‘们再用prop方法给这个对象设置了abc属性,值为,可以看到html的结构是没有变化的。输出的结果就不解释了。

       ä¸Šé¢å·²ç»æŠŠåŽŸç†è®²æ¸…楚了,什么时候用什么就可以自己把握了。

       æä¸€ä¸‹ï¼Œåœ¨é‡åˆ°è¦èŽ·å–或设置checked,selected,readonly和disabled等属性时,用prop方法显然更好,比如像下面这样:

       <input type="checkbox" id="test" checked="checked" />console.log(el.attr("checked")); //checked

       console.log(el.prop("checked")); //true

       console.log(el.attr("disabled")); //undefined

       console.log(el.prop("disabled")); //false

       æ˜¾ç„¶ï¼Œå¸ƒå°”值比字符串值让接下来的处理更合理。

       PS一下,如果你有JS性能洁癖的话,显然prop的性能更高,因为attr需要访问DOM属性节点,访问DOM是最耗时的。这种情况适用于多选项全选和反选的情况。

       å¤§

       å®¶éƒ½çŸ¥é“有的浏览器只要写disabled,checked就可以了,而有的要写成disabled =

       "disabled",checked="checked",比如用attr("checked")获取checkbox的checked属性时选中的时

       å€™å¯ä»¥å–到值,值为"checked"但没选中获取值就是undefined。

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

       é‚£ä¹ˆï¼Œä»€ä¹ˆæ—¶å€™ä½¿ç”¨attr(),什么时候使用prop()?1.添加属性名称该属性就会生效应该使用prop();2.是有true,false两个属性使用prop();3.其他则使用attr();项目中jquery升级的时候大家要注意这点!

       ä»¥ä¸‹æ˜¯å®˜æ–¹å»ºè®®attr(),prop()的使用:

jQuery学习之prop和attr的区别

       prop是jquery1.6新增的方法,其与attr的用法极为相似。由于不理解他们的根本区别,难免产生离奇的BUG。

       é€šè¿‡åˆ†æžattr和prop的源码,得知:

       attr方法里面,最关键的两行代码,elem.setAttribute( name, value + “” )和ret = elem.getAttribute( name ),很明显的看出来,使用的DOM的API setAttribute和getAttribute方法操作的属性元素节点。

       è€Œprop方法里面,最关键的两行代码,return ( elem[ name ] = value )和return elem[ name ],你可以理解成这样document.getElementById(el)[name] = value,这是转化成JS对象的一个属性。

       å¼•å…¥ä¸¤ä¸ªä¾‹å­ï¼š

       <input type="checkbox" id="test" abc="" />

       $(function(){

        el = $("#test");

        console.log(el.attr("style")); //undefined

        console.log(el.prop("style")); //CSSStyleDeclaration对象

        console.log(document.getElementById("test").style); //CSSStyleDeclaration对象

       });

       1、el.attr(“style”)输出undefined,因为attr是获取的这个对象属性节点的值,很显然此时没有这个属性节点,自然输出undefined

       2、el.prop(“style”)输出CSSStyleDeclaration对象,对于一个DOM对象,是具有原生的style对象属性的,所以输出了style对象

       3、至于document.getElementById(“test”).style和上面那条一样

       el.attr("abc","")

       console.log(el.attr("abc")); www.hbbz.com //

       console.log(el.prop("abc")); //undefined

       é¦–先用attr方法给这个对象添加abc节点属性,值为,可以看到html的结构也变了

       1、el.attr(“abc”)输出结果为,再正常不过了

       2、el.prop(“abc”)输出undefined,因为abc是在这个的属性节点中,所以通过prop是取不到的

相关栏目:娱乐

.重点关注