Skip to content
Permalink
Browse files

Adjust tabIndex propHook for modern browsers and return -1 where appr…

…opriate. Close gh-1228.
  • Loading branch information...
markelog authored and timmywil committed Apr 9, 2013
1 parent 52394ba commit f1ba486ee3faeb70faeec1688b79ed085dd6a102
Showing with 25 additions and 27 deletions.
  1. +10 −23 src/attributes.js
  2. +6 −0 test/index.html
  3. +9 −4 test/unit/attributes.js
@@ -1,8 +1,7 @@
var nodeHook, boolHook,
rclass = /[\t\r\n]/g,
rreturn = /\r/g,
rfocusable = /^(?:input|select|textarea|button|object)$/i,
rclickable = /^(?:a|area)$/i;
rfocusable = /^(?:input|select|textarea|button)$/i;

jQuery.fn.extend({
attr: function( name, value ) {
@@ -395,35 +394,23 @@ jQuery.extend({
}

if ( value !== undefined ) {
if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
return ret;

} else {
return ( elem[ name ] = value );
}
return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?
ret :
( elem[ name ] = value );

} else {
if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
return ret;

} else {
return elem[ name ];
}
return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ?
ret :
elem[ name ];
}
},

propHooks: {
tabIndex: {
get: function( elem ) {
// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
var attributeNode = elem.getAttributeNode("tabindex");

return attributeNode && attributeNode.specified ?
parseInt( attributeNode.value, 10 ) :
rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
0 :
undefined;
return elem.hasAttribute( "tabindex" ) || rfocusable.test( elem.nodeName ) || elem.href ?
elem.tabIndex :
-1;
}
}
}
@@ -273,6 +273,12 @@
<span>...</span><a id="linkWithNoHrefWithNoTabIndex">Eat a burger</a><span>...</span>
<span>...</span><a id="linkWithNoHrefWithTabIndex" tabindex="1">Eat some funyuns</a><span>...</span>
<span>...</span><a id="linkWithNoHrefWithNegativeTabIndex" tabindex="-1">Eat some funyuns</a><span>...</span>
<input id="inputWithoutTabIndex"/>
<button id="buttonWithoutTabIndex"></button>
<textarea id="textareaWithoutTabIndex"></textarea>
<menu type="popup">
<menuitem id="menuitemWithoutTabIndex" command="submitbutton" default/>
</menu>
</div>

<div id="liveHandlerOrder">
@@ -683,19 +683,24 @@ test( "prop(String, Object)", function() {
});

test( "prop('tabindex')", function() {
expect( 8 );
expect( 11 );

// inputs without tabIndex attribute
equal( jQuery("#inputWithoutTabIndex").prop("tabindex"), 0, "input without tabindex" );
equal( jQuery("#buttonWithoutTabIndex").prop("tabindex"), 0, "button without tabindex" );
equal( jQuery("#textareaWithoutTabIndex").prop("tabindex"), 0, "textarea without tabindex" );

// elements not natively tabbable
equal( jQuery("#listWithTabIndex").prop("tabindex"), 5, "not natively tabbable, with tabindex set to 0" );
equal( jQuery("#divWithNoTabIndex").prop("tabindex"), undefined, "not natively tabbable, no tabindex set" );
equal( jQuery("#divWithNoTabIndex").prop("tabindex"), -1, "not natively tabbable, no tabindex set" );

// anchor with href
equal( jQuery("#linkWithNoTabIndex").prop("tabindex"), 0, "anchor with href, no tabindex set" );
equal( jQuery("#linkWithTabIndex").prop("tabindex"), 2, "anchor with href, tabindex set to 2" );
equal( jQuery("#linkWithNegativeTabIndex").prop("tabindex"), -1, "anchor with href, tabindex set to -1" );

// anchor without href
equal( jQuery("#linkWithNoHrefWithNoTabIndex").prop("tabindex"), undefined, "anchor without href, no tabindex set" );
equal( jQuery("#linkWithNoHrefWithNoTabIndex").prop("tabindex"), -1, "anchor without href, no tabindex set" );
equal( jQuery("#linkWithNoHrefWithTabIndex").prop("tabindex"), 1, "anchor without href, tabindex set to 2" );
equal( jQuery("#linkWithNoHrefWithNegativeTabIndex").prop("tabindex"), -1, "anchor without href, no tabindex set" );
});
@@ -705,7 +710,7 @@ test( "prop('tabindex', value)", 10, function() {
var clone,
element = jQuery("#divWithNoTabIndex");

equal( element.prop("tabindex"), undefined, "start with no tabindex" );
equal( element.prop("tabindex"), -1, "start with no tabindex" );

// set a positive string
element.prop( "tabindex", "1" );

0 comments on commit f1ba486

Please sign in to comment.
You can’t perform that action at this time.