| 130 | |
| 131 | // selectors |
| 132 | function focusable( element, isTabIndexNotNaN ) { |
| 133 | var map, mapName, img, |
| 134 | nodeName = element.nodeName.toLowerCase(); |
| 135 | if ( "area" === nodeName ) { |
| 136 | map = element.parentNode; |
| 137 | mapName = map.name; |
| 138 | if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) { |
| 139 | return false; |
| 140 | } |
| 141 | img = $( "img[usemap=#" + mapName + "]" )[0]; |
| 142 | return !!img && visible( img ); |
| 143 | } |
| 144 | return ( /input|select|textarea|button|object/.test( nodeName ) ? |
| 145 | !element.disabled : |
| 146 | "a" === nodeName ? |
| 147 | element.href || isTabIndexNotNaN : |
| 148 | isTabIndexNotNaN) && |
| 149 | // the element and all of its ancestors must be visible |
| 150 | visible( element ); |
| 151 | } |
| 152 | |
| 153 | function visible( element ) { |
| 154 | return $.expr.filters.visible( element ) && |