Test for a colon in attribute names for IE6/7. Fixes #1591.

This commit is contained in:
timmywil 2011-05-01 17:09:50 -04:00
parent e2bace8fa1
commit 24a8ffb3ea
2 changed files with 12 additions and 3 deletions

View file

@ -7,6 +7,7 @@ var rclass = /[\n\t\r]/g,
rfocusable = /^(?:button|input|object|select|textarea)$/i, rfocusable = /^(?:button|input|object|select|textarea)$/i,
rclickable = /^a(?:rea)?$/i, rclickable = /^a(?:rea)?$/i,
rspecial = /^(?:data-|aria-)/, rspecial = /^(?:data-|aria-)/,
rinvalidChar = /\:/,
formHook; formHook;
jQuery.fn.extend({ jQuery.fn.extend({
@ -308,7 +309,10 @@ jQuery.extend({
// Get the appropriate hook, or the formHook // Get the appropriate hook, or the formHook
// if getSetAttribute is not supported and we have form objects in IE6/7 // if getSetAttribute is not supported and we have form objects in IE6/7
hooks = jQuery.attrHooks[ name ] || ( jQuery.nodeName( elem, "form" ) && formHook ); hooks = jQuery.attrHooks[ name ] ||
( formHook && (jQuery.nodeName( elem, "form" ) || rinvalidChar.test( name )) ?
formHook :
undefined );
if ( value !== undefined ) { if ( value !== undefined ) {
@ -451,10 +455,11 @@ if ( !jQuery.support.getSetAttribute ) {
// Use this for any attribute on a form in IE6/7 // Use this for any attribute on a form in IE6/7
formHook = jQuery.attrHooks.name = jQuery.attrHooks.value = jQuery.valHooks.button = { formHook = jQuery.attrHooks.name = jQuery.attrHooks.value = jQuery.valHooks.button = {
get: function( elem, name ) { get: function( elem, name ) {
var ret;
if ( name === "value" && !jQuery.nodeName( elem, "button" ) ) { if ( name === "value" && !jQuery.nodeName( elem, "button" ) ) {
return elem.getAttribute( name ); return elem.getAttribute( name );
} }
var ret = elem.getAttributeNode( name ); ret = elem.getAttributeNode( name );
// Return undefined if not specified instead of empty string // Return undefined if not specified instead of empty string
return ret && ret.specified ? return ret && ret.specified ?
ret.nodeValue : ret.nodeValue :

View file

@ -77,7 +77,7 @@ test("prop(String, Object)", function() {
}); });
test("attr(String)", function() { test("attr(String)", function() {
expect(35); expect(37);
equals( jQuery("#text1").attr("type"), "text", "Check for type attribute" ); equals( jQuery("#text1").attr("type"), "text", "Check for type attribute" );
equals( jQuery("#radio1").attr("type"), "radio", "Check for type attribute" ); equals( jQuery("#radio1").attr("type"), "radio", "Check for type attribute" );
@ -142,6 +142,10 @@ test("attr(String)", function() {
equals( $button.attr("value"), "foobar", "Value retrieval on a button does not return innerHTML" ); equals( $button.attr("value"), "foobar", "Value retrieval on a button does not return innerHTML" );
equals( $button.attr("value", "baz").html(), "text", "Setting the value does not change innerHTML" ); equals( $button.attr("value", "baz").html(), "text", "Setting the value does not change innerHTML" );
// Attributes with a colon on a table element (#1591)
equals( jQuery("#table").attr("test:attrib"), undefined, "Retrieving a non-existent attribute on a table with a colon does not throw an error." );
equals( jQuery("#table").attr("test:attrib", "foobar").attr("test:attrib"), "foobar", "Setting an attribute on a table with a colon does not throw an error." );
ok( jQuery("<div/>").attr("doesntexist") === undefined, "Make sure undefined is returned when no attribute is found." ); ok( jQuery("<div/>").attr("doesntexist") === undefined, "Make sure undefined is returned when no attribute is found." );
ok( jQuery().attr("doesntexist") === undefined, "Make sure undefined is returned when no element is there." ); ok( jQuery().attr("doesntexist") === undefined, "Make sure undefined is returned when no element is there." );
}); });