X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;ds=inline;f=src%2Fjquery%2Fjquery.js;h=9768eee002afede1e12198546b851dafc7c0c1e7;hb=14b09024cbe39bc16200448170ccbd183e3a9ec2;hp=d50274fea447852a008634c1dfbeab5833df54e7;hpb=004f3dd51799fa0a32379c8168c71c8b4690774f;p=jquery.git
diff --git a/src/jquery/jquery.js b/src/jquery/jquery.js
index d50274f..9768eee 100644
--- a/src/jquery/jquery.js
+++ b/src/jquery/jquery.js
@@ -1,5 +1,5 @@
/*
- * jQuery - New Wave Javascript
+ * jQuery @VERSION - New Wave Javascript
*
* Copyright (c) 2006 John Resig (jquery.com)
* Dual licensed under the MIT (MIT-LICENSE.txt)
@@ -28,7 +28,7 @@ window.undefined = window.undefined;
* @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 )
@@ -50,8 +50,10 @@ jQuery = function(a,c) {
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 ?
@@ -61,12 +63,14 @@ jQuery = function(a,c) {
// 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
@@ -95,7 +99,10 @@ if ( typeof $ != "undefined" )
* @result [
two
]
*
* @example $("
Hello
").appendTo("#body")
- * @desc Creates a div element (and all of its contents) dynamically, and appends it to the element with the ID of body.
+ * @desc Creates a div element (and all of its contents) dynamically,
+ * and appends it to the element with the ID of body. Internally, an
+ * element is created and it's innerHTML property set to the given markup.
+ * It is therefore both quite flexible and limited.
*
* @name $
* @param String expr An expression to search with, or a string of HTML to create on the fly.
@@ -187,7 +194,7 @@ var $ = jQuery;
jQuery.fn = jQuery.prototype = {
/**
- * The current SVN version of jQuery.
+ * The current version of jQuery.
*
* @private
* @property
@@ -195,7 +202,7 @@ jQuery.fn = jQuery.prototype = {
* @type String
* @cat Core
*/
- jquery: "$Rev$",
+ jquery: "@VERSION",
/**
* The number of elements currently matched.
@@ -443,6 +450,17 @@ jQuery.fn = jQuery.prototype = {
* $("#check2").attr('checked', false);
* ok( document.getElementById('check2').checked == false, 'Set checked 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
* @param String key The name of the property to set.
@@ -516,6 +534,14 @@ jQuery.fn = jQuery.prototype = {
* 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
@@ -537,6 +563,14 @@ jQuery.fn = jQuery.prototype = {
* 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
@@ -645,7 +679,7 @@ jQuery.fn = jQuery.prototype = {
// Insert it before the element to be wrapped
this.parentNode.insertBefore( b, this );
- // Find he deepest point in the wrap structure
+ // Find the deepest point in the wrap structure
while ( b.firstChild )
b = b.firstChild;
@@ -667,6 +701,7 @@ jQuery.fn = jQuery.prototype = {
* @test var defaultText = 'Try them out:'
* var result = $('#first').append('buga');
* ok( result.text() == defaultText + 'buga', 'Check if text appending works' );
+ * ok( $('#select3').append('').find('option:last-child').attr('value') == 'appendTest', 'Appending html options to select element');
*
* @name append
* @type jQuery
@@ -730,6 +765,7 @@ jQuery.fn = jQuery.prototype = {
* @test var defaultText = 'Try them out:'
* var result = $('#first').prepend('buga');
* ok( result.text() == 'buga' + defaultText, 'Check if text prepending works' );
+ * ok( $('#select3').prepend('').find('option:first-child').attr('value') == 'prependTest', 'Prepending html options to select element');
*
* @name prepend
* @type jQuery
@@ -1015,6 +1051,7 @@ jQuery.fn = jQuery.prototype = {
for ( var i = 0; i < t.length; i++ )
if ( jQuery.filter(t[i],[a]).r.length )
return a;
+ return false;
}) ||
t.constructor == Boolean &&
@@ -1278,8 +1315,17 @@ jQuery.fn = jQuery.prototype = {
* @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;
};
@@ -1371,7 +1417,7 @@ jQuery.extend({
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;
},
@@ -1381,10 +1427,6 @@ jQuery.extend({
o.className += ( o.className ? " " : "" ) + c;
},
remove: function(o,c){
- /*
- o.className = !c ? "" :
- o.className.replace(
- new RegExp("(^|\\s*\\b[^-])"+c+"($|\\b(?=[^-]))", "g"), "");*/
if( !c ) {
o.className = "";
} else {
@@ -1452,14 +1494,19 @@ jQuery.extend({
});
return p == "height" ? oHeight : oWidth;
- } else if ( p == "opacity" && jQuery.browser.msie )
- return parseFloat( jQuery.curCSS(e,"filter").replace(/[^0-9.]/,"") ) || 1;
+ }
return jQuery.curCSS( e, p );
},
curCSS: function(elem, prop, force) {
var ret;
+
+ if (prop == 'opacity' && jQuery.browser.msie)
+ return jQuery.attr(elem.style, 'opacity');
+
+ if (prop == "float" || prop == "cssFloat")
+ prop = jQuery.browser.msie ? "styleFloat" : "cssFloat";
if (!force && elem.style[prop]) {
@@ -1472,6 +1519,9 @@ jQuery.extend({
} 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);
@@ -1493,10 +1543,15 @@ jQuery.extend({
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("" + a[i] + "";
+ } else if ( !a[i].indexOf("" + a[i] + "";
} else if ( !a[i].indexOf("
=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'",
@@ -1562,7 +1617,7 @@ jQuery.extend({
enabled: "!a.disabled",
disabled: "a.disabled",
checked: "a.checked",
- selected: "a.selected",
+ selected: "a.selected || jQuery.attr(a, 'selected')",
// Form elements
text: "a.type=='text'",
@@ -1642,9 +1697,9 @@ jQuery.extend({
* 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"] );
@@ -1821,22 +1876,39 @@ jQuery.extend({
var fix = {
"for": "htmlFor",
"class": "className",
- "float": "cssFloat",
+ "float": jQuery.browser.msie ? "styleFloat" : "cssFloat",
+ cssFloat: jQuery.browser.msie ? "styleFloat" : "cssFloat",
innerHTML: "innerHTML",
className: "className",
value: "value",
disabled: "disabled",
checked: "checked"
};
+
+ // 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
+ // Would prefer to check element.hasLayout first but don't have access to the element here
+ elem['zoom'] = 1;
+ if (value == 1) // Remove filter to avoid more IE weirdness
+ return elem["filter"] = elem["filter"].replace(/alpha\([^\)]*\)/gi,"");
+ else
+ return elem["filter"] = elem["filter"].replace(/alpha\([^\)]*\)/gi,"") + "alpha(opacity=" + value * 100 + ")";
+ } else if (name == "opacity" && jQuery.browser.msie) {
+ return elem["filter"] ? parseFloat( elem["filter"].match(/alpha\(opacity=(.*)\)/)[1] )/100 : 1;
+ }
+
+ // Mozilla doesn't play well with opacity 1
+ if (name == "opacity" && jQuery.browser.mozilla && value == 1) value = 0.9999;
if ( fix[name] ) {
if ( value != undefined ) elem[fix[name]] = value;
return elem[fix[name]];
- } else if( value == undefined && $.browser.msie && elem.nodeName && elem.nodeName.toUpperCase() == 'FORM' && (name == 'action' || name == 'method') ) {
+ } else if( value == undefined && jQuery.browser.msie && elem.nodeName && elem.nodeName.toUpperCase() == 'FORM' && (name == 'action' || name == 'method') ) {
return elem.getAttributeNode(name).nodeValue;
- } else if ( elem.getAttribute != undefined ) {
+ } 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;
@@ -2197,12 +2269,12 @@ jQuery.extend({
},
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;
@@ -2658,7 +2730,7 @@ jQuery.macros = {
/**
* Set the value of every matched element.
*
- * @example $("input").value("test");
+ * @example $("input").val("test");
* @before
* @result
*