aboutsummaryrefslogtreecommitdiffstats
path: root/src/jquery
diff options
context:
space:
mode:
authorJörn Zaefferer <joern.zaefferer@gmail.com>2007-01-07 23:01:49 +0000
committerJörn Zaefferer <joern.zaefferer@gmail.com>2007-01-07 23:01:49 +0000
commitcb0250f1fa5af5c84e858ea978fcaa1194f4694f (patch)
tree357233ee4626e463217381c5dc195939481bad6b /src/jquery
parente1e47cddd64e904606c6d239d1d3e1d647f23df6 (diff)
downloadjquery-cb0250f1fa5af5c84e858ea978fcaa1194f4694f.tar.gz
jquery-cb0250f1fa5af5c84e858ea978fcaa1194f4694f.zip
Implemented #753
Diffstat (limited to 'src/jquery')
-rw-r--r--src/jquery/coreTest.js6
-rw-r--r--src/jquery/jquery.js47
2 files changed, 49 insertions, 4 deletions
diff --git a/src/jquery/coreTest.js b/src/jquery/coreTest.js
index 169380bd0..436dcc5cb 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 04b9ca5c1..b6d1dece5 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 <img src="test.jpg"/>
* @desc Sets src attribute to all images.
*
+ * @example $("img").attr("title", "${this.src}");
+ * @before <img src="test.jpg" />
+ * @result <img src="test.jpg" title="test.jpg" />
+ * @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 <img src="test.jpg" />
+ * @result <img src="test.jpg" title="test.jpg" />
+ * @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