| 120 | |
| 121 | // selectors |
| 122 | function focusable( element, isTabIndexNotNaN ) { |
| 123 | var map, mapName, img, |
| 124 | nodeName = element.nodeName.toLowerCase(); |
| 125 | if ( "area" === nodeName ) { |
| 126 | map = element.parentNode; |
| 127 | mapName = map.name; |
| 128 | if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) { |
| 129 | return false; |
| 130 | } |
| 131 | img = $( "img[usemap=#" + mapName + "]" )[0]; |
| 132 | return !!img && visible( img ); |
| 133 | } |
| 134 | return ( /input|select|textarea|button|object/.test( nodeName ) ? |
| 135 | !element.disabled : |
| 136 | "a" === nodeName ? |
| 137 | element.href || isTabIndexNotNaN : |
| 138 | isTabIndexNotNaN) && |
| 139 | // the element and all of its ancestors must be visible |
| 140 | visible( element ); |
| 141 | } |
| 142 | |
| 143 | function visible( element ) { |
| 144 | return $.expr.filters.visible( element ) && |