wp/wp-includes/js/jquery/ui/menu.js
changeset 21 48c4eec2b7e6
parent 19 3d72ae0968f4
equal deleted inserted replaced
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 } );