X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;ds=sidebyside;f=src%2Fjquery%2Fjquery.js;h=b6d1dece575c349d93127158945922dcd8351ee9;hb=cb0250f1fa5af5c84e858ea978fcaa1194f4694f;hp=893a397d7971cb800d5a91c9990053121788fc02;hpb=e473f3a9118e4eae8d1aa2c3ab3527944db2e83b;p=jquery.git
diff --git a/src/jquery/jquery.js b/src/jquery/jquery.js
index 893a397..b6d1dec 100644
--- a/src/jquery/jquery.js
+++ b/src/jquery/jquery.js
@@ -365,7 +365,7 @@ jQuery.fn = jQuery.prototype = {
* @name attr
* @type Object
* @param String name The name of the property to access.
- * @cat DOM
+ * @cat DOM/Attributes
*/
/**
@@ -382,12 +382,14 @@ jQuery.fn = jQuery.prototype = {
* @name attr
* @type jQuery
* @param Map properties Key/value pairs to set as object properties.
- * @cat DOM
+ * @cat DOM/Attributes
*/
/**
* Set a single property to a value, on all matched elements.
*
+ * Can compute values provided as ${formula}, see second example.
+ *
* Note that you can't set the name property of input elements in IE.
* Use $(html) or .append(html) or .html(html) to create elements
* on the fly including the name property.
@@ -397,11 +399,33 @@ jQuery.fn = jQuery.prototype = {
* @result
* @desc Sets src attribute to all images.
*
+ * @example $("img").attr("title", "${this.src}");
+ * @before
+ * @result
+ * @desc Sets title attribute from src attribute, a shortcut for attr(String,Function)
+ *
* @name attr
* @type jQuery
* @param String key The name of the property to set.
* @param Object value The value to set the property to.
- * @cat DOM
+ * @cat DOM/Attributes
+ */
+
+ /**
+ * Set a single property to a computed value, on all matched elements.
+ *
+ * Instead of a value, a function is provided, that computes the value.
+ *
+ * @example $("img").attr("title", function() { return this.src });
+ * @before
+ * @result
+ * @desc Sets title attribute from src attribute.
+ *
+ * @name attr
+ * @type jQuery
+ * @param String key The name of the property to set.
+ * @param Function value A function returning the value to set.
+ * @cat DOM/Attributes
*/
attr: function( key, value, type ) {
// Check to see if we're setting style values
@@ -413,15 +437,17 @@ jQuery.fn = jQuery.prototype = {
for ( var prop in key )
jQuery.attr(
type ? this.style : this,
- prop, key[prop]
+ prop, jQuery.parseSetter(key[prop])
);
// See if we're setting a single key/value style
- else
+ else {
+ // convert ${this.property} to function returnung that property
jQuery.attr(
type ? this.style : this,
- key, value
+ key, jQuery.parseSetter(value)
);
+ }
}) :
// Look for the case where we're accessing a style value
@@ -496,7 +522,7 @@ jQuery.fn = jQuery.prototype = {
*
* @name text
* @type String
- * @cat DOM
+ * @cat DOM/Attributes
*/
/**
@@ -511,7 +537,7 @@ jQuery.fn = jQuery.prototype = {
* @name text
* @type String
* @param String val The text value to set the contents of the element to.
- * @cat DOM
+ * @cat DOM/Attributes
*/
text: function(e) {
// A surprisingly high number of people expect the
@@ -742,7 +768,7 @@ jQuery.fn = jQuery.prototype = {
* @example $("p").find("span").end();
* @before
Hello, how are you?
* @result [...
] - * desc Selects all paragraphs, finds span elements inside these, and reverts the + * @desc Selects all paragraphs, finds span elements inside these, and reverts the * selection back to the paragraphs. * * @name end @@ -1098,7 +1124,7 @@ jQuery.fn = jQuery.prototype = { * @param Object prop1 The object that will be merged into the first. * @param Object propN (optional) More objects to merge into the first * @type Object - * @cat Javascript + * @cat JavaScript */ jQuery.extend = jQuery.fn.extend = function() { // copy reference to target object @@ -1130,28 +1156,32 @@ jQuery.extend({ * using the 'jQuery' variable. For example, where you used to do * $("div p"), you now must do jQuery("div p"). * - * @example $.noConflict(); + * @example jQuery.noConflict(); + * // Do something with jQuery + * jQuery("div p").hide(); + * // Do something with another library's $() + * $("content").style.display = 'none'; * @desc Maps the original object that was referenced by $ back to $ * - * @example $.noConflict(); + * @example jQuery.noConflict(); * (function($) { * $(function() { * // more code using $ as alias to jQuery * }); * })(jQuery); - * // other code using $ as an alias to the original implementation (not jQuery) + * // other code using $ as an alias to the other library * @desc Reverts the $ alias and then creates and executes a * function to provide the $ as a jQuery alias inside the functions * scope. Inside the function the original $ object is not available. * This works well for most plugins that don't rely on any other library. * * - * @name noConflict + * @name $.noConflict * @type undefined * @cat Core */ noConflict: function() { - if(jQuery._$) + if ( jQuery._$ ) $ = jQuery._$; }, @@ -1161,21 +1191,27 @@ jQuery.extend({ * as $().each() - which is used to iterate, exclusively, over a jQuery * object. This function can be used to iterate over anything. * - * @example $.each( [0,1,2], function(i){ - * alert( "Item #" + i + ": " + this ); + * The callback has two arguments:the key (objects) or index (arrays) as first + * the first, and the value as the second. + * + * @example $.each( [0,1,2], function(i, n){ + * alert( "Item #" + i + ": " + n ); * }); - * @desc Iterates over the items in an array, accessing both the current item and its index. + * @desc This is an example of iterating over the items in an array, + * accessing both the current item and its index. * - * @example $.each( { name: "John", lang: "JS" }, function(i){ - * alert( "Name: " + i + ", Value: " + this ); + * @example $.each( { name: "John", lang: "JS" }, function(i, n){ + * alert( "Name: " + i + ", Value: " + n ); * }); - * @desc Iterates over the properties in an Object, accessing both the current item and its key. + * + * @desc This is an example of iterating over the properties in an + * Object, accessing both the current item and its key. * * @name $.each * @param Object obj The object, or array, to iterate over. * @param Function fn The function that will be executed on every object. * @type Object - * @cat Javascript + * @cat JavaScript */ // args is for internal usage only each: function( obj, fn, args ) { @@ -1353,6 +1389,16 @@ jQuery.extend({ return r; }, + parseSetter: function(value) { + if( typeof value == "string" && value[0] == "$" ) { + var m = value.match(/^\${(.*)}$/); + if ( m && m[1] ) { + value = new Function( "return " + m[1] ); + } + } + return value; + }, + attr: function(elem, name, value){ var fix = { "for": "htmlFor", @@ -1368,6 +1414,11 @@ jQuery.extend({ selected: "selected" }; + // get value if a function is provided + if ( value && typeof value == "function" ) { + value = value.apply( elem ); + } + // IE actually uses filters for opacity ... elem is actually elem.style if ( name == "opacity" && jQuery.browser.msie && value != undefined ) { // IE has trouble with opacity if it does not have layout @@ -1416,7 +1467,7 @@ jQuery.extend({ * @name $.trim * @type String * @param String str The string to trim. - * @cat Javascript + * @cat JavaScript */ trim: function(t){ return t.replace(/^\s+|\s+$/g, ""); @@ -1459,7 +1510,7 @@ jQuery.extend({ * @type Array * @param Array first The first array to merge. * @param Array second The second array to merge. - * @cat Javascript + * @cat JavaScript */ merge: function(first, second) { var r = [].slice.call( first, 0 ); @@ -1494,7 +1545,7 @@ jQuery.extend({ * @param Array array The Array to find items in. * @param Function fn The function to process each item against. * @param Boolean inv Invert the selection - select the opposite of the function. - * @cat Javascript + * @cat JavaScript */ grep: function(elems, fn, inv) { // If a string is passed in for the function, make a function @@ -1548,7 +1599,7 @@ jQuery.extend({ * @type Array * @param Array array The Array to translate. * @param Function fn The function to process each item against. - * @cat Javascript + * @cat JavaScript */ map: function(elems, fn) { // If a string is passed in for the function, make a function @@ -1569,7 +1620,7 @@ jQuery.extend({ } } - var r = [ result[0] ]; + var r = result.length ? [ result[0] ] : []; check: for ( var i = 1, rl = result.length; i < rl; i++ ) { for ( var j = 0; j < i; j++ ) @@ -1604,7 +1655,7 @@ jQuery.extend({ * @property * @name $.browser * @type Boolean - * @cat Javascript + * @cat JavaScript */ /* @@ -1613,7 +1664,7 @@ jQuery.extend({ * @property * @name $.boxModel * @type Boolean - * @cat Javascript + * @cat JavaScript */ new function() { var b = navigator.userAgent.toLowerCase(); @@ -1874,7 +1925,7 @@ jQuery.each({ * @name removeAttr * @type jQuery * @param String name The name of the attribute to remove. - * @cat DOM + * @cat DOM/Attributes */ /** @@ -1931,7 +1982,7 @@ jQuery.each({ * @name addClass * @type jQuery * @param String class A CSS class to add to the elements - * @cat DOM + * @cat DOM/Attributes * @see removeClass(String) */ @@ -1949,7 +2000,7 @@ jQuery.each({ * @name removeClass * @type jQuery * @param String class (optional) A CSS class to remove from the elements - * @cat DOM + * @cat DOM/Attributes * @see addClass(String) */ @@ -1964,7 +2015,7 @@ jQuery.each({ * @name toggleClass * @type jQuery * @param String class A CSS class with which to toggle the elements - * @cat DOM + * @cat DOM/Attributes */ /** @@ -2102,4 +2153,4 @@ jQuery.each( [ "eq", "lt", "gt", "contains" ], function(i,n){ jQuery.fn[ n ] = function(num,fn) { return this.filter( ":" + n + "(" + num + ")", fn ); }; -}); \ No newline at end of file +});