From 5eecb13fa3391870e904548f03d8a509117984f3 Mon Sep 17 00:00:00 2001 From: timmywil Date: Wed, 9 Mar 2011 20:20:53 -0500 Subject: [PATCH] Now passes in IE8, changed around $.hasAttr and switched the attrHook for selected to be a propHook --- src/attributes.js | 39 ++++++++++++++++++++++++++++----------- test/unit/attributes.js | 34 +++++----------------------------- 2 files changed, 33 insertions(+), 40 deletions(-) diff --git a/src/attributes.js b/src/attributes.js index cb8128d2..8de5cf80 100644 --- a/src/attributes.js +++ b/src/attributes.js @@ -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; diff --git a/test/unit/attributes.js b/test/unit/attributes.js index d4284556..af423e34 100644 --- a/test/unit/attributes.js +++ b/test/unit/attributes.js @@ -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() {