// 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;
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 ];
} else {
// convert the value to a string (all browsers do this but IE) see #1070
value = "" + value;
-
elem.setAttribute( name, value );
-
return value;
}
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: {
// 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
// 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;
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' );
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)." );
// 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' );
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() {