X-Git-Url: http://git.asbjorn.it/?a=blobdiff_plain;f=src%2Fjquery%2Fjquery.js;h=ee65edbb1f8dd857b43d55a4ec69b82cfbe16bee;hb=ea283bd13130303271077a6ee8b14b7c79bd0ce4;hp=893a397d7971cb800d5a91c9990053121788fc02;hpb=e473f3a9118e4eae8d1aa2c3ab3527944db2e83b;p=jquery.git
diff --git a/src/jquery/jquery.js b/src/jquery/jquery.js
index 893a397..ee65edb 100644
--- a/src/jquery/jquery.js
+++ b/src/jquery/jquery.js
@@ -23,39 +23,41 @@ window.undefined = window.undefined;
* @cat Core
*/
var jQuery = function(a,c) {
+ // If the context is global, return a new object
+ if ( window == this )
+ return new jQuery(a,c);
+
// Make sure that a selection was provided
a = a || document;
+ // HANDLE: $(function)
// Shortcut for document ready
// Safari reports typeof on DOM NodeLists as a function
if ( typeof a == "function" && !a.nodeType && a[0] == undefined )
- return jQuery(document)[ jQuery.fn.ready ? "ready" : "load" ]( a );
-
- // Watch for when a jQuery object is passed as the selector
- if ( a.jquery )
- return jQuery( jQuery.makeArray( a ) );
-
- // Watch for when a jQuery object is passed at the context
- if ( c && c.jquery )
- return jQuery( c ).find(a);
-
- // If the context is global, return a new object
- if ( window == this )
- return new jQuery(a,c);
-
+ return new jQuery(document)[ jQuery.fn.ready ? "ready" : "load" ]( a );
+
// Handle HTML strings
if ( typeof a == "string" ) {
+ // HANDLE: $(html) -> $(array)
var m = /^[^<]*(<.+>)[^>]*$/.exec(a);
- if ( m ) a = jQuery.clean( [ m[1] ] );
+ if ( m )
+ a = jQuery.clean( [ m[1] ] );
+
+ // HANDLE: $(expr)
+ else
+ return new jQuery( c ).find( a );
}
+
+ return this.setArray(
+ // HANDLE: $(array)
+ a.constructor == Array && a ||
- // Watch for when an array is passed in
- return this.setArray( a.constructor == Array || a.length && a != window && !a.nodeType && a[0] != undefined && a[0].nodeType ?
- // Assume that it is an array of DOM Elements
- jQuery.makeArray( a ) :
+ // HANDLE: $(arraylike)
+ // Watch for when an array-like object is passed as the selector
+ (a.jquery || a.length && a != window && !a.nodeType && a[0] != undefined && a[0].nodeType) && jQuery.makeArray( a ) ||
- // Find the matching elements and save them for later
- jQuery.find( a, c ) );
+ // HANDLE: $(*)
+ [ a ] );
};
// Map over the $ in case of overwrite
@@ -365,7 +367,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 +384,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,35 +401,55 @@ 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 ) {
+ var obj = key;
+
+ // Look for the case where we're accessing a style value
+ if ( key.constructor == String )
+ if ( value == undefined )
+ return jQuery[ type || "attr" ]( this[0], key );
+ else {
+ obj = {};
+ obj[ key ] = value;
+ }
+
// Check to see if we're setting style values
- return typeof key != "string" || value != undefined ?
- this.each(function(){
- // See if we're setting a hash of styles
- if ( value == undefined )
- // Set all the styles
- for ( var prop in key )
- jQuery.attr(
- type ? this.style : this,
- prop, key[prop]
- );
-
- // See if we're setting a single key/value style
- else
- jQuery.attr(
- type ? this.style : this,
- key, value
- );
- }) :
-
- // Look for the case where we're accessing a style value
- jQuery[ type || "attr" ]( this[0], key );
+ return this.each(function(){
+ // Set all the styles
+ for ( var prop in obj )
+ jQuery.attr(
+ type ? this.style : this,
+ prop, jQuery.prop(this, prop, obj[prop], type)
+ );
+ });
},
/**
@@ -496,14 +520,21 @@ jQuery.fn = jQuery.prototype = {
*
* @name text
* @type String
- * @cat DOM
+ * @cat DOM/Attributes
*/
/**
- * 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).
*
- * @example $("p").text("Some new text.");
+ * @example $("p").text("Some new text.");
+ * @before
Test Paragraph.
+ * @result<b>Some</b> new text.
+ * @desc Sets the text of all paragraphs. + * + * @example $("p").text("Some new text.", true); * @beforeTest Paragraph.
* @resultSome new text.
* @desc Sets the text of all paragraphs. @@ -511,24 +542,15 @@ 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 - // .text() method to do this, so lets do it! - if ( typeof e == "string" ) - return this.html( e ); - - e = e || this; - var t = ""; - for ( var j = 0, el = e.length; j < el; j++ ) { - var r = e[j].childNodes; - for ( var i = 0, rl = r.length; i < rl; i++ ) - if ( r[i].nodeType != 8 ) - t += r[i].nodeType != 1 ? - r[i].nodeValue : jQuery.fn.text([ r[i] ]); - } - return t; + var type = this.length && this[0].innerText == undefined ? + "textContent" : "innerText"; + + return e == undefined ? + this.length && this[0][ type ] : + this.each(function(){ this[ type ] = e; }); }, /** @@ -742,7 +764,7 @@ jQuery.fn = jQuery.prototype = { * @example $("p").find("span").end(); * @beforeHello, 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 @@ -1017,7 +1039,7 @@ jQuery.fn = jQuery.prototype = { * @cat DOM/Attributes */ html: function( val ) { - return val == undefined ? ( this.length ? this[0].innerHTML : null ) : this.attr( "innerHTML", val ); + return val == undefined ? ( this.length ? this[0].innerHTML : null ) : this.empty().append( val ); }, /** @@ -1098,7 +1120,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 +1152,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 +1187,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 ) { @@ -1187,22 +1219,32 @@ jQuery.extend({ if ( fn.apply( obj[i], args || [i, obj[i]] ) === false ) break; return obj; }, + + prop: function(elem, key, value){ + // Handle executable functions + return value.constructor == Function && + value.call( elem ) || value; + }, className: { + // internal only, use addClass("class") add: function( elem, c ){ jQuery.each( c.split(/\s+/), function(i, cur){ if ( !jQuery.className.has( elem.className, cur ) ) elem.className += ( elem.className ? " " : "" ) + cur; }); }, + // internal only, use removeClass("class") remove: function( elem, c ){ elem.className = c ? jQuery.grep( elem.className.split(/\s+/), function(cur){ return !jQuery.className.has( c, cur ); }).join(' ') : ""; }, - has: function( classes, c ){ - return classes && new RegExp("(^|\\s)" + c + "(\\s|$)").test( classes ); + // internal only, use is(".class") + has: function( t, c ) { + t = t.className || t; + return t && new RegExp("(^|\\s)" + c + "(\\s|$)").test( t ); } }, @@ -1269,11 +1311,10 @@ jQuery.extend({ if (prop == "float" || prop == "cssFloat") prop = jQuery.browser.msie ? "styleFloat" : "cssFloat"; - if (!force && elem.style[prop]) { - + if (!force && elem.style[prop]) ret = elem.style[prop]; - } else if (document.defaultView && document.defaultView.getComputedStyle) { + else if (document.defaultView && document.defaultView.getComputedStyle) { if (prop == "cssFloat" || prop == "styleFloat") prop = "float"; @@ -1303,51 +1344,62 @@ jQuery.extend({ clean: function(a) { var r = []; + for ( var i = 0, al = a.length; i < al; i++ ) { var arg = a[i]; - if ( typeof arg == "string" ) { // Convert html string into DOM nodes + + // Convert html string into DOM nodes + if ( typeof arg == "string" ) { // Trim whitespace, otherwise indexOf won't work as expected - var s = jQuery.trim(arg), s3 = s.substring(0,3), s6 = s.substring(0,6), - div = document.createElement("div"), wrap = [0,"",""]; - - if ( s.substring(0,4) == "