]> source.dussan.org Git - jquery.git/commitdiff
If no hook is provided, and a boolean property exists, use that to return an attribut...
authorJohn Resig <jeresig@gmail.com>
Wed, 4 May 2011 01:44:42 +0000 (21:44 -0400)
committerJohn Resig <jeresig@gmail.com>
Wed, 4 May 2011 01:44:42 +0000 (21:44 -0400)
src/attributes.js
test/unit/attributes.js

index 2da2e16397717d27a1ad0a27541ffa17b3a3179f..9db69abcc84e0dc003fa1a19ec2518f8a83663c1 100644 (file)
@@ -285,8 +285,7 @@ jQuery.extend({
        
        attrFix: {
                // Always normalize to ensure hook usage
-               tabindex: "tabIndex",
-               readonly: "readOnly"
+               tabindex: "tabIndex"
        },
        
        attr: function( elem, name, value, pass ) {
@@ -327,20 +326,25 @@ jQuery.extend({
 
                                // Set boolean attributes to the same name
                                if ( value === true && !rspecial.test( name ) ) {
-                                       value = name;
+                                       value = name.toLowerCase();
                                }
 
                                elem.setAttribute( name, "" + value );
                                return value;
                        }
 
+               } else if ( hooks && "get" in hooks && notxml ) {
+                       return hooks.get( elem, name );
+
                } else {
+                       var boolProp = elem[ jQuery.propFix[ name ] || name ];
 
-                       if ( hooks && "get" in hooks && notxml ) {
-                               return hooks.get( elem, name );
+                       if ( typeof boolProp === "boolean" ) {
+                               return boolProp ?
+                                       name.toLowerCase() :
+                                       undefined;
 
                        } else {
-
                                ret = elem.getAttribute( name );
 
                                // Non-existent attributes return null, we normalize to undefined
@@ -399,7 +403,9 @@ jQuery.extend({
                }
        },
        
-       propFix: {},
+       propFix: {
+               readonly: "readOnly"
+       },
        
        prop: function( elem, name, value ) {
                var nType = elem.nodeType;
@@ -441,6 +447,7 @@ jQuery.extend({
 // IE6/7 do not support getting/setting some attributes with get/setAttribute
 if ( !jQuery.support.getSetAttribute ) {
        jQuery.attrFix = jQuery.extend( jQuery.attrFix, {
+               readonly: "readOnly",
                "for": "htmlFor",
                "class": "className",
                maxlength: "maxLength",
index b1cfe3db2490ed86f01ae6552aec7a8b304e97a3..f93cb2a6a22673686646de86c590607b7dc94c86 100644 (file)
@@ -28,8 +28,7 @@ test("jQuery.attrFix integrity test", function() {
                };
        } else {
                propsShouldBe = {
-                       tabindex: "tabIndex",
-                       readonly: "readOnly"
+                       tabindex: "tabIndex"
                };
        }
 
@@ -181,7 +180,7 @@ test("attr(Hash)", function() {
 });
 
 test("attr(String, Object)", function() {
-       expect(35);
+       expect(55);
 
        var div = jQuery("div").attr("foo", "bar"),
                fail = false;
@@ -204,12 +203,38 @@ test("attr(String, Object)", function() {
        equals( jQuery("#name").attr("name"), undefined, "Remove name attribute" );
        jQuery("#check2").attr("checked", true);
        equals( document.getElementById("check2").checked, true, "Set checked attribute" );
+       equals( jQuery("#check2").prop("checked"), true, "Set checked attribute" );
+       equals( jQuery("#check2").attr("checked"), "checked", "Set checked attribute" );
        jQuery("#check2").attr("checked", false);
        equals( document.getElementById("check2").checked, false, "Set checked attribute" );
+       equals( jQuery("#check2").prop("checked"), false, "Set checked attribute" );
+       equals( jQuery("#check2").attr("checked"), undefined, "Set checked attribute" );
        jQuery("#text1").attr("readonly", true);
        equals( document.getElementById("text1").readOnly, true, "Set readonly attribute" );
+       equals( jQuery("#text1").prop("readOnly"), true, "Set readonly attribute" );
+       equals( jQuery("#text1").attr("readonly"), "readonly", "Set readonly attribute" );
        jQuery("#text1").attr("readonly", false);
        equals( document.getElementById("text1").readOnly, false, "Set readonly attribute" );
+       equals( jQuery("#text1").prop("readOnly"), false, "Set readonly attribute" );
+       equals( jQuery("#text1").attr("readonly"), undefined, "Set readonly attribute" );
+
+       jQuery("#check2").prop("checked", true);
+       equals( document.getElementById("check2").checked, true, "Set checked attribute" );
+       equals( jQuery("#check2").prop("checked"), true, "Set checked attribute" );
+       equals( jQuery("#check2").attr("checked"), "checked", "Set checked attribute" );
+       jQuery("#check2").prop("checked", false);
+       equals( document.getElementById("check2").checked, false, "Set checked attribute" );
+       equals( jQuery("#check2").prop("checked"), false, "Set checked attribute" );
+       equals( jQuery("#check2").attr("checked"), undefined, "Set checked attribute" );
+       jQuery("#text1").prop("readOnly", true);
+       equals( document.getElementById("text1").readOnly, true, "Set readonly attribute" );
+       equals( jQuery("#text1").prop("readOnly"), true, "Set readonly attribute" );
+       equals( jQuery("#text1").attr("readonly"), "readonly", "Set readonly attribute" );
+       jQuery("#text1").prop("readOnly", false);
+       equals( document.getElementById("text1").readOnly, false, "Set readonly attribute" );
+       equals( jQuery("#text1").prop("readOnly"), false, "Set readonly attribute" );
+       equals( jQuery("#text1").attr("readonly"), undefined, "Set readonly attribute" );
+
        jQuery("#name").attr("maxlength", "5");
        equals( document.getElementById("name").maxLength, 5, "Set maxlength attribute" );
        jQuery("#name").attr("maxLength", "10");
@@ -919,4 +944,4 @@ test("addClass, removeClass, hasClass", function() {
        ok( jq.hasClass("cla.ss3")==false, "Check the dotted class has been removed" );
        jq.removeClass("class4");
        ok( jq.hasClass("class4")==false, "Check the class has been properly removed" );
-});
\ No newline at end of file
+});