@@ -174,6 +174,27 @@ $.each( [ "Width", "Height" ], function( i, name ) {
174
174
} ) ;
175
175
176
176
// selectors
177
+ function focusable ( element , isTabIndexNotNaN ) {
178
+ var nodeName = element . nodeName . toLowerCase ( ) ;
179
+ if ( "area" === nodeName ) {
180
+ var map = element . parentNode ,
181
+ mapName = map . name ,
182
+ img ;
183
+ if ( ! element . href || ! mapName || map . nodeName . toLowerCase ( ) !== "map" ) {
184
+ return false ;
185
+ }
186
+ img = $ ( "img[usemap=#" + mapName + "]" ) [ 0 ] ;
187
+ return ! ! img && visible ( img ) ;
188
+ }
189
+ return ( / i n p u t | s e l e c t | t e x t a r e a | b u t t o n | o b j e c t / . test ( nodeName )
190
+ ? ! element . disabled
191
+ : "a" == nodeName
192
+ ? element . href || isTabIndexNotNaN
193
+ : isTabIndexNotNaN )
194
+ // the element and all of its ancestors must be visible
195
+ && visible ( element ) ;
196
+ }
197
+
177
198
function visible ( element ) {
178
199
return ! $ ( element ) . parents ( ) . andSelf ( ) . filter ( function ( ) {
179
200
return $ . curCSS ( this , "visibility" ) === "hidden" ||
@@ -187,30 +208,13 @@ $.extend( $.expr[ ":" ], {
187
208
} ,
188
209
189
210
focusable : function ( element ) {
190
- var nodeName = element . nodeName . toLowerCase ( ) ,
191
- tabIndex = $ . attr ( element , "tabindex" ) ;
192
- if ( "area" === nodeName ) {
193
- var map = element . parentNode ,
194
- mapName = map . name ,
195
- img ;
196
- if ( ! element . href || ! mapName || map . nodeName . toLowerCase ( ) !== "map" ) {
197
- return false ;
198
- }
199
- img = $ ( "img[usemap=#" + mapName + "]" ) [ 0 ] ;
200
- return ! ! img && visible ( img ) ;
201
- }
202
- return ( / i n p u t | s e l e c t | t e x t a r e a | b u t t o n | o b j e c t / . test ( nodeName )
203
- ? ! element . disabled
204
- : "a" == nodeName
205
- ? element . href || ! isNaN ( tabIndex )
206
- : ! isNaN ( tabIndex ) )
207
- // the element and all of its ancestors must be visible
208
- && visible ( element ) ;
211
+ return focusable ( element , ! isNaN ( $ . attr ( element , "tabindex" ) ) ) ;
209
212
} ,
210
213
211
214
tabbable : function ( element ) {
212
- var tabIndex = $ . attr ( element , "tabindex" ) ;
213
- return ( isNaN ( tabIndex ) || tabIndex >= 0 ) && $ ( element ) . is ( ":focusable" ) ;
215
+ var tabIndex = $ . attr ( element , "tabindex" ) ,
216
+ isTabIndexNaN = isNaN ( tabIndex ) ;
217
+ return ( isTabIndexNaN || tabIndex >= 0 ) && focusable ( element , ! isTabIndexNaN ) ;
214
218
}
215
219
} ) ;
216
220
0 commit comments