/**
* 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.
* @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 ?
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
*/
/**
- * Set the text contents of all matched elements. This has the same
- * effect as html().
+ * Set the text contents of all matched elements.
+ *
+ * Similar to html(), but escapes HTML (replace "<" and ">" with their
+ * HTML entities.
+ *
+ * If stripTags argument is set to true, HTML is stripped.
+ *
+ * @example $("p").text("<b>Some</b> new text.");
+ * @before <p>Test Paragraph.</p>
+ * @result <p><b>Some</b> new text.</p>
+ * @desc Sets the text of all paragraphs.
*
- * @example $("p").text("Some new text.");
+ * @example $("p").text("<b>Some</b> new text.", true);
* @before <p>Test Paragraph.</p>
* @result <p>Some new text.</p>
* @desc Sets the text of all paragraphs.
* @name text
* @type String
* @param String val The text value to set the contents of the element to.
+ * @param Boolean stripTags (optional) Wheather to strip or only escape tags
* @cat DOM/Attributes
*/
- text: function(e) {
- // A surprisingly high number of people expect the
- // .text() method to do this, so lets do it!
+ text: function(e, stripTags) {
if ( typeof e == "string" )
- return this.html( e );
+ return this.html( stripTags ? e.replace(/<\/?[^>]+>/gi, '') : e.replace(/</g, "<").replace(/>/g, ">") );
e = e || this;
var t = "";
return r;
},
+ parseSetter: function(value) {
+ if( typeof value == "string" && value.charAt(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",
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
}
}
- 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++ )