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