Made it so that you can't change the type of an input element, having it throw an...
authorJohn Resig <jeresig@gmail.com>
Tue, 4 Sep 2007 04:17:14 +0000 (04:17 +0000)
committerJohn Resig <jeresig@gmail.com>
Tue, 4 Sep 2007 04:17:14 +0000 (04:17 +0000)
src/jquery/coreTest.js
src/jquery/jquery.js

index bb51acb..794bb5a 100644 (file)
@@ -232,7 +232,7 @@ test("attr(Hash)", function() {
 });
 
 test("attr(String, Object)", function() {
-       expect(8);
+       expect(12);
        var div = $("div");
        div.attr("foo", "bar");
        var pass = true;
@@ -255,6 +255,28 @@ test("attr(String, Object)", function() {
        ok( document.getElementById('text1').readOnly == false, 'Set readonly attribute' );
        $("#name").attr('maxlength', '5');
        ok( document.getElementById('name').maxLength == '5', 'Set maxlength attribute' );
+
+       reset();
+
+       var type = $("#check2").attr('type');
+       var thrown = false;
+       try {
+               $("#check2").attr('type','hidden');
+       } catch(e) {
+               thrown = true;
+       }
+       ok( thrown, "Exception thrown when trying to change type property" );
+       equals( type, $("#check2").attr('type'), "Verify that you can't change the type of an input element" );
+
+       var check = document.createElement("input");
+       var thrown = true;
+       try {
+               $(check).attr('type','checkbox');
+       } catch(e) {
+               thrown = false;
+       }
+       ok( thrown, "Exception thrown when trying to change type property" );
+       equals( "checkbox", $(check).attr('type'), "Verify that you can change the type of an input element that isn't in the DOM" );
 });
 
 test("attr(String, Object) - Loaded via XML document", function() {
index 4f3e03e..09e714c 100644 (file)
@@ -728,9 +728,15 @@ jQuery.extend({
                // IE elem.getAttribute passes even for style
                else if ( elem.tagName ) {
 
-                       if ( value != undefined ) elem.setAttribute( name, value );
+                       if ( value != undefined ) {
+                               if ( name == "type" && jQuery.nodeName(elem,"input") && elem.parentNode )
+                                       throw "type property can't be changed";
+                               elem.setAttribute( name, value );
+                       }
+
                        if ( jQuery.browser.msie && /href|src/.test(name) && !jQuery.isXMLDoc(elem) ) 
                                return elem.getAttribute( name, 2 );
+
                        return elem.getAttribute( name );
 
                // elem is actually elem.style ... set the style