]> source.dussan.org Git - jquery.git/commitdiff
Now passes in IE8, changed around $.hasAttr and switched the attrHook for selected...
authortimmywil <tim.willison@thisismedium.com>
Thu, 10 Mar 2011 01:20:53 +0000 (20:20 -0500)
committertimmywil <tim.willison@thisismedium.com>
Sun, 3 Apr 2011 23:13:38 +0000 (19:13 -0400)
src/attributes.js
test/unit/attributes.js

index cb8128d25a595935ec1043e040a9cffdbe10b87a..8de5cf80c2c05f248ff32870a197324db858c562 100644 (file)
@@ -278,10 +278,11 @@ jQuery.extend({
        // TODO: Check to see if any of these are needed anymore?
        // If not, it may be good to standardize on all-lowercase names instead
        attrFix: {
+               
        },
 
        attr: function( elem, name, value, pass ) {
-
+               
                // don't get/set attributes on text, comment and attribute nodes
                if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || elem.nodeType === 2 ) {
                        return undefined;
@@ -294,9 +295,6 @@ jQuery.extend({
                var ret,
                        notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ),
                        hooks;
-                       
-               // Try to normalize/fix the name
-               name = notxml && jQuery.attrFix[ name ] || name;
                
                hooks = jQuery.attrHooks[ name ];
                
@@ -312,9 +310,7 @@ jQuery.extend({
                        } else {
                                // convert the value to a string (all browsers do this but IE) see #1070
                                value = "" + value;
-                               
                                elem.setAttribute( name, value );
-                               
                                return value;
                        }
                        
@@ -332,14 +328,24 @@ jQuery.extend({
                                var attr = elem.getAttribute( name );
 
                                // Non-existent attributes return null, we normalize to undefined
-                               return attr === null ? undefined : attr;
+                               return attr === null || attr === "undefined" ? undefined : attr;
                        }
                }
        },
        
        hasAttr: function( elem, name ) {
-               // Blackberry 4.7 returns "" from getAttribute #6938
-               return elem && elem.attributes[ name ] || (elem.hasAttribute && elem.hasAttribute( name ));
+               var inAttrs, attrs = elem.attributes;
+               
+               if ( elem.hasAttribute ) {
+                       return elem.hasAttribute( name );
+               } else {
+                       // Browsers do not understand the associative indexes, look for the name in elem.attributes.name
+                       for ( var i = 0, l = attrs.length; i < l; i++ ) {
+                               if ( attrs[i]["name"] === name ) {
+                                       return true;
+                               }
+                       }
+               }
        },
        
        attrHooks: {
@@ -369,9 +375,16 @@ jQuery.extend({
        
        // TODO: Check to see if we really need any here.
        propFix: {
+               
        },
        
        prop: function( elem, name, value ) {
+               
+               // don't get/set properties on text, comment and attribute nodes
+               if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || elem.nodeType === 2 ) {
+                       return undefined;
+               }
+               
                var ret, hooks, notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem );
                
                // Try to normalize/fix the name
@@ -440,13 +453,17 @@ if ( !jQuery.support.style ) {
 // Safari mis-reports the default selected property of an option
 // Accessing the parent's selectedIndex property fixes it
 if ( !jQuery.support.optSelected ) {
-       jQuery.attrHooks.selected = {
+       
+       jQuery.propHooks.selected = {
                get: function( elem ) {
                        var parent = elem.parentNode;
                        
                        if ( parent ) {
                                parent.selectedIndex;
-
+                               
+                               // TODO: We may need an attrHook for selected that simply defers to prop?
+                               // The attr is undefined if the option is created with createElement and not on the DOM
+                               
                                // Make sure that it also works with optgroups, see #5701
                                if ( parent.parentNode ) {
                                        parent.parentNode.selectedIndex;
index d4284556beb215bf64520505e68aeed57eb601a6..af423e346530dafc41d4d97f70a9f54cc7bb62a7 100644 (file)
@@ -3,31 +3,6 @@ module("attributes", { teardown: moduleTeardown });
 var bareObj = function(value) { return value; };
 var functionReturningObj = function(value) { return (function() { return value; }); };
 
-// test("jQuery.props: integrity test", function() {
-// 
-//   expect(1);
-// 
-//   //  This must be maintained and equal jQuery.props
-//   //  Ensure that accidental or erroneous property
-//   //  overwrites don't occur
-//   //  This is simply for better code coverage and future proofing.
-//   var propsShouldBe = {
-//     "for": "htmlFor",
-//     "class": "className",
-//     readonly: "readOnly",
-//     maxlength: "maxLength",
-//     cellspacing: "cellSpacing",
-//     rowspan: "rowSpan",
-//     colspan: "colSpan",
-//     tabindex: "tabIndex",
-//     usemap: "useMap",
-//     frameborder: "frameBorder"
-//   };
-// 
-//   same(propsShouldBe, jQuery.props, "jQuery.props passes integrity check");
-// 
-// });
-
 test("prop", function() {
        equals( jQuery('#text1').prop('value'), "Test", 'Check for value attribute' );
        equals( jQuery('#text1').prop('value', "Test2").prop('defaultValue'), "Test", 'Check for defaultValue attribute' );
@@ -41,11 +16,12 @@ test("prop", function() {
        body.foo = 'bar';
        equals( $body.prop('foo'), 'bar', 'Make sure the expando is preferred over the dom attribute' );
        body.foo = undefined;
-       ok( $body.attr('foo') === undefined, 'Make sure the expando is preferred over the dom attribute, even if undefined' );
+       ok( $body.prop('foo') === undefined, 'Make sure the expando is preferred over the dom attribute, even if undefined' );
        
        var select = document.createElement("select"), optgroup = document.createElement("optgroup"), option = document.createElement("option");
        optgroup.appendChild( option );
        select.appendChild( optgroup );
+       
        equals( jQuery(option).prop("selected"), true, "Make sure that a single option is selected, even when in an optgroup." );
        equals( jQuery(document).prop("nodeName"), "#document", "prop works correctly on document nodes (bug #7451)." );
        
@@ -85,7 +61,7 @@ test("attr(String)", function() {
        // Related to [5574] and [5683]
        var body = document.body, $body = jQuery(body);
 
-       ok( $body.attr('foo') === undefined, 'Make sure that a non existent attribute returns undefined' );
+       strictEqual( $body.attr('foo'), undefined, 'Make sure that a non existent attribute returns undefined' );
 
        body.setAttribute('foo', 'baz');
        equals( $body.attr('foo'), 'baz', 'Make sure the dom attribute is retrieved when no expando is found' );
@@ -118,8 +94,8 @@ if ( !isLocal ) {
 
 test("attr(String, Function)", function() {
        expect(2);
-       equals( jQuery('#text1').attr('value', function() { return this.id ;})[0].value, "text1", "Set value from id" );
-       equals( jQuery('#text1').attr('title', function(i) { return i }).attr('title'), "0", "Set value with an index");
+       equals( jQuery('#text1').attr('value', function() { return this.id})[0].value, "text1", "Set value from id" );
+       equals( jQuery('#text1').attr('title', function(i) { return i; }).attr('title'), "0", "Set value with an index");
 });
 
 test("attr(Hash)", function() {