}
}
},
- 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: {
}
} 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 {
}
},
- 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 ) {
parent.parentNode.selectedIndex;
}
}
+ return null;
}
});
}
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"),