jQuery prop和attr的区别

比眉伴天荒 2021-12-20 16:41 382阅读 0赞

两者对比






















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

prop方法

  例子

    在控制台输入

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

    控制台输出

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

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

jQuery源码      

  1. prop: function( elem, name, value ) {
  2. var ret, hooks, notxml,
  3. nType = elem.nodeType;
  4. // don't get/set properties on text, comment and attribute nodes
  5. if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
  6. return;
  7. }
  8. notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
  9. if ( notxml ) {
  10. // Fix name and attach hooks
  11. name = jQuery.propFix[ name ] || name;
  12. hooks = jQuery.propHooks[ name ];
  13. }
  14. if ( value !== undefined ) {
  15. if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
  16. return ret;
  17. } else {
  18. return ( elem[ name ] = value );//这里就是读原生property
  19. }
  20. } else {
  21. if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
  22. return ret;
  23. } else {
  24. return elem[ name ];
  25. }
  26. }
  27. }

  

attr方法

  例子

    在控制台输入

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

   控制台输出

  1. "http://www.hao123.com"

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

jQuery源码

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

  

转载于:https://www.cnblogs.com/mominger/p/3978039.html

发表评论

表情:
评论列表 (有 0 条评论,382人围观)

还没有评论,来说两句吧...

相关阅读

    相关 jqueryattrprop区别

    在高版本的jquery引入prop方法后,什么时候该用prop?什么时候用attr?它们两个之间有什么区别?这些问题就出现了。 关于它们两个的区别,网上的答案很多。这里谈谈我

    相关 jqueryattrprop区别

    在高版本的jquery引入prop方法后,什么时候该用prop?什么时候用attr?它们两个之间有什么区别?这些问题就出现了。 关于它们两个的区别,网上的答案很多。这里谈谈我