]> source.dussan.org Git - jquery.git/commitdiff
Fix #9646. Cloned nodes shouldn't affect original in IE7. Close gh-947.
authorOleg <markelog@gmail.com>
Mon, 1 Oct 2012 23:36:54 +0000 (03:36 +0400)
committerDave Methvin <dave.methvin@gmail.com>
Thu, 13 Dec 2012 14:29:40 +0000 (09:29 -0500)
src/attributes.js
test/unit/attributes.js

index ffeab3c69dc160e031d3b76108b736371d2a0817..688282e094f9fadd5e885a289b210a143d8047d2 100644 (file)
@@ -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;
                }
        };
 
index 4d1a72b4fc1260ad5a42a1b67893d3b6c5d5a7e5..4fb3f776ed72e6f30c4684053622f9d40cd1813e 100644 (file)
@@ -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 name='tester' />");
+
+       input.attr("name");
+
+       strictEqual( input.clone( true ).attr( "name", "test" )[ 0 ].name, "test", "Name attribute should be changed on cloned element" );
+
+       div = jQuery("<div id='tester' />");
+       div.attr("id");
+
+       strictEqual( div.clone( true ).attr( "id", "test" )[ 0 ].id, "test", "Id attribute should be changed on cloned element" );
+
+       input = jQuery("<input value='tester' />");
+       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() {