Attributes: remove unnecessary element null check
[jquery.git] / src / attributes / attr.js
blob282893ea9510086e332228273be962e82643a3ed
1 define([
2         "../core",
3         "../var/rnotwhite",
4         "../core/access",
5         "./support",
6         "../selector"
7 ], function( jQuery, rnotwhite, access, support ) {
9 var nodeHook, boolHook,
10         attrHandle = jQuery.expr.attrHandle;
12 jQuery.fn.extend({
13         attr: function( name, value ) {
14                 return access( this, jQuery.attr, name, value, arguments.length > 1 );
15         },
17         removeAttr: function( name ) {
18                 return this.each(function() {
19                         jQuery.removeAttr( this, name );
20                 });
21         }
22 });
24 jQuery.extend({
25         attr: function( elem, name, value ) {
26                 var hooks, ret,
27                         nType = elem.nodeType;
29                 // don't get/set attributes on text, comment and attribute nodes
30                 if ( nType === 3 || nType === 8 || nType === 2 ) {
31                         return;
32                 }
34                 // Fallback to prop when attributes are not supported
35                 if ( typeof elem.getAttribute === "undefined" ) {
36                         return jQuery.prop( elem, name, value );
37                 }
39                 // All attributes are lowercase
40                 // Grab necessary hook if one is defined
41                 if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
42                         name = name.toLowerCase();
43                         hooks = jQuery.attrHooks[ name ] ||
44                                 ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
45                 }
47                 if ( value !== undefined ) {
49                         if ( value === null ) {
50                                 jQuery.removeAttr( elem, name );
52                         } else if ( hooks && "set" in hooks &&
53                                 (ret = hooks.set( elem, value, name )) !== undefined ) {
55                                 return ret;
57                         } else {
58                                 elem.setAttribute( name, value + "" );
59                                 return value;
60                         }
62                 } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
63                         return ret;
65                 } else {
66                         ret = jQuery.find.attr( elem, name );
68                         // Non-existent attributes return null, we normalize to undefined
69                         return ret == null ?
70                                 undefined :
71                                 ret;
72                 }
73         },
75         removeAttr: function( elem, value ) {
76                 var name, propName,
77                         i = 0,
78                         attrNames = value && value.match( rnotwhite );
80                 if ( attrNames && elem.nodeType === 1 ) {
81                         while ( (name = attrNames[i++]) ) {
82                                 propName = jQuery.propFix[ name ] || name;
84                                 // Boolean attributes get special treatment (#10870)
85                                 if ( jQuery.expr.match.bool.test( name ) ) {
86                                         // Set corresponding property to false
87                                         elem[ propName ] = false;
88                                 }
90                                 elem.removeAttribute( name );
91                         }
92                 }
93         },
95         attrHooks: {
96                 type: {
97                         set: function( elem, value ) {
98                                 if ( !support.radioValue && value === "radio" &&
99                                         jQuery.nodeName( elem, "input" ) ) {
100                                         var val = elem.value;
101                                         elem.setAttribute( "type", value );
102                                         if ( val ) {
103                                                 elem.value = val;
104                                         }
105                                         return value;
106                                 }
107                         }
108                 }
109         }
112 // Hooks for boolean attributes
113 boolHook = {
114         set: function( elem, value, name ) {
115                 if ( value === false ) {
116                         // Remove boolean attributes when set to false
117                         jQuery.removeAttr( elem, name );
118                 } else {
119                         elem.setAttribute( name, name );
120                 }
121                 return name;
122         }
124 jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
125         var getter = attrHandle[ name ] || jQuery.find.attr;
127         attrHandle[ name ] = function( elem, name, isXML ) {
128                 var ret, handle;
129                 if ( !isXML ) {
130                         // Avoid an infinite loop by temporarily removing this function from the getter
131                         handle = attrHandle[ name ];
132                         attrHandle[ name ] = ret;
133                         ret = getter( elem, name, isXML ) != null ?
134                                 name.toLowerCase() :
135                                 null;
136                         attrHandle[ name ] = handle;
137                 }
138                 return ret;
139         };