From cb0250f1fa5af5c84e858ea978fcaa1194f4694f Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=B6rn=20Zaefferer?= Date: Sun, 7 Jan 2007 23:01:49 +0000 Subject: [PATCH] Implemented #753 --- src/jquery/coreTest.js | 6 +++++- src/jquery/jquery.js | 47 ++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 49 insertions(+), 4 deletions(-) diff --git a/src/jquery/coreTest.js b/src/jquery/coreTest.js index 169380b..436dcc5 100644 --- a/src/jquery/coreTest.js +++ b/src/jquery/coreTest.js @@ -67,9 +67,13 @@ test("attr(String)", function() { ok( $('#form').attr('action').indexOf("formaction") >= 0, 'Check for action attribute' ); }); -test("attr(String, Function)", function() { +test("attr(String, Function|String)", function() { ok( $('#text1').attr('value', function() { return this.id })[0].value == "text1", "Set value from id" ); ok( $('#text2').attr('value', "${this.id}")[0].value == "text2", "Set value from id" ); + reset(); + $('#text1, #text2').attr({value: "${this.id + 'foobar'}"}); + ok( $('#text1')[0].value == "text1foobar", "Set value from id" ); + ok( $('#text2')[0].value == "text2foobar", "Set value from id" ); }); test("attr(Hash)", function() { diff --git a/src/jquery/jquery.js b/src/jquery/jquery.js index 04b9ca5..b6d1dec 100644 --- a/src/jquery/jquery.js +++ b/src/jquery/jquery.js @@ -388,6 +388,8 @@ jQuery.fn = jQuery.prototype = { /** * 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,12 +399,34 @@ 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/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 return typeof key != "string" || value != undefined ? @@ -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 @@ -1363,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", @@ -1378,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 -- 1.7.10.4