changeset 21 | 48c4eec2b7e6 |
parent 19 | 3d72ae0968f4 |
20:7b1b88e27a20 | 21:48c4eec2b7e6 |
---|---|
1 /*! |
1 /*! |
2 * jQuery UI Menu 1.13.1 |
2 * jQuery UI Menu 1.13.3 |
3 * http://jqueryui.com |
3 * https://jqueryui.com |
4 * |
4 * |
5 * Copyright jQuery Foundation and other contributors |
5 * Copyright OpenJS Foundation and other contributors |
6 * Released under the MIT license. |
6 * Released under the MIT license. |
7 * http://jquery.org/license |
7 * https://jquery.org/license |
8 */ |
8 */ |
9 |
9 |
10 //>>label: Menu |
10 //>>label: Menu |
11 //>>group: Widgets |
11 //>>group: Widgets |
12 //>>description: Creates nestable menus. |
12 //>>description: Creates nestable menus. |
13 //>>docs: http://api.jqueryui.com/menu/ |
13 //>>docs: https://api.jqueryui.com/menu/ |
14 //>>demos: http://jqueryui.com/menu/ |
14 //>>demos: https://jqueryui.com/menu/ |
15 //>>css.structure: ../../themes/base/core.css |
15 //>>css.structure: ../../themes/base/core.css |
16 //>>css.structure: ../../themes/base/menu.css |
16 //>>css.structure: ../../themes/base/menu.css |
17 //>>css.theme: ../../themes/base/theme.css |
17 //>>css.theme: ../../themes/base/theme.css |
18 |
18 |
19 ( function( factory ) { |
19 ( function( factory ) { |
22 if ( typeof define === "function" && define.amd ) { |
22 if ( typeof define === "function" && define.amd ) { |
23 |
23 |
24 // AMD. Register as an anonymous module. |
24 // AMD. Register as an anonymous module. |
25 define( [ |
25 define( [ |
26 "jquery", |
26 "jquery", |
27 "./core" |
27 "../keycode", |
28 "../position", |
|
29 "../safe-active-element", |
|
30 "../unique-id", |
|
31 "../version", |
|
32 "../widget" |
|
28 ], factory ); |
33 ], factory ); |
29 } else { |
34 } else { |
30 |
35 |
31 // Browser globals |
36 // Browser globals |
32 factory( jQuery ); |
37 factory( jQuery ); |
33 } |
38 } |
34 } )( function( $ ) { |
39 } )( function( $ ) { |
35 "use strict"; |
40 "use strict"; |
36 |
41 |
37 return $.widget( "ui.menu", { |
42 return $.widget( "ui.menu", { |
38 version: "1.13.1", |
43 version: "1.13.3", |
39 defaultElement: "<ul>", |
44 defaultElement: "<ul>", |
40 delay: 300, |
45 delay: 300, |
41 options: { |
46 options: { |
42 icons: { |
47 icons: { |
43 submenu: "ui-icon-caret-1-e" |
48 submenu: "ui-icon-caret-1-e" |
93 |
98 |
94 // Open submenu on click |
99 // Open submenu on click |
95 if ( target.has( ".ui-menu" ).length ) { |
100 if ( target.has( ".ui-menu" ).length ) { |
96 this.expand( event ); |
101 this.expand( event ); |
97 } else if ( !this.element.is( ":focus" ) && |
102 } else if ( !this.element.is( ":focus" ) && |
98 active.closest( ".ui-menu" ).length ) { |
103 active.closest( ".ui-menu" ).length ) { |
99 |
104 |
100 // Redirect focus to the menu |
105 // Redirect focus to the menu |
101 this.element.trigger( "focus", [ true ] ); |
106 this.element.trigger( "focus", [ true ] ); |
102 |
107 |
103 // If the active item is on the top level, let it stay active. |
108 // If the active item is on the top level, let it stay active. |
160 return; |
165 return; |
161 } |
166 } |
162 |
167 |
163 // If the mouse didn't actually move, but the page was scrolled, ignore the event (#9356) |
168 // If the mouse didn't actually move, but the page was scrolled, ignore the event (#9356) |
164 if ( event.clientX === this.lastMousePosition.x && |
169 if ( event.clientX === this.lastMousePosition.x && |
165 event.clientY === this.lastMousePosition.y ) { |
170 event.clientY === this.lastMousePosition.y ) { |
166 return; |
171 return; |
167 } |
172 } |
168 |
173 |
169 this.lastMousePosition = { |
174 this.lastMousePosition = { |
170 x: event.clientX, |
175 x: event.clientX, |
200 |
205 |
201 // Destroy (sub)menus |
206 // Destroy (sub)menus |
202 this.element |
207 this.element |
203 .removeAttr( "aria-activedescendant" ) |
208 .removeAttr( "aria-activedescendant" ) |
204 .find( ".ui-menu" ).addBack() |
209 .find( ".ui-menu" ).addBack() |
205 .removeAttr( "role aria-labelledby aria-expanded aria-hidden aria-disabled " + |
210 .removeAttr( "role aria-labelledby aria-expanded aria-hidden aria-disabled " + |
206 "tabIndex" ) |
211 "tabIndex" ) |
207 .removeUniqueId() |
212 .removeUniqueId() |
208 .show(); |
213 .show(); |
209 |
214 |
210 submenus.children().each( function() { |
215 submenus.children().each( function() { |
211 var elem = $( this ); |
216 var elem = $( this ); |
212 if ( elem.data( "ui-menu-submenu-caret" ) ) { |
217 if ( elem.data( "ui-menu-submenu-caret" ) ) { |
213 elem.remove(); |
218 elem.remove(); |
218 _keydown: function( event ) { |
223 _keydown: function( event ) { |
219 var match, prev, character, skip, |
224 var match, prev, character, skip, |
220 preventDefault = true; |
225 preventDefault = true; |
221 |
226 |
222 switch ( event.keyCode ) { |
227 switch ( event.keyCode ) { |
223 case $.ui.keyCode.PAGE_UP: |
228 case $.ui.keyCode.PAGE_UP: |
224 this.previousPage( event ); |
229 this.previousPage( event ); |
225 break; |
230 break; |
226 case $.ui.keyCode.PAGE_DOWN: |
231 case $.ui.keyCode.PAGE_DOWN: |
227 this.nextPage( event ); |
232 this.nextPage( event ); |
228 break; |
233 break; |
229 case $.ui.keyCode.HOME: |
234 case $.ui.keyCode.HOME: |
230 this._move( "first", "first", event ); |
235 this._move( "first", "first", event ); |
231 break; |
236 break; |
232 case $.ui.keyCode.END: |
237 case $.ui.keyCode.END: |
233 this._move( "last", "last", event ); |
238 this._move( "last", "last", event ); |
234 break; |
239 break; |
235 case $.ui.keyCode.UP: |
240 case $.ui.keyCode.UP: |
236 this.previous( event ); |
241 this.previous( event ); |
237 break; |
242 break; |
238 case $.ui.keyCode.DOWN: |
243 case $.ui.keyCode.DOWN: |
239 this.next( event ); |
244 this.next( event ); |
240 break; |
245 break; |
241 case $.ui.keyCode.LEFT: |
246 case $.ui.keyCode.LEFT: |
242 this.collapse( event ); |
247 this.collapse( event ); |
243 break; |
248 break; |
244 case $.ui.keyCode.RIGHT: |
249 case $.ui.keyCode.RIGHT: |
245 if ( this.active && !this.active.is( ".ui-state-disabled" ) ) { |
250 if ( this.active && !this.active.is( ".ui-state-disabled" ) ) { |
246 this.expand( event ); |
251 this.expand( event ); |
247 } |
252 } |
248 break; |
253 break; |
249 case $.ui.keyCode.ENTER: |
254 case $.ui.keyCode.ENTER: |
250 case $.ui.keyCode.SPACE: |
255 case $.ui.keyCode.SPACE: |
251 this._activate( event ); |
256 this._activate( event ); |
252 break; |
257 break; |
253 case $.ui.keyCode.ESCAPE: |
258 case $.ui.keyCode.ESCAPE: |
254 this.collapse( event ); |
259 this.collapse( event ); |
255 break; |
260 break; |
256 default: |
261 default: |
257 preventDefault = false; |
262 preventDefault = false; |
258 prev = this.previousFilter || ""; |
263 prev = this.previousFilter || ""; |
259 skip = false; |
264 skip = false; |
260 |
265 |
261 // Support number pad values |
266 // Support number pad values |
262 character = event.keyCode >= 96 && event.keyCode <= 105 ? |
267 character = event.keyCode >= 96 && event.keyCode <= 105 ? |
263 ( event.keyCode - 96 ).toString() : String.fromCharCode( event.keyCode ); |
268 ( event.keyCode - 96 ).toString() : String.fromCharCode( event.keyCode ); |
264 |
269 |
265 clearTimeout( this.filterTimer ); |
270 clearTimeout( this.filterTimer ); |
266 |
271 |
267 if ( character === prev ) { |
272 if ( character === prev ) { |
268 skip = true; |
273 skip = true; |
269 } else { |
274 } else { |
270 character = prev + character; |
275 character = prev + character; |
271 } |
276 } |
272 |
277 |
278 match = this._filterMenuItems( character ); |
|
279 match = skip && match.index( this.active.next() ) !== -1 ? |
|
280 this.active.nextAll( ".ui-menu-item" ) : |
|
281 match; |
|
282 |
|
283 // If no matches on the current filter, reset to the last character pressed |
|
284 // to move down the menu to the first item that starts with that character |
|
285 if ( !match.length ) { |
|
286 character = String.fromCharCode( event.keyCode ); |
|
273 match = this._filterMenuItems( character ); |
287 match = this._filterMenuItems( character ); |
274 match = skip && match.index( this.active.next() ) !== -1 ? |
288 } |
275 this.active.nextAll( ".ui-menu-item" ) : |
289 |
276 match; |
290 if ( match.length ) { |
277 |
291 this.focus( event, match ); |
278 // If no matches on the current filter, reset to the last character pressed |
292 this.previousFilter = character; |
279 // to move down the menu to the first item that starts with that character |
293 this.filterTimer = this._delay( function() { |
280 if ( !match.length ) { |
|
281 character = String.fromCharCode( event.keyCode ); |
|
282 match = this._filterMenuItems( character ); |
|
283 } |
|
284 |
|
285 if ( match.length ) { |
|
286 this.focus( event, match ); |
|
287 this.previousFilter = character; |
|
288 this.filterTimer = this._delay( function() { |
|
289 delete this.previousFilter; |
|
290 }, 1000 ); |
|
291 } else { |
|
292 delete this.previousFilter; |
294 delete this.previousFilter; |
293 } |
295 }, 1000 ); |
296 } else { |
|
297 delete this.previousFilter; |
|
298 } |
|
294 } |
299 } |
295 |
300 |
296 if ( preventDefault ) { |
301 if ( preventDefault ) { |
297 event.preventDefault(); |
302 event.preventDefault(); |
298 } |
303 } |
351 |
356 |
352 // Don't refresh list items that are already adapted |
357 // Don't refresh list items that are already adapted |
353 newItems = items.not( ".ui-menu-item, .ui-menu-divider" ); |
358 newItems = items.not( ".ui-menu-item, .ui-menu-divider" ); |
354 newWrappers = newItems.children() |
359 newWrappers = newItems.children() |
355 .not( ".ui-menu" ) |
360 .not( ".ui-menu" ) |
356 .uniqueId() |
361 .uniqueId() |
357 .attr( { |
362 .attr( { |
358 tabIndex: -1, |
363 tabIndex: -1, |
359 role: this._itemRole() |
364 role: this._itemRole() |
360 } ); |
365 } ); |
361 this._addClass( newItems, "ui-menu-item" ) |
366 this._addClass( newItems, "ui-menu-item" ) |
362 ._addClass( newWrappers, "ui-menu-item-wrapper" ); |
367 ._addClass( newWrappers, "ui-menu-item-wrapper" ); |
363 |
368 |
364 // Add aria-disabled attribute to any disabled menu item |
369 // Add aria-disabled attribute to any disabled menu item |
365 items.filter( ".ui-state-disabled" ).attr( "aria-disabled", "true" ); |
370 items.filter( ".ui-state-disabled" ).attr( "aria-disabled", "true" ); |
411 } |
416 } |
412 |
417 |
413 // Highlight active parent menu item, if any |
418 // Highlight active parent menu item, if any |
414 activeParent = this.active |
419 activeParent = this.active |
415 .parent() |
420 .parent() |
416 .closest( ".ui-menu-item" ) |
421 .closest( ".ui-menu-item" ) |
417 .children( ".ui-menu-item-wrapper" ); |
422 .children( ".ui-menu-item-wrapper" ); |
418 this._addClass( activeParent, null, "ui-state-active" ); |
423 this._addClass( activeParent, null, "ui-state-active" ); |
419 |
424 |
420 if ( event && event.type === "keydown" ) { |
425 if ( event && event.type === "keydown" ) { |
421 this._close(); |
426 this._close(); |
422 } else { |
427 } else { |
693 regex = new RegExp( "^" + escapedCharacter, "i" ); |
698 regex = new RegExp( "^" + escapedCharacter, "i" ); |
694 |
699 |
695 return this.activeMenu |
700 return this.activeMenu |
696 .find( this.options.items ) |
701 .find( this.options.items ) |
697 |
702 |
698 // Only match on items, not dividers or other content (#10571) |
703 // Only match on items, not dividers or other content (#10571) |
699 .filter( ".ui-menu-item" ) |
704 .filter( ".ui-menu-item" ) |
700 .filter( function() { |
705 .filter( function() { |
701 return regex.test( |
706 return regex.test( |
702 String.prototype.trim.call( |
707 String.prototype.trim.call( |
703 $( this ).children( ".ui-menu-item-wrapper" ).text() ) ); |
708 $( this ).children( ".ui-menu-item-wrapper" ).text() ) ); |
704 } ); |
709 } ); |
705 } |
710 } |
706 } ); |
711 } ); |
707 |
712 |
708 } ); |
713 } ); |