From 13651f296d14b2400d703d1945065c0373862eb5 Mon Sep 17 00:00:00 2001 From: Oleg Date: Tue, 2 Oct 2012 03:36:54 +0400 Subject: [PATCH] Fix #9646. Cloned nodes shouldn't affect original in IE7. Close gh-947. --- src/attributes.js | 10 +++++++++- test/unit/attributes.js | 24 ++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/attributes.js b/src/attributes.js index ffeab3c69..688282e09 100644 --- a/src/attributes.js +++ b/src/attributes.js @@ -522,7 +522,15 @@ if ( !getSetAttribute ) { ret = elem.ownerDocument.createAttribute( name ); elem.setAttributeNode( ret ); } - return ( ret.value = value + "" ); + + ret.value = value += ""; + + // Break association with cloned elements (#9646) + if ( name !== "value" && value !== elem.getAttribute( name ) ) { + elem.setAttribute( name, value ); + } + + return value; } }; diff --git a/test/unit/attributes.js b/test/unit/attributes.js index 4d1a72b4f..4fb3f776e 100644 --- a/test/unit/attributes.js +++ b/test/unit/attributes.js @@ -156,6 +156,30 @@ test( "attr(String)", function() { $form = jQuery("#form").attr( "enctype", "multipart/form-data" ); equal( $form.prop("enctype"), "multipart/form-data", "Set the enctype of a form (encoding in IE6/7 #6743)" ); + +}); + +test( "attr(String) on cloned elements, #9646", function() { + expect( 4 ); + + var div, + input = jQuery(""); + + input.attr("name"); + + strictEqual( input.clone( true ).attr( "name", "test" )[ 0 ].name, "test", "Name attribute should be changed on cloned element" ); + + div = jQuery("
"); + div.attr("id"); + + strictEqual( div.clone( true ).attr( "id", "test" )[ 0 ].id, "test", "Id attribute should be changed on cloned element" ); + + input = jQuery(""); + input.attr("value"); + + strictEqual( input.clone( true ).attr( "value", "test" )[ 0 ].value, "test", "Value attribute should be changed on cloned element" ); + + strictEqual( input.clone( true ).attr( "value", 42 )[ 0 ].value, "42", "Value attribute should be changed on cloned element" ); }); test( "attr(String) in XML Files", function() {