* @name jQuery
* @cat Core
*/
-jQuery = function(a,c) {
+var jQuery = function(a,c) {
// Shortcut for document ready (because $(document).each() is silly)
if ( a && typeof a == "function" && jQuery.fn.ready )
return new jQuery(a,c);
// Handle HTML strings
- var m = /^[^<]*(<.+>)[^>]*$/.exec(a);
- if ( m ) a = jQuery.clean( [ m[1] ] );
+ if ( a.constructor == String ) {
+ var m = /^[^<]*(<.+>)[^>]*$/.exec(a);
+ if ( m ) a = jQuery.clean( [ m[1] ] );
+ }
// Watch for when an array is passed in
this.get( a.constructor == Array || a.length && !a.nodeType && a[0] != undefined && a[0].nodeType ?
// Find the matching elements and save them for later
jQuery.find( a, c ) );
- // See if an extra function was provided
+ // See if an extra function was provided
var fn = arguments[ arguments.length - 1 ];
// If so, execute it in context
if ( fn && typeof fn == "function" )
this.each(fn);
+
+ return this;
};
// Map over the $ in case of overwrite
* ok( document.getElementById('check2').checked == true, 'Set checked attribute' );
* $("#check2").attr('checked', false);
* ok( document.getElementById('check2').checked == false, 'Set checked attribute' );
+ * $("#text1").attr('readonly', true);
+ * ok( document.getElementById('text1').readOnly == true, 'Set readonly attribute' );
+ * $("#text1").attr('readonly', false);
+ * ok( document.getElementById('text1').readOnly == false, 'Set readonly attribute' );
+ *
+ * @test stop();
+ * $.get('data/dashboard.xml', function(xml) {
+ * var titles = [];
+ * $('tab', xml).each(function() {
+ * titles.push($(this).attr('title'));
+ * });
+ * ok( titles[0] == 'Location', 'attr() in XML context: Check first title' );
+ * ok( titles[1] == 'Users', 'attr() in XML context: Check second title' );
+ * start();
+ * });
*
* @name attr
* @type jQuery
* ok( !$('#foo').is(':visible'), 'Modified CSS display: Assert element is hidden');
* $('#foo').css({display: 'block'});
* ok( $('#foo').is(':visible'), 'Modified CSS display: Assert element is visible');
+ * $('#floatTest').css({styleFloat: 'right'});
+ * ok( $('#floatTest').css('styleFloat') == 'right', 'Modified CSS float using "styleFloat": Assert float is right');
+ * $('#floatTest').css({cssFloat: 'left'});
+ * ok( $('#floatTest').css('cssFloat') == 'left', 'Modified CSS float using "cssFloat": Assert float is left');
+ * $('#floatTest').css({'float': 'right'});
+ * ok( $('#floatTest').css('float') == 'right', 'Modified CSS float using "float": Assert float is right');
+ * $('#floatTest').css({'font-size': '30px'});
+ * ok( $('#floatTest').css('font-size') == '30px', 'Modified CSS font-size: Assert font-size is 30px');
*
* @name css
* @type jQuery
* ok( !$('#foo').is(':visible'), 'Modified CSS display: Assert element is hidden');
* $('#foo').css('display', 'block');
* ok( $('#foo').is(':visible'), 'Modified CSS display: Assert element is visible');
+ * $('#floatTest').css('styleFloat', 'left');
+ * ok( $('#floatTest').css('styleFloat') == 'left', 'Modified CSS float using "styleFloat": Assert float is left');
+ * $('#floatTest').css('cssFloat', 'right');
+ * ok( $('#floatTest').css('cssFloat') == 'right', 'Modified CSS float using "cssFloat": Assert float is right');
+ * $('#floatTest').css('float', 'left');
+ * ok( $('#floatTest').css('float') == 'left', 'Modified CSS float using "float": Assert float is left');
+ * $('#floatTest').css('font-size', '20px');
+ * ok( $('#floatTest').css('font-size') == '20px', 'Modified CSS font-size: Assert font-size is 20px');
*
* @name css
* @type jQuery
* @test var defaultText = 'Try them out:'
* var result = $('#first').append('<b>buga</b>');
* ok( result.text() == defaultText + 'buga', 'Check if text appending works' );
+ * ok( $('#select3').append('<option value="appendTest">Append Test</option>').find('option:last-child').attr('value') == 'appendTest', 'Appending html options to select element');
*
* @name append
* @type jQuery
* @test var defaultText = 'Try them out:'
* var result = $('#first').prepend('<b>buga</b>');
* ok( result.text() == 'buga' + defaultText, 'Check if text prepending works' );
+ * ok( $('#select3').prepend('<option value="prependTest">Prepend Test</option>').find('option:first-child').attr('value') == 'prependTest', 'Prepending html options to select element');
*
* @name prepend
* @type jQuery
for ( var i = 0; i < t.length; i++ )
if ( jQuery.filter(t[i],[a]).r.length )
return a;
+ return false;
}) ||
t.constructor == Boolean &&
* @cat Javascript
*/
jQuery.extend = jQuery.fn.extend = function(obj,prop) {
+ // Watch for the case where null or undefined gets passed in by accident
+ if ( arguments.length > 1 && (prop === null || prop == undefined) )
+ return obj;
+
+ // If no property object was provided, then we're extending jQuery
if ( !prop ) { prop = obj; obj = this; }
+
+ // Extend the base object
for ( var i in prop ) obj[i] = prop[i];
+
+ // Return the modified object
return obj;
};
fn.apply( obj[i], args || [i, obj[i]] );
else
for ( var i = 0; i < obj.length; i++ )
- fn.apply( obj[i], args || [i, obj[i]] );
+ if ( fn.apply( obj[i], args || [i, obj[i]] ) === false ) break;
return obj;
},
oHeight = e.offsetHeight;
oWidth = e.offsetWidth;
} else {
- e = jQuery(e.cloneNode(true)).css({
- visibility: "hidden", position: "absolute", display: "block", right: "0", left: "0"
- }).appendTo(e.parentNode)[0];
+ e = jQuery(e.cloneNode(true))
+ .find(":radio").removeAttr("checked").end()
+ .css({
+ visibility: "hidden", position: "absolute", display: "block", right: "0", left: "0"
+ }).appendTo(e.parentNode)[0];
var parPos = jQuery.css(e.parentNode,"position");
if ( parPos == "" || parPos == "static" )
} else if (document.defaultView && document.defaultView.getComputedStyle) {
+ if (prop == "cssFloat" || prop == "styleFloat")
+ prop = "float";
+
prop = prop.replace(/([A-Z])/g,"-$1").toLowerCase();
var cur = document.defaultView.getComputedStyle(elem, null);
return ret;
},
-
+
clean: function(a) {
var r = [];
for ( var i = 0; i < a.length; i++ ) {
- if ( a[i].constructor == String ) {
- // trim whitespace, otherwise indexOf won't work as expected
- a[i] = jQuery.trim(a[i]);
-
- var table = "";
-
- if ( !a[i].indexOf("<thead") || !a[i].indexOf("<tbody") ) {
- table = "thead";
- a[i] = "<table>" + a[i] + "</table>";
- } else if ( !a[i].indexOf("<tr") ) {
- table = "tr";
- a[i] = "<table>" + a[i] + "</table>";
- } else if ( !a[i].indexOf("<td") || !a[i].indexOf("<th") ) {
- table = "td";
- a[i] = "<table><tbody><tr>" + a[i] + "</tr></tbody></table>";
- }
-
- var div = document.createElement("div");
- div.innerHTML = a[i];
-
- if ( table ) {
- div = div.firstChild;
- if ( table != "thead" ) div = div.firstChild;
- if ( table == "td" ) div = div.firstChild;
- }
+ var arg = a[i];
+ if ( arg.constructor == String ) { // Convert html string into DOM nodes
+ // Trim whitespace, otherwise indexOf won't work as expected
+ var s = jQuery.trim(arg), div = document.createElement("div"), wrap = [0,"",""];
+
+ if ( !s.indexOf("<opt") ) // option or optgroup
+ wrap = [1, "<select>", "</select>"];
+ else if ( !s.indexOf("<thead") || !s.indexOf("<tbody") )
+ wrap = [1, "<table>", "</table>"];
+ else if ( !s.indexOf("<tr") )
+ wrap = [2, "<table>", "</table>"]; // tbody auto-inserted
+ else if ( !s.indexOf("<td") || !s.indexOf("<th") )
+ wrap = [3, "<table><tbody><tr>", "</tr></tbody></table>"];
+
+ // Go to html and back, then peel off extra wrappers
+ div.innerHTML = wrap[1] + s + wrap[2];
+ while ( wrap[0]-- ) div = div.firstChild;
+ arg = div.childNodes;
+ }
- for ( var j = 0; j < div.childNodes.length; j++ )
- r.push( div.childNodes[j] );
- } else if ( a[i].jquery || a[i].length && !a[i].nodeType )
- for ( var k = 0; k < a[i].length; k++ )
- r.push( a[i][k] );
- else if ( a[i] !== null )
- r.push( a[i].nodeType ? a[i] : document.createTextNode(a[i].toString()) );
+ if ( arg.length != undefined && !arg.nodeType ) // Handles Array, jQuery, DOM NodeList collections
+ for ( var n = 0; n < arg.length; n++ )
+ r.push(arg[n]);
+ else
+ r.push( arg.nodeType ? arg : document.createTextNode(arg.toString()) );
}
+
return r;
},
empty: "!a.childNodes.length",
// Text Check
- contains: "(a.innerText||a.innerHTML).indexOf(m[3])>=0",
+ contains: "jQuery.fn.text.apply([a]).indexOf(m[3])>=0",
// Visibility
visible: "a.type!='hidden'&&jQuery.css(a,'display')!='none'&&jQuery.css(a,'visibility')!='hidden'",
* t( "Attribute Exists", "*[@title]", ["google"] );
* t( "Attribute Exists", "[@title]", ["google"] );
*
- * t( "Non-existing part of attribute [@name*=bla]", "[@name*=bla]", [] );
- * t( "Non-existing start of attribute [@name^=bla]", "[@name^=bla]", [] );
- * t( "Non-existing end of attribute [@name$=bla]", "[@name$=bla]", [] );
+ * t( "Non-existing part of attribute", "[@name*=bla]", [] );
+ * t( "Non-existing start of attribute", "[@name^=bla]", [] );
+ * t( "Non-existing end of attribute", "[@name$=bla]", [] );
*
* t( "Attribute Equals", "a[@rel='bookmark']", ["simon1"] );
* t( "Attribute Equals", 'a[@rel="bookmark"]', ["simon1"] );
"for": "htmlFor",
"class": "className",
"float": jQuery.browser.msie ? "styleFloat" : "cssFloat",
- cssFloat: fix["float"],
+ cssFloat: jQuery.browser.msie ? "styleFloat" : "cssFloat",
innerHTML: "innerHTML",
className: "className",
value: "value",
disabled: "disabled",
- checked: "checked"
+ checked: "checked",
+ readonly: "readOnly"
};
// IE actually uses filters for opacity ... elem is actually elem.style
return elem.getAttributeNode(name).nodeValue;
} else if ( elem.getAttribute != undefined && elem.tagName ) { // IE elem.getAttribute passes even for style
if ( value != undefined ) elem.setAttribute( name, value );
- return elem.getAttribute( name, 2 );
+ return elem.getAttribute( name );
} else {
name = name.replace(/-([a-z])/ig,function(z,b){return b.toUpperCase();});
if ( value != undefined ) elem[name] = value;
},
handle: function(event) {
- if ( typeof jQuery == "undefined" ) return;
+ if ( typeof jQuery == "undefined" ) return false;
event = event || jQuery.event.fix( window.event );
// If no correct event was found, fail
- if ( !event ) return;
+ if ( !event ) return false;
var returnValue = true;
/**
* Set the value of every matched element.
*
- * @example $("input").value("test");
+ * @example $("input").val("test");
* @before <input type="text" value="some text"/>
* @result <input type="text" value="test"/>
*