From e0900a686d3c80054afd0ebe4c8908a8b5568444 Mon Sep 17 00:00:00 2001 From: timmywil Date: Fri, 25 Mar 2011 21:13:25 -0400 Subject: [PATCH] Fix issue where non-existant attributes on forms in IE6/7 were throwing errors --- src/attributes.js | 12 +++++++----- test/unit/attributes.js | 9 +++++---- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/attributes.js b/src/attributes.js index dd484402..b68b3edf 100644 --- a/src/attributes.js +++ b/src/attributes.js @@ -311,10 +311,11 @@ jQuery.extend({ return undefined; } else { - + // Check form objects in IE (multiple bugs related) - if ( isFormObjects ) { - elem.getAttributeNode( name ).nodeValue = value; + // Only use nodeValue if the attribute node exists on the form + if ( isFormObjects && (ret = elem.getAttributeNode( name )) ) { + ret.nodeValue = value; } else { elem.setAttribute( name, value ); } @@ -330,8 +331,9 @@ jQuery.extend({ // Check form objects in IE (multiple bugs related) if ( isFormObjects ) { - // Return undefined for empty string, which is the blank nodeValue in IE - ret = elem.getAttributeNode( name ).nodeValue || undefined; + // Return undefined if not specified instead of empty string + ret = elem.getAttributeNode( name ); + return ret && ret.specified ? ret.nodeValue : undefined; } else { ret = elem.getAttribute( name ); } diff --git a/test/unit/attributes.js b/test/unit/attributes.js index 16123771..0260a6c1 100644 --- a/test/unit/attributes.js +++ b/test/unit/attributes.js @@ -75,7 +75,7 @@ test("prop(String, Object)", function() { }); test("attr(String)", function() { - expect(25); + expect(26); equals( jQuery('#text1').attr('type'), "text", 'Check for type attribute' ); equals( jQuery('#radio1').attr('type'), "radio", 'Check for type attribute' ); @@ -88,6 +88,7 @@ test("attr(String)", function() { equals( jQuery('#name').attr('name'), "name", 'Check for name attribute' ); equals( jQuery('#text1').attr('name'), "action", 'Check for name attribute' ); ok( jQuery('#form').attr('action').indexOf("formaction") >= 0, 'Check for action attribute' ); + equals( jQuery('#form').attr('blah', 'blah').attr('blah'), 'blah', 'Set non-existant attribute on a form' ); // [7472] & [3113] (form contains an input with name="action" or name="id") var extras = jQuery('').appendTo('#testForm'); @@ -214,7 +215,7 @@ test("attr(String, Object)", function() { td.attr("colspan", "2"); equals( td[0].colSpan, 2, "Check colspan is correctly set" ); table.attr("cellspacing", "2"); - equals( table[0].cellSpacing, 2, "Check cellspacing is correctly set" ); + equals( table[0].cellSpacing, "2", "Check cellspacing is correctly set" ); // for #1070 jQuery("#name").attr('someAttr', '0'); @@ -385,9 +386,9 @@ test("attr('tabindex', value)", function() { }); test("removeAttr(String)", function() { - expect(1); + expect(2); equals( jQuery('#mark').removeAttr( "class" )[0].className, "", "remove class" ); - + equals( jQuery('#form').removeAttr('id').attr('id'), undefined, 'Remove id' ); }); test("removeProp(String)", function() {