2010-09-08 18:00:29 +02:00
|
|
|
(function( jQuery ) {
|
|
|
|
|
2010-12-01 21:31:22 +01:00
|
|
|
var rclass = /[\n\t\r]/g,
|
2011-04-29 04:24:40 +02:00
|
|
|
rspace = /\s+/,
|
2009-12-18 17:27:56 +01:00
|
|
|
rreturn = /\r/g,
|
2010-09-22 15:16:28 +02:00
|
|
|
rtype = /^(?:button|input)$/i,
|
|
|
|
rfocusable = /^(?:button|input|object|select|textarea)$/i,
|
|
|
|
rclickable = /^a(?:rea)?$/i,
|
2011-05-07 20:49:04 +02:00
|
|
|
rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
|
2011-05-01 23:09:50 +02:00
|
|
|
rinvalidChar = /\:/,
|
2011-05-05 18:17:08 +02:00
|
|
|
formHook, boolHook;
|
2009-12-14 22:24:28 +01:00
|
|
|
|
2009-03-18 22:15:38 +01:00
|
|
|
jQuery.fn.extend({
|
2009-03-23 00:25:03 +01:00
|
|
|
attr: function( name, value ) {
|
2010-03-23 17:12:16 +01:00
|
|
|
return jQuery.access( this, name, value, true, jQuery.attr );
|
2009-03-18 22:15:38 +01:00
|
|
|
},
|
|
|
|
|
2011-03-07 04:47:40 +01:00
|
|
|
removeAttr: function( name ) {
|
|
|
|
return this.each(function() {
|
2011-04-03 22:49:48 +02:00
|
|
|
jQuery.removeAttr( this, name );
|
2010-01-06 21:08:07 +01:00
|
|
|
});
|
|
|
|
},
|
2011-03-07 04:47:40 +01:00
|
|
|
|
|
|
|
prop: function( name, value ) {
|
|
|
|
return jQuery.access( this, name, value, true, jQuery.prop );
|
|
|
|
},
|
|
|
|
|
2011-03-07 04:47:40 +01:00
|
|
|
removeProp: function( name ) {
|
2011-05-04 17:40:46 +02:00
|
|
|
name = jQuery.propFix[ name ] || name;
|
2011-03-07 04:47:40 +01:00
|
|
|
return this.each(function() {
|
|
|
|
// try/catch handles cases where IE balks (such as removing a property on window)
|
|
|
|
try {
|
|
|
|
this[ name ] = undefined;
|
|
|
|
delete this[ name ];
|
|
|
|
} catch( e ) {}
|
|
|
|
});
|
|
|
|
},
|
2010-01-06 21:08:07 +01:00
|
|
|
|
2009-09-08 03:07:50 +02:00
|
|
|
addClass: function( value ) {
|
2011-03-08 18:07:05 +01:00
|
|
|
if ( jQuery.isFunction( value ) ) {
|
2010-01-06 21:08:07 +01:00
|
|
|
return this.each(function(i) {
|
|
|
|
var self = jQuery(this);
|
2011-03-08 18:07:05 +01:00
|
|
|
self.addClass( value.call(this, i, self.attr("class") || "") );
|
2009-12-10 06:15:49 +01:00
|
|
|
});
|
|
|
|
}
|
2009-12-10 05:57:19 +01:00
|
|
|
|
2009-09-08 03:07:50 +02:00
|
|
|
if ( value && typeof value === "string" ) {
|
2011-04-29 04:24:40 +02:00
|
|
|
var classNames = (value || "").split( rspace );
|
2009-09-08 03:07:50 +02:00
|
|
|
|
|
|
|
for ( var i = 0, l = this.length; i < l; i++ ) {
|
|
|
|
var elem = this[i];
|
|
|
|
|
|
|
|
if ( elem.nodeType === 1 ) {
|
|
|
|
if ( !elem.className ) {
|
|
|
|
elem.className = value;
|
2009-12-18 17:27:56 +01:00
|
|
|
|
2009-09-08 03:07:50 +02:00
|
|
|
} else {
|
2010-11-09 17:09:07 +01:00
|
|
|
var className = " " + elem.className + " ",
|
|
|
|
setClass = elem.className;
|
|
|
|
|
2009-09-08 03:07:50 +02:00
|
|
|
for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
|
|
|
|
if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) {
|
2010-02-13 20:30:27 +01:00
|
|
|
setClass += " " + classNames[c];
|
2009-09-08 03:07:50 +02:00
|
|
|
}
|
|
|
|
}
|
2010-02-13 20:30:27 +01:00
|
|
|
elem.className = jQuery.trim( setClass );
|
2009-09-08 03:07:50 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
|
|
|
|
removeClass: function( value ) {
|
2009-12-18 17:27:56 +01:00
|
|
|
if ( jQuery.isFunction(value) ) {
|
2010-01-06 21:08:07 +01:00
|
|
|
return this.each(function(i) {
|
|
|
|
var self = jQuery(this);
|
|
|
|
self.removeClass( value.call(this, i, self.attr("class")) );
|
2009-12-10 06:15:49 +01:00
|
|
|
});
|
|
|
|
}
|
2009-12-10 05:57:19 +01:00
|
|
|
|
2009-09-08 03:07:50 +02:00
|
|
|
if ( (value && typeof value === "string") || value === undefined ) {
|
2011-04-29 04:24:40 +02:00
|
|
|
var classNames = (value || "").split( rspace );
|
2009-09-08 03:07:50 +02:00
|
|
|
|
|
|
|
for ( var i = 0, l = this.length; i < l; i++ ) {
|
|
|
|
var elem = this[i];
|
|
|
|
|
|
|
|
if ( elem.nodeType === 1 && elem.className ) {
|
|
|
|
if ( value ) {
|
2009-12-14 22:24:28 +01:00
|
|
|
var className = (" " + elem.className + " ").replace(rclass, " ");
|
2009-09-08 03:07:50 +02:00
|
|
|
for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
|
|
|
|
className = className.replace(" " + classNames[c] + " ", " ");
|
|
|
|
}
|
2010-02-02 03:33:58 +01:00
|
|
|
elem.className = jQuery.trim( className );
|
2009-12-18 17:27:56 +01:00
|
|
|
|
2009-09-08 03:07:50 +02:00
|
|
|
} else {
|
|
|
|
elem.className = "";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
|
2010-01-06 21:23:30 +01:00
|
|
|
toggleClass: function( value, stateVal ) {
|
2010-11-09 17:09:07 +01:00
|
|
|
var type = typeof value,
|
|
|
|
isBool = typeof stateVal === "boolean";
|
2010-01-06 21:08:07 +01:00
|
|
|
|
2010-01-06 21:23:30 +01:00
|
|
|
if ( jQuery.isFunction( value ) ) {
|
2010-01-06 21:08:07 +01:00
|
|
|
return this.each(function(i) {
|
|
|
|
var self = jQuery(this);
|
2010-01-07 17:04:21 +01:00
|
|
|
self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal );
|
2010-01-06 21:08:07 +01:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2010-01-06 21:23:30 +01:00
|
|
|
return this.each(function() {
|
2010-01-06 21:08:07 +01:00
|
|
|
if ( type === "string" ) {
|
|
|
|
// toggle individual class names
|
2010-11-09 17:09:07 +01:00
|
|
|
var className,
|
|
|
|
i = 0,
|
|
|
|
self = jQuery( this ),
|
2010-01-06 21:23:30 +01:00
|
|
|
state = stateVal,
|
2011-04-29 04:24:40 +02:00
|
|
|
classNames = value.split( rspace );
|
2010-01-06 21:08:07 +01:00
|
|
|
|
|
|
|
while ( (className = classNames[ i++ ]) ) {
|
|
|
|
// check each className given, space seperated list
|
2010-01-06 21:23:30 +01:00
|
|
|
state = isBool ? state : !self.hasClass( className );
|
|
|
|
self[ state ? "addClass" : "removeClass" ]( className );
|
2010-01-06 21:08:07 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
} else if ( type === "undefined" || type === "boolean" ) {
|
|
|
|
if ( this.className ) {
|
|
|
|
// store className if set
|
2011-01-09 22:52:33 +01:00
|
|
|
jQuery._data( this, "__className__", this.className );
|
2010-01-06 21:08:07 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// toggle whole className
|
2011-01-09 22:52:33 +01:00
|
|
|
this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
|
2010-01-06 21:08:07 +01:00
|
|
|
}
|
|
|
|
});
|
|
|
|
},
|
|
|
|
|
2009-03-18 22:15:38 +01:00
|
|
|
hasClass: function( selector ) {
|
2009-09-08 03:07:50 +02:00
|
|
|
var className = " " + selector + " ";
|
|
|
|
for ( var i = 0, l = this.length; i < l; i++ ) {
|
2009-12-14 22:24:28 +01:00
|
|
|
if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
|
2009-09-08 03:07:50 +02:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
2009-03-18 22:15:38 +01:00
|
|
|
},
|
|
|
|
|
|
|
|
val: function( value ) {
|
2011-04-06 04:40:12 +02:00
|
|
|
var hooks, ret,
|
2011-04-02 23:05:04 +02:00
|
|
|
elem = this[0];
|
|
|
|
|
2010-08-21 04:32:34 +02:00
|
|
|
if ( !arguments.length ) {
|
2009-03-18 22:15:38 +01:00
|
|
|
if ( elem ) {
|
2011-04-02 23:05:04 +02:00
|
|
|
hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ];
|
2009-03-18 22:15:38 +01:00
|
|
|
|
2011-04-18 00:15:20 +02:00
|
|
|
if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
|
2011-04-06 04:40:12 +02:00
|
|
|
return ret;
|
2009-03-18 22:15:38 +01:00
|
|
|
}
|
|
|
|
|
2009-12-18 17:27:56 +01:00
|
|
|
return (elem.value || "").replace(rreturn, "");
|
2009-03-18 22:15:38 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return undefined;
|
|
|
|
}
|
|
|
|
|
2011-04-02 23:05:04 +02:00
|
|
|
var isFunction = jQuery.isFunction( value );
|
2009-03-18 22:15:38 +01:00
|
|
|
|
2011-04-02 23:05:04 +02:00
|
|
|
return this.each(function( i ) {
|
2011-04-06 04:40:12 +02:00
|
|
|
var self = jQuery(this), val;
|
2010-01-06 21:08:07 +01:00
|
|
|
|
2010-01-07 15:53:16 +01:00
|
|
|
if ( this.nodeType !== 1 ) {
|
|
|
|
return;
|
|
|
|
}
|
2009-12-18 17:27:56 +01:00
|
|
|
|
2010-01-07 15:53:16 +01:00
|
|
|
if ( isFunction ) {
|
2011-04-02 23:05:04 +02:00
|
|
|
val = value.call( this, i, self.val() );
|
2011-04-06 04:40:12 +02:00
|
|
|
} else {
|
|
|
|
val = value;
|
2009-07-12 22:19:43 +02:00
|
|
|
}
|
2009-12-10 05:57:19 +01:00
|
|
|
|
2010-08-21 04:32:34 +02:00
|
|
|
// Treat null/undefined as ""; convert numbers to string
|
|
|
|
if ( val == null ) {
|
|
|
|
val = "";
|
|
|
|
} else if ( typeof val === "number" ) {
|
2010-01-07 15:53:16 +01:00
|
|
|
val += "";
|
2011-04-02 23:05:04 +02:00
|
|
|
} else if ( jQuery.isArray( val ) ) {
|
|
|
|
val = jQuery.map(val, function ( value ) {
|
2010-10-09 05:48:06 +02:00
|
|
|
return value == null ? "" : value + "";
|
|
|
|
});
|
2009-11-27 20:28:42 +01:00
|
|
|
}
|
2009-12-18 17:27:56 +01:00
|
|
|
|
2011-04-02 23:05:04 +02:00
|
|
|
hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ];
|
|
|
|
|
|
|
|
// If set returns undefined, fall back to normal setting
|
2011-05-03 20:48:36 +02:00
|
|
|
if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
|
2011-04-02 23:05:04 +02:00
|
|
|
this.value = val;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
jQuery.extend({
|
|
|
|
valHooks: {
|
|
|
|
option: {
|
|
|
|
get: function( elem ) {
|
|
|
|
// attributes.value is undefined in Blackberry 4.7 but
|
|
|
|
// uses .value. See #6932
|
|
|
|
var val = elem.attributes.value;
|
|
|
|
return !val || val.specified ? elem.value : elem.text;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
select: {
|
|
|
|
get: function( elem ) {
|
2011-05-07 17:48:42 +02:00
|
|
|
var value,
|
|
|
|
index = elem.selectedIndex,
|
2011-04-02 23:05:04 +02:00
|
|
|
values = [],
|
|
|
|
options = elem.options,
|
|
|
|
one = elem.type === "select-one";
|
|
|
|
|
|
|
|
// Nothing was selected
|
|
|
|
if ( index < 0 ) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Loop through all the selected options
|
|
|
|
for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
|
|
|
|
var option = options[ i ];
|
|
|
|
|
|
|
|
// Don't return options that are disabled or in a disabled optgroup
|
|
|
|
if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
|
|
|
|
(!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
|
2009-12-18 17:27:56 +01:00
|
|
|
|
2011-04-02 23:05:04 +02:00
|
|
|
// Get the specific value for the option
|
|
|
|
value = jQuery( option ).val();
|
|
|
|
|
|
|
|
// We don't need an array for one selects
|
|
|
|
if ( one ) {
|
|
|
|
return value;
|
|
|
|
}
|
2009-03-18 22:15:38 +01:00
|
|
|
|
2011-04-02 23:05:04 +02:00
|
|
|
// Multi-Selects return an array
|
|
|
|
values.push( value );
|
|
|
|
}
|
|
|
|
}
|
2009-12-18 17:27:56 +01:00
|
|
|
|
2011-04-02 23:05:04 +02:00
|
|
|
// Fixes Bug #2551 -- select.val() broken in IE after form.reset()
|
|
|
|
if ( one && !values.length && options.length ) {
|
|
|
|
return jQuery( options[ index ] ).val();
|
|
|
|
}
|
2009-03-18 22:15:38 +01:00
|
|
|
|
2011-04-02 23:05:04 +02:00
|
|
|
return values;
|
|
|
|
},
|
|
|
|
|
|
|
|
set: function( elem, value ) {
|
|
|
|
var values = jQuery.makeArray( value );
|
|
|
|
|
|
|
|
jQuery(elem).find("option").each(function() {
|
2010-01-07 15:53:16 +01:00
|
|
|
this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
|
2009-03-18 22:15:38 +01:00
|
|
|
});
|
|
|
|
|
2009-11-27 20:28:42 +01:00
|
|
|
if ( !values.length ) {
|
2011-04-02 23:05:04 +02:00
|
|
|
elem.selectedIndex = -1;
|
2009-11-27 20:28:42 +01:00
|
|
|
}
|
2011-04-02 23:05:04 +02:00
|
|
|
return values;
|
2009-11-27 20:28:42 +01:00
|
|
|
}
|
2011-04-02 23:05:04 +02:00
|
|
|
}
|
|
|
|
},
|
2009-03-18 22:15:38 +01:00
|
|
|
|
2009-12-10 06:28:33 +01:00
|
|
|
attrFn: {
|
|
|
|
val: true,
|
|
|
|
css: true,
|
|
|
|
html: true,
|
|
|
|
text: true,
|
|
|
|
data: true,
|
|
|
|
width: true,
|
|
|
|
height: true,
|
2009-12-17 18:23:04 +01:00
|
|
|
offset: true
|
2009-12-10 06:28:33 +01:00
|
|
|
},
|
2011-03-07 04:47:40 +01:00
|
|
|
|
|
|
|
attrFix: {
|
2011-03-25 06:46:29 +01:00
|
|
|
// Always normalize to ensure hook usage
|
2011-05-04 03:44:42 +02:00
|
|
|
tabindex: "tabIndex"
|
2011-03-07 04:47:40 +01:00
|
|
|
},
|
2011-03-11 20:57:37 +01:00
|
|
|
|
2009-12-18 18:41:53 +01:00
|
|
|
attr: function( elem, name, value, pass ) {
|
2011-03-18 03:59:05 +01:00
|
|
|
var nType = elem.nodeType;
|
2011-03-10 02:20:53 +01:00
|
|
|
|
2010-12-07 03:17:42 +01:00
|
|
|
// don't get/set attributes on text, comment and attribute nodes
|
2011-03-18 03:59:05 +01:00
|
|
|
if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
|
2009-03-18 22:15:38 +01:00
|
|
|
return undefined;
|
2009-11-27 20:28:42 +01:00
|
|
|
}
|
2009-12-10 06:28:33 +01:00
|
|
|
|
2009-12-18 18:41:53 +01:00
|
|
|
if ( pass && name in jQuery.attrFn ) {
|
2011-03-26 04:36:07 +01:00
|
|
|
return jQuery( elem )[ name ]( value );
|
2009-09-15 19:23:26 +02:00
|
|
|
}
|
2011-05-10 06:27:52 +02:00
|
|
|
|
|
|
|
// Fallback to prop when attributes are not supported
|
|
|
|
if ( !("getAttribute" in elem) ) {
|
|
|
|
return jQuery.prop( elem, name, value );
|
|
|
|
}
|
|
|
|
|
2011-05-05 18:17:08 +02:00
|
|
|
var ret, hooks,
|
2011-03-26 04:03:02 +01:00
|
|
|
notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
|
2011-05-10 06:27:52 +02:00
|
|
|
|
2011-03-11 20:57:37 +01:00
|
|
|
// Normalize the name if needed
|
|
|
|
name = notxml && jQuery.attrFix[ name ] || name;
|
2011-03-12 03:28:42 +01:00
|
|
|
|
2011-05-05 18:17:08 +02:00
|
|
|
hooks = jQuery.attrHooks[ name ];
|
|
|
|
|
|
|
|
if ( !hooks ) {
|
|
|
|
// Use boolHook for boolean attributes
|
2011-05-07 20:49:04 +02:00
|
|
|
if ( rboolean.test( name ) &&
|
|
|
|
(typeof value === "boolean" || value === undefined || value.toLowerCase() === name.toLowerCase()) ) {
|
2011-05-05 18:17:08 +02:00
|
|
|
|
|
|
|
hooks = boolHook;
|
2011-05-07 20:49:04 +02:00
|
|
|
|
|
|
|
// Use formHook for forms and if the name contains certain characters
|
|
|
|
} else if ( formHook && (jQuery.nodeName( elem, "form" ) || rinvalidChar.test( name )) ) {
|
|
|
|
hooks = formHook;
|
2011-05-05 18:17:08 +02:00
|
|
|
}
|
|
|
|
}
|
2011-03-12 03:28:42 +01:00
|
|
|
|
2011-03-07 04:47:40 +01:00
|
|
|
if ( value !== undefined ) {
|
2011-03-12 03:28:42 +01:00
|
|
|
|
2011-05-05 18:17:08 +02:00
|
|
|
if ( value === null ) {
|
2011-03-12 03:28:42 +01:00
|
|
|
jQuery.removeAttr( elem, name );
|
2011-03-08 18:07:05 +01:00
|
|
|
return undefined;
|
2011-03-12 03:28:42 +01:00
|
|
|
|
2011-03-26 05:15:25 +01:00
|
|
|
} else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
|
2011-03-07 04:47:40 +01:00
|
|
|
return ret;
|
2011-03-26 02:13:25 +01:00
|
|
|
|
2011-03-07 04:47:40 +01:00
|
|
|
} else {
|
2011-04-02 20:23:33 +02:00
|
|
|
elem.setAttribute( name, "" + value );
|
2011-03-07 04:47:40 +01:00
|
|
|
return value;
|
2010-11-10 00:36:53 +01:00
|
|
|
}
|
2011-03-12 03:28:42 +01:00
|
|
|
|
2011-05-04 03:44:42 +02:00
|
|
|
} else if ( hooks && "get" in hooks && notxml ) {
|
|
|
|
return hooks.get( elem, name );
|
|
|
|
|
2011-03-07 04:47:40 +01:00
|
|
|
} else {
|
2011-03-12 03:28:42 +01:00
|
|
|
|
2011-05-05 18:17:08 +02:00
|
|
|
ret = elem.getAttribute( name );
|
2009-12-18 17:27:56 +01:00
|
|
|
|
2011-05-05 18:17:08 +02:00
|
|
|
// Non-existent attributes return null, we normalize to undefined
|
|
|
|
return ret === null ?
|
|
|
|
undefined :
|
|
|
|
ret;
|
2011-03-07 04:47:40 +01:00
|
|
|
}
|
|
|
|
},
|
2011-05-04 06:31:01 +02:00
|
|
|
|
2011-03-12 03:28:42 +01:00
|
|
|
removeAttr: function( elem, name ) {
|
2011-05-07 20:49:04 +02:00
|
|
|
var propName;
|
2011-04-03 22:49:48 +02:00
|
|
|
if ( elem.nodeType === 1 ) {
|
|
|
|
name = jQuery.attrFix[ name ] || name;
|
2011-03-13 21:17:13 +01:00
|
|
|
|
2011-04-03 22:49:48 +02:00
|
|
|
if ( jQuery.support.getSetAttribute ) {
|
2011-04-09 23:25:06 +02:00
|
|
|
// Use removeAttribute in browsers that support it
|
2011-04-03 22:49:48 +02:00
|
|
|
elem.removeAttribute( name );
|
|
|
|
} else {
|
2011-04-09 23:25:06 +02:00
|
|
|
jQuery.attr( elem, name, "" );
|
|
|
|
elem.removeAttributeNode( elem.getAttributeNode( name ) );
|
2011-04-03 22:49:48 +02:00
|
|
|
}
|
2011-05-04 17:29:38 +02:00
|
|
|
|
|
|
|
// Set corresponding property to false for boolean attributes
|
2011-05-07 20:49:04 +02:00
|
|
|
if ( rboolean.test( name ) && (propName = jQuery.propFix[ name ] || name) in elem ) {
|
|
|
|
elem[ propName ] = false;
|
2011-05-04 17:29:38 +02:00
|
|
|
}
|
2011-03-14 02:27:45 +01:00
|
|
|
}
|
2011-03-07 04:47:40 +01:00
|
|
|
},
|
2011-03-12 03:28:42 +01:00
|
|
|
|
2011-03-07 04:47:40 +01:00
|
|
|
attrHooks: {
|
|
|
|
type: {
|
|
|
|
set: function( elem, value ) {
|
|
|
|
// We can't allow the type property to be changed (since it causes problems in IE)
|
|
|
|
if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
|
|
|
|
jQuery.error( "type property can't be changed" );
|
2011-04-22 03:33:09 +02:00
|
|
|
} else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
|
|
|
|
// Setting the type on a radio button after the value resets the value in IE6-9
|
|
|
|
// Reset value to it's default in case type is set after value
|
2011-04-22 06:27:52 +02:00
|
|
|
// This is for element creation
|
2011-05-10 06:27:52 +02:00
|
|
|
var val = elem.value;
|
2011-04-22 03:33:09 +02:00
|
|
|
elem.setAttribute( "type", value );
|
|
|
|
if ( val ) {
|
|
|
|
elem.value = val;
|
|
|
|
}
|
|
|
|
return value;
|
2010-11-10 00:36:53 +01:00
|
|
|
}
|
2009-03-23 00:25:03 +01:00
|
|
|
}
|
2011-03-07 04:47:40 +01:00
|
|
|
},
|
|
|
|
tabIndex: {
|
|
|
|
get: function( elem ) {
|
2011-03-25 06:46:29 +01:00
|
|
|
// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
|
|
|
|
// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
|
|
|
|
var attributeNode = elem.getAttributeNode("tabIndex");
|
2011-03-07 04:47:40 +01:00
|
|
|
|
|
|
|
return attributeNode && attributeNode.specified ?
|
2011-03-25 06:46:29 +01:00
|
|
|
parseInt( attributeNode.value, 10 ) :
|
2011-03-07 04:47:40 +01:00
|
|
|
rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
|
|
|
|
0 :
|
|
|
|
undefined;
|
2009-11-27 20:28:42 +01:00
|
|
|
}
|
2011-03-07 04:47:40 +01:00
|
|
|
}
|
|
|
|
},
|
2011-05-10 06:27:52 +02:00
|
|
|
|
2011-05-04 03:44:42 +02:00
|
|
|
propFix: {
|
2011-05-04 06:31:01 +02:00
|
|
|
tabindex: "tabIndex",
|
|
|
|
readonly: "readOnly",
|
|
|
|
"for": "htmlFor",
|
|
|
|
"class": "className",
|
|
|
|
maxlength: "maxLength",
|
|
|
|
cellspacing: "cellSpacing",
|
|
|
|
cellpadding: "cellPadding",
|
|
|
|
rowspan: "rowSpan",
|
|
|
|
colspan: "colSpan",
|
|
|
|
usemap: "useMap",
|
2011-05-05 18:52:04 +02:00
|
|
|
frameborder: "frameBorder",
|
|
|
|
contenteditable: "contentEditable"
|
2011-05-04 03:44:42 +02:00
|
|
|
},
|
2011-03-07 04:47:40 +01:00
|
|
|
|
|
|
|
prop: function( elem, name, value ) {
|
2011-03-18 03:59:05 +01:00
|
|
|
var nType = elem.nodeType;
|
2011-05-10 06:27:52 +02:00
|
|
|
|
2011-03-10 02:20:53 +01:00
|
|
|
// don't get/set properties on text, comment and attribute nodes
|
2011-03-18 03:59:05 +01:00
|
|
|
if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
|
2011-03-10 02:20:53 +01:00
|
|
|
return undefined;
|
|
|
|
}
|
2011-05-10 06:27:52 +02:00
|
|
|
|
2011-03-18 03:59:05 +01:00
|
|
|
var ret, hooks,
|
|
|
|
notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
|
2011-05-10 06:27:52 +02:00
|
|
|
|
2011-03-07 04:47:40 +01:00
|
|
|
// Try to normalize/fix the name
|
|
|
|
name = notxml && jQuery.propFix[ name ] || name;
|
|
|
|
|
|
|
|
hooks = jQuery.propHooks[ name ];
|
2011-05-10 06:27:52 +02:00
|
|
|
|
2011-03-07 04:47:40 +01:00
|
|
|
if ( value !== undefined ) {
|
2011-03-26 05:18:02 +01:00
|
|
|
if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
|
2011-03-07 04:47:40 +01:00
|
|
|
return ret;
|
2011-05-10 06:27:52 +02:00
|
|
|
|
2011-03-07 04:47:40 +01:00
|
|
|
} else {
|
|
|
|
return (elem[ name ] = value);
|
2010-11-10 00:36:53 +01:00
|
|
|
}
|
2011-05-10 06:27:52 +02:00
|
|
|
|
2011-03-07 04:47:40 +01:00
|
|
|
} else {
|
2011-03-26 05:18:02 +01:00
|
|
|
if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== undefined ) {
|
2011-03-07 04:47:40 +01:00
|
|
|
return ret;
|
2011-05-10 06:27:52 +02:00
|
|
|
|
2011-03-07 04:47:40 +01:00
|
|
|
} else {
|
|
|
|
return elem[ name ];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
propHooks: {}
|
|
|
|
});
|
2010-08-24 16:28:47 +02:00
|
|
|
|
2011-05-05 18:17:08 +02:00
|
|
|
// Hook for boolean attributes
|
|
|
|
boolHook = {
|
|
|
|
get: function( elem, name ) {
|
|
|
|
// Align boolean attributes with corresponding properties
|
|
|
|
return elem[ jQuery.propFix[ name ] || name ] ?
|
|
|
|
name.toLowerCase() :
|
|
|
|
undefined;
|
|
|
|
},
|
|
|
|
set: function( elem, value, name ) {
|
2011-05-07 20:49:04 +02:00
|
|
|
var propName;
|
2011-05-05 18:17:08 +02:00
|
|
|
if ( value === false ) {
|
|
|
|
// Remove boolean attributes when set to false
|
|
|
|
jQuery.removeAttr( elem, name );
|
|
|
|
} else {
|
|
|
|
// value is true since we know at this point it's type boolean and not false
|
|
|
|
// Set boolean attributes to the same name and set the DOM property
|
2011-05-07 20:49:04 +02:00
|
|
|
propName = jQuery.propFix[ name ] || name;
|
|
|
|
if ( propName in elem ) {
|
|
|
|
// Only set the IDL specifically if it already exists on the element
|
|
|
|
elem[ propName ] = value;
|
|
|
|
}
|
|
|
|
|
2011-05-05 18:17:08 +02:00
|
|
|
elem.setAttribute( name, name.toLowerCase() );
|
|
|
|
}
|
|
|
|
return name;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2011-05-10 06:27:52 +02:00
|
|
|
// Use the value property for back compat
|
|
|
|
// Use the formHook for button elements in IE6/7 (#1954)
|
|
|
|
jQuery.attrHooks.value = {
|
|
|
|
get: function( elem, name ) {
|
|
|
|
if ( formHook && jQuery.nodeName( elem, "button" ) ) {
|
|
|
|
return formHook.get( elem, name );
|
|
|
|
}
|
|
|
|
return elem.value;
|
|
|
|
},
|
|
|
|
set: function( elem, value, name ) {
|
|
|
|
if ( formHook && jQuery.nodeName( elem, "button" ) ) {
|
|
|
|
return formHook.set( elem, value, name );
|
|
|
|
}
|
|
|
|
// Does not return so that setAttribute is also used
|
|
|
|
elem.value = value;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2011-03-12 03:28:42 +01:00
|
|
|
// IE6/7 do not support getting/setting some attributes with get/setAttribute
|
|
|
|
if ( !jQuery.support.getSetAttribute ) {
|
2011-05-04 06:31:01 +02:00
|
|
|
|
|
|
|
// propFix is more comprehensive and contains all fixes
|
|
|
|
jQuery.attrFix = jQuery.propFix;
|
2011-03-25 06:46:29 +01:00
|
|
|
|
2011-03-26 03:55:11 +01:00
|
|
|
// Use this for any attribute on a form in IE6/7
|
2011-05-10 06:27:52 +02:00
|
|
|
formHook = jQuery.attrHooks.name = jQuery.valHooks.button = {
|
2011-03-26 05:15:25 +01:00
|
|
|
get: function( elem, name ) {
|
2011-05-01 23:09:50 +02:00
|
|
|
var ret;
|
|
|
|
ret = elem.getAttributeNode( name );
|
2011-05-06 19:49:20 +02:00
|
|
|
// Return undefined if nodeValue is empty string
|
|
|
|
return ret && ret.nodeValue !== "" ?
|
2011-03-26 05:15:25 +01:00
|
|
|
ret.nodeValue :
|
|
|
|
undefined;
|
|
|
|
},
|
|
|
|
set: function( elem, value, name ) {
|
|
|
|
// Check form objects in IE (multiple bugs related)
|
|
|
|
// Only use nodeValue if the attribute node exists on the form
|
|
|
|
var ret = elem.getAttributeNode( name );
|
|
|
|
if ( ret ) {
|
|
|
|
ret.nodeValue = value;
|
2011-04-02 20:23:33 +02:00
|
|
|
return value;
|
2011-03-26 03:55:11 +01:00
|
|
|
}
|
2011-03-26 05:15:25 +01:00
|
|
|
}
|
2011-03-13 21:29:33 +01:00
|
|
|
};
|
2011-04-09 23:25:06 +02:00
|
|
|
|
|
|
|
// Set width and height to auto instead of 0 on empty string( Bug #8150 )
|
|
|
|
// This is for removals
|
|
|
|
jQuery.each([ "width", "height" ], function( i, name ) {
|
|
|
|
jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
|
|
|
|
set: function( elem, value ) {
|
|
|
|
if ( value === "" ) {
|
|
|
|
elem.setAttribute( name, "auto" );
|
|
|
|
return value;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
2011-03-12 03:28:42 +01:00
|
|
|
}
|
|
|
|
|
2011-03-08 18:07:05 +01:00
|
|
|
|
2011-03-07 04:47:40 +01:00
|
|
|
// Some attributes require a special call on IE
|
|
|
|
if ( !jQuery.support.hrefNormalized ) {
|
2011-04-12 01:30:20 +02:00
|
|
|
jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
|
2011-03-07 04:47:40 +01:00
|
|
|
jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
|
|
|
|
get: function( elem ) {
|
2011-04-09 23:25:06 +02:00
|
|
|
var ret = elem.getAttribute( name, 2 );
|
|
|
|
return ret === null ? undefined : ret;
|
2011-03-07 04:47:40 +01:00
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !jQuery.support.style ) {
|
|
|
|
jQuery.attrHooks.style = {
|
|
|
|
get: function( elem ) {
|
2011-04-04 00:18:32 +02:00
|
|
|
// Return undefined in the case of empty string
|
2011-04-04 00:47:44 +02:00
|
|
|
// Normalize to lowercase since IE uppercases css property names
|
|
|
|
return elem.style.cssText.toLowerCase() || undefined;
|
2011-03-07 04:47:40 +01:00
|
|
|
},
|
|
|
|
set: function( elem, value ) {
|
|
|
|
return (elem.style.cssText = "" + value);
|
2009-03-18 22:15:38 +01:00
|
|
|
}
|
2011-03-07 04:47:40 +01:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
// Safari mis-reports the default selected property of an option
|
|
|
|
// Accessing the parent's selectedIndex property fixes it
|
|
|
|
if ( !jQuery.support.optSelected ) {
|
2011-04-02 20:23:33 +02:00
|
|
|
jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
|
2011-03-07 04:47:40 +01:00
|
|
|
get: function( elem ) {
|
|
|
|
var parent = elem.parentNode;
|
2011-04-02 20:23:33 +02:00
|
|
|
|
2011-03-07 04:47:40 +01:00
|
|
|
if ( parent ) {
|
|
|
|
parent.selectedIndex;
|
|
|
|
|
|
|
|
// Make sure that it also works with optgroups, see #5701
|
|
|
|
if ( parent.parentNode ) {
|
|
|
|
parent.parentNode.selectedIndex;
|
|
|
|
}
|
|
|
|
}
|
2010-11-13 14:39:28 +01:00
|
|
|
}
|
2011-04-02 20:23:33 +02:00
|
|
|
});
|
2011-03-07 04:47:40 +01:00
|
|
|
}
|
2010-09-08 18:00:29 +02:00
|
|
|
|
2011-04-02 23:05:04 +02:00
|
|
|
// Radios and checkboxes getter/setter
|
|
|
|
if ( !jQuery.support.checkOn ) {
|
|
|
|
jQuery.each([ "radio", "checkbox" ], function() {
|
|
|
|
jQuery.valHooks[ this ] = {
|
|
|
|
get: function( elem ) {
|
|
|
|
// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
|
|
|
|
return elem.getAttribute("value") === null ? "on" : elem.value;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
});
|
|
|
|
}
|
|
|
|
jQuery.each([ "radio", "checkbox" ], function() {
|
|
|
|
jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
|
|
|
|
set: function( elem, value ) {
|
|
|
|
if ( jQuery.isArray( value ) ) {
|
|
|
|
return (elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2010-09-08 18:00:29 +02:00
|
|
|
})( jQuery );
|