From fd4ee2a39752cc40e35fbcb1bfd48634ffe4bfd4 Mon Sep 17 00:00:00 2001 From: timmywil Date: Thu, 4 Aug 2011 15:47:53 -0400 Subject: [PATCH] Make the tabIndex hook first a propHook and add it to attrHooks for back-compat reasons. Fixes #9979. --- src/attributes.js | 35 +++++++++++++++----------- test/unit/attributes.js | 55 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 15 deletions(-) diff --git a/src/attributes.js b/src/attributes.js index d4d923d9b..df87e23b4 100644 --- a/src/attributes.js +++ b/src/attributes.js @@ -405,19 +405,6 @@ jQuery.extend({ } } }, - 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; - } - }, // Use the value property for back compat // Use the formHook for button elements in IE6/7 (#1954) value: { @@ -480,7 +467,7 @@ jQuery.extend({ } } else { - if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== undefined ) { + if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { return ret; } else { @@ -489,9 +476,26 @@ jQuery.extend({ } }, - propHooks: {} + 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; + } + } + } }); +// Add the tabindex propHook to attrHooks for back-compat +jQuery.attrHooks.tabIndex = jQuery.propHooks.tabIndex; + // Hook for boolean attributes boolHook = { get: function( elem, name ) { @@ -604,6 +608,7 @@ if ( !jQuery.support.optSelected ) { parent.parentNode.selectedIndex; } } + return null; } }); } diff --git a/test/unit/attributes.js b/test/unit/attributes.js index f3c61b9eb..1a390a4c5 100644 --- a/test/unit/attributes.js +++ b/test/unit/attributes.js @@ -527,6 +527,61 @@ test("prop(String, Object)", function() { jQuery( document ).removeProp("nonexisting"); }); +test("prop('tabindex')", function() { + expect(8); + + // elements not natively tabbable + equals(jQuery("#listWithTabIndex").prop("tabindex"), 5, "not natively tabbable, with tabindex set to 0"); + equals(jQuery("#divWithNoTabIndex").prop("tabindex"), undefined, "not natively tabbable, no tabindex set"); + + // anchor with href + equals(jQuery("#linkWithNoTabIndex").prop("tabindex"), 0, "anchor with href, no tabindex set"); + equals(jQuery("#linkWithTabIndex").prop("tabindex"), 2, "anchor with href, tabindex set to 2"); + equals(jQuery("#linkWithNegativeTabIndex").prop("tabindex"), -1, "anchor with href, tabindex set to -1"); + + // anchor without href + equals(jQuery("#linkWithNoHrefWithNoTabIndex").prop("tabindex"), undefined, "anchor without href, no tabindex set"); + equals(jQuery("#linkWithNoHrefWithTabIndex").prop("tabindex"), 1, "anchor without href, tabindex set to 2"); + equals(jQuery("#linkWithNoHrefWithNegativeTabIndex").prop("tabindex"), -1, "anchor without href, no tabindex set"); +}); + +test("prop('tabindex', value)", function() { + expect(9); + + var element = jQuery("#divWithNoTabIndex"); + equals(element.prop("tabindex"), undefined, "start with no tabindex"); + + // set a positive string + element.prop("tabindex", "1"); + equals(element.prop("tabindex"), 1, "set tabindex to 1 (string)"); + + // set a zero string + element.prop("tabindex", "0"); + equals(element.prop("tabindex"), 0, "set tabindex to 0 (string)"); + + // set a negative string + element.prop("tabindex", "-1"); + equals(element.prop("tabindex"), -1, "set tabindex to -1 (string)"); + + // set a positive number + element.prop("tabindex", 1); + equals(element.prop("tabindex"), 1, "set tabindex to 1 (number)"); + + // set a zero number + element.prop("tabindex", 0); + equals(element.prop("tabindex"), 0, "set tabindex to 0 (number)"); + + // set a negative number + element.prop("tabindex", -1); + equals(element.prop("tabindex"), -1, "set tabindex to -1 (number)"); + + element = jQuery("#linkWithTabIndex"); + equals(element.prop("tabindex"), 2, "start with tabindex 2"); + + element.prop("tabindex", -1); + equals(element.prop("tabindex"), -1, "set negative tabindex"); +}); + test("removeProp(String)", function() { expect(6); var attributeNode = document.createAttribute("irrelevant"), -- 2.39.5