Core: Move focusable into its own module

Ref #9647
This commit is contained in:
Alexander Schmitz 2015-07-16 09:09:14 -04:00
parent 4916487440
commit 475ccefd97
4 changed files with 69 additions and 35 deletions

View File

@ -1,7 +1,8 @@
define( [
"jquery",
"ui/core",
"ui/data"
"ui/data",
"ui/focusable"
], function( $ ) {
module( "core - selectors" );

View File

@ -22,6 +22,7 @@
"jquery",
"./data",
"./disable-selection",
"./focusable",
"./version"
], factory );
} else {
@ -180,44 +181,11 @@ $.fn.extend( {
}
} );
// selectors
function focusable( element, hasTabindex ) {
var map, mapName, img,
nodeName = element.nodeName.toLowerCase();
if ( "area" === nodeName ) {
map = element.parentNode;
mapName = map.name;
if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
return false;
}
img = $( "img[usemap='#" + mapName + "']" )[ 0 ];
return !!img && visible( img );
}
return ( /^(input|select|textarea|button|object)$/.test( nodeName ) ?
!element.disabled :
"a" === nodeName ?
element.href || hasTabindex :
hasTabindex ) &&
// the element and all of its ancestors must be visible
visible( element );
}
function visible( element ) {
return $.expr.filters.visible( element ) &&
!$( element ).parents().addBack().filter( function() {
return $.css( this, "visibility" ) === "hidden";
} ).length;
}
$.extend( $.expr[ ":" ], {
focusable: function( element ) {
return focusable( element, $.attr( element, "tabindex" ) != null );
},
tabbable: function( element ) {
var tabIndex = $.attr( element, "tabindex" ),
hasTabindex = tabIndex != null;
return ( !hasTabindex || tabIndex >= 0 ) && focusable( element, hasTabindex );
return ( !hasTabindex || tabIndex >= 0 ) && $.ui.focusable( element, hasTabindex );
}
} );

View File

@ -26,6 +26,7 @@
"./widget",
"./button",
"./draggable",
"./focusable",
"./mouse",
"./position",
"./resizable",

64
ui/focusable.js Normal file
View File

@ -0,0 +1,64 @@
/*!
* jQuery UI Focusable @VERSION
* http://jqueryui.com
*
* Copyright jQuery Foundation and other contributors
* Released under the MIT license.
* http://jquery.org/license
*/
//>>label: focusable
//>>group: Core
//>>description: Selects elements which can be focused.
//>>docs: http://api.jqueryui.com/focusable-selector/
( function( factory ) {
if ( typeof define === "function" && define.amd ) {
// AMD. Register as an anonymous module.
define( [ "jquery", "./version" ], factory );
} else {
// Browser globals
factory( jQuery );
}
} ( function( $ ) {
// selectors
$.ui.focusable = function( element, hasTabindex ) {
var map, mapName, img,
nodeName = element.nodeName.toLowerCase();
if ( "area" === nodeName ) {
map = element.parentNode;
mapName = map.name;
if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
return false;
}
img = $( "img[usemap='#" + mapName + "']" )[ 0 ];
return !!img && visible( img );
}
return ( /^(input|select|textarea|button|object)$/.test( nodeName ) ?
!element.disabled :
"a" === nodeName ?
element.href || hasTabindex :
hasTabindex ) &&
// the element and all of its ancestors must be visible
visible( element );
};
function visible( element ) {
return $.expr.filters.visible( element ) &&
!$( element ).parents().addBack().filter( function() {
return $.css( this, "visibility" ) === "hidden";
} ).length;
}
$.extend( $.expr[ ":" ], {
focusable: function( element ) {
return $.ui.focusable( element, $.attr( element, "tabindex" ) != null );
}
} );
return $.ui.focusable;
} ) );