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