X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=jquery%2Fjquery.js;h=6263607aa9e9de097a04e1b6f7bcf0888606ccb6;hb=8f52a2e0e95c03a3fdd8654c4af57d19594743f0;hp=75dd9076b6acc63bd6fdb5fb96cd538e6ec23fec;hpb=dea19250497716bbd6f9128eacaa785a620aafde;p=jquery.git diff --git a/jquery/jquery.js b/jquery/jquery.js index 75dd907..6263607 100644 --- a/jquery/jquery.js +++ b/jquery/jquery.js @@ -15,7 +15,7 @@ function $(a,c) { var $a = a || $.context || document; var $c = c && c.$jquery && c.get(0) || c; - + // Since we're using Prototype's $ function, // be nice and have backwards compatability if ( typeof Prototype != "undefined" ) { @@ -42,28 +42,25 @@ function $(a,c) { var self = { cur: $.Select($a,$c), $jquery: "$Rev$", - + // The only two getters size: function() {return this.get().length;}, get: function(i) { return typeof i == 'undefined' ? this.cur : this.cur[i]; }, - + each: function(f) { - for ( var i = 0; i < this.size(); i++ ) { + for ( var i = 0; i < this.size(); i++ ) $.apply( this.get(i), f, [i] ); - } return this; }, set: function(a,b) { return this.each(function(){ - if ( typeof b == 'undefined' ) { - for ( var j in a ) { + if ( typeof b == 'undefined' ) + for ( var j in a ) $.attr(this,j,a[j]); - } - } else { + else $.attr(this,a,b); - } }); }, html: function(h) { @@ -74,51 +71,44 @@ function $(a,c) { return typeof h == 'undefined' && this.size() ? this.get(0).value : this.set( "value", h ); }, - + css: function(a,b) { return a.constructor != String || b ? this.each(function(){ - if ( !b ) { - for ( var j in a ) { + if ( !b ) + for ( var j in a ) $.attr(this.style,j,a[j]); - } - } else { + else $.attr(this.style,a,b); - } }) : $.css( this.get(0), a ); }, toggle: function() { return this.each(function(){ var d = $.getCSS(this,"display"); - if ( d == "none" || d === '' ) { + if ( d == "none" || d === '' ) $(this).show(); - } else { + else $(this).hide(); - } }); }, show: function(a) { return this.each(function(){ this.style.display = this.$$oldblock ? this.$$oldblock : ''; - if ( $.getCSS(this,"display") == "none" ) { + if ( $.getCSS(this,"display") == "none" ) this.style.display = 'block'; - } }); }, hide: function(a) { return this.each(function(){ this.$$oldblock = $.getCSS(this,"display"); - if ( this.$$oldblock == "none" ) { + if ( this.$$oldblock == "none" ) this.$$oldblock = 'block'; - } this.style.display = 'none'; }); }, addClass: function(c) { return this.each(function(){ - if ($.hasWord(this,c)) { - return null; - } + if ($.hasWord(this,c)) return; this.className += ( this.className.length > 0 ? " " : "" ) + c; }); }, @@ -132,13 +122,12 @@ function $(a,c) { // TODO: Optomize toggleClass: function(c) { return this.each(function(){ - if ($.hasWord(this,c)) { - this.className = + if ($.hasWord(this,c)) + this.className = this.className.replace( new RegExp('(\\s*\\b[^-])'+c+'($|\\b(?=[^-]))', 'g'), ''); - } else { + else this.className += ( this.className.length > 0 ? " " : "" ) + c; - } }); }, remove: function() { @@ -146,76 +135,69 @@ function $(a,c) { this.cur = []; return this; }, - + wrap: function() { var a = $.clean(arguments); return this.each(function(){ var b = a[0].cloneNode(true); this.parentNode.insertBefore( b, this ); - while ( b.firstChild ) { + while ( b.firstChild ) b = b.firstChild; - } b.appendChild( this ); }); }, - + append: function() { var clone = this.size() > 1; var a = $.clean(arguments); - return this.each(function(){ - for ( var i = 0; i < a.length; i++ ) { + return this.domManip(function(){ + for ( var i = 0; i < a.length; i++ ) this.appendChild( clone ? a[i].cloneNode(true) : a[i] ); - } }); }, appendTo: function() { var a = arguments; return this.each(function(){ - for ( var i = 0; i < a.length; i++ ) { + for ( var i = 0; i < a.length; i++ ) $(a[i]).append( this ); - } }); }, - + prepend: function() { var clone = this.size() > 1; var a = $.clean(arguments); - return this.each(function(){ - for ( var i = a.length - 1; i >= 0; i-- ) { + return this.domManip(function(){ + for ( var i = a.length - 1; i >= 0; i-- ) this.insertBefore( clone ? a[i].cloneNode(true) : a[i], this.firstChild ); - } }); }, - + before: function() { var clone = this.size() > 1; var a = $.clean(arguments); return this.each(function(){ - for ( var i = 0; i < a.length; i++ ) { + for ( var i = 0; i < a.length; i++ ) this.parentNode.insertBefore( clone ? a[i].cloneNode(true) : a[i], this ); - } }); }, - + after: function() { var clone = this.size() > 1; var a = $.clean(arguments); return this.each(function(){ - for ( var i = a.length - 1; i >= 0; i-- ) { + for ( var i = a.length - 1; i >= 0; i-- ) this.parentNode.insertBefore( clone ? a[i].cloneNode(true) : a[i], this.nextSibling ); - } }); }, empty: function() { return this.each(function(){ - while ( this.firstChild ) { + while ( this.firstChild ) this.removeChild( this.firstChild ); - } }); }, - + bind: function(t,f) { return this.each(function(){$.event.add(this,t,f);}); }, @@ -225,7 +207,7 @@ function $(a,c) { trigger: function(t) { return this.each(function(){$.event.trigger(this,t);}); }, - + find: function(t) { var old = [], ret = []; this.each(function(){ @@ -245,29 +227,23 @@ function $(a,c) { this.cur = $.map(this.cur,function(d){ return d.parentNode; }); - if ( a ) { - this.cur = $.filter(a,this.cur).r; - } + if ( a ) this.cur = $.filter(a,this.cur).r; return this; }, - + parents: function(a) { this.cur = $.map(this.cur,$.parents); - if ( a ) { - this.cur = $.filter(a,this.cur).r; - } + if ( a ) this.cur = $.filter(a,this.cur).r; return this; }, - + siblings: function(a) { // Incorrect, need to exclude current element this.cur = $.map(this.cur,$.sibling); - if ( a ) { - this.cur = $.filter(a,this.cur).r; - } + if ( a ) this.cur = $.filter(a,this.cur).r; return this; }, - + filter: function(t) { this.cur = $.filter(t,this.cur).r; return this; @@ -290,53 +266,54 @@ function $(a,c) { return !this.s(t); } }; - + // TODO: Remove need to return this for ( var i in $.fn ) { - if ( self[i] !== null ) { + if ( self[i] !== null ) self["_"+i] = self[i]; - } self[i] = $.fn[i]; } - + if ( typeof Prototype != "undefined" && $a.constructor != String ) { - if ( $c ) { - $a = self.get(); - } + if ( $c ) $a = self.get(); for ( var k in self ) {(function(j){ try { - if ( !$a[j] ) { + if ( !$a[j] ) $a[j] = function() { return $.apply(self,self[j],arguments); }; - } } catch(e) {} })(k);} return $a; } - + return self; } (function(){ var b = navigator.userAgent.toLowerCase(); + + // Figure out what browser is being used $.browser = - ( /safari/.test(b) && "safari" ) || + ( /webkit/.test(b) && "safari" ) || ( /opera/.test(b) && "opera" ) || ( /msie/.test(b) && "msie" ) || ( !/compatible/.test(b) && "mozilla" ) || "other"; + + // Check to see if the W3C box model is being used + $.boxModel = ( $.browser != "msie" || + document.compatMode == "CSS1Compat" ); })(); $.apply = function(o,f,a) { a = a || []; - if ( f.apply ) { + if ( f.apply ) return f.apply( o, a ); - } else { + else { var p = []; - for (var i = 0; i < a.length; i++) { + for (var i = 0; i < a.length; i++) p[i] = 'a['+i+']'; - } o.$$exec = this; var r = eval('o.$$exec(' + p.join(',') + ')'); o.$$exec = null; @@ -347,16 +324,21 @@ $.apply = function(o,f,a) { $.getCSS = function(e,p) { // Adapted from Prototype 1.4.0 if ( p == 'height' || p == 'width' ) { - var ph = $.browser == "msie" ? 0 : - parseInt($.css(e,"paddingTop")) + parseInt($.css(e,"paddingBottom")); - var pw = $.browser == "msie" ? 0 : - parseInt($.css(e,"paddingLeft")) + parseInt($.css(e,"paddingRight")); + + // Handle extra width/height provided by the W3C box model + var ph = (!$.boxModel ? 0 : + parseInt($.css(e,"paddingTop")) + parseInt($.css(e,"paddingBottom")) + + parseInt($.css(e,"borderTopWidth")) + parseInt($.css(e,"borderBottomWidth"))) || 0; + + var pw = (!$.boxModel ? 0 : + parseInt($.css(e,"paddingLeft")) + parseInt($.css(e,"paddingRight")) + + parseInt($.css(e,"borderLeftWidth")) + parseInt($.css(e,"borderRightWidth"))) || 0; var oHeight, oWidth; if ($.css(e,"display") != 'none') { - oHeight = e.offsetHeight || parseInt(e.style.height,10); - oWidth = e.offsetWidth || parseInt(e.style.width,10); + oHeight = e.offsetHeight || parseInt(e.style.height) || 0; + oWidth = e.offsetWidth || parseInt(e.style.width) || 0; } else { var els = e.style; var ov = els.visibility; @@ -365,8 +347,8 @@ $.getCSS = function(e,p) { els.visibility = 'hidden'; els.position = 'absolute'; els.display = ''; - oHeight = e.clientHeight - ph || parseInt(e.style.height,10); - oWidth = e.clientWidth || parseInt(e.style.width,10); + oHeight = e.clientHeight || parseInt(e.style.height); + oWidth = e.clientWidth || parseInt(e.style.width); els.display = od; els.position = op; els.visibility = ov; @@ -376,20 +358,18 @@ $.getCSS = function(e,p) { (oHeight - ph < 0 ? 0 : oHeight - ph) : (oWidth - pw < 0 ? 0 : oWidth - pw); } - - if (e.style[p]) { + + if (e.style[p]) return e.style[p]; - } else if (e.currentStyle) { + else if (e.currentStyle) return e.currentStyle[p]; - } else if (document.defaultView && document.defaultView.getComputedStyle) { - p = p.replace(/([A-Z])/g,"-$1"); - p = p.toLowerCase(); + else if (document.defaultView && document.defaultView.getComputedStyle) { + p = p.replace(/([A-Z])/g,"-$1").toLowerCase(); var s = document.defaultView.getComputedStyle(e,""); - var r = s ? s.getPropertyValue(p) : p; + var r = s ? s.getPropertyValue(p) : null; return r; - } else { + } else return null; - } }; $.css = $.getCSS; @@ -397,34 +377,65 @@ $.clean = function(a) { var r = []; for ( var i = 0; i < a.length; i++ ) { if ( a[i].constructor == String ) { - if ( a[i].indexOf(""; + } else if ( !a[i].indexOf(""; } + var div = document.createElement("div"); div.innerHTML = a[i]; - if ( tr ) { + + if ( tr || td ) { div = div.firstChild.firstChild; + if ( td ) { + div = div.firstChild; + } } + for ( var j = 0; j < div.childNodes.length; j++ ) { r[r.length] = div.childNodes[j]; } - } else if ( a[i].length ) { + } else if ( a[i].length && !a[i].nodeType ) { for ( var k = 0; k < a[i].length; k++ ) { r[r.length] = a[i][k]; } } else if ( a[i] !== null ) { - r[r.length] = + r[r.length] = a[i].nodeType ? a[i] : document.createTextNode(a[i].toString()); } } return r; }; +$.fn = {}; + +/** + * A wrapper function for each() to be used by append and prepend. + * Handles cases where you're trying to modify the inner contents of + * a table, when you actually need to work with the tbody. + */ +$.fn.domManip = function(fn){ + return this.each(function(){ + var obj = this; + + if ( this.nodeName == 'TABLE' ) { + if ( !this.firstChild ) { + this.appendChild( document.createElement("tbody") ); + } + obj = this.firstChild; + } + + $.apply( obj, fn ); + }); +}; + $.g = { '': "m[2] == '*' || a.nodeName.toUpperCase() == m[2].toUpperCase()", - '#': "a.attributes['id'].nodeValue == m[2]", + '#': "a.getAttribute('id') && a.getAttribute('id').nodeValue == m[2]", ':': { lt: "i < m[3]-0", gt: "i > m[3]-0", @@ -454,7 +465,6 @@ $.g = { disabled: "a.disabled", checked: "a.checked" }, - // TODO: Write getAttribute helper ".": "$.hasWord(a,m[2])", "@": { "=": "$.attr(a,m[3]) == m[4]", @@ -469,14 +479,12 @@ $.g = { "[": "$.Select(m[2],a).length > 0" }; -$.fn = {}; - $.Select = function( t, context ) { context = context || $.context || document; if ( t.constructor != String ) { return [t]; } - + if ( t.indexOf("//") === 0 ) { context = context.documentElement; t = t.substr(2,t.length); @@ -488,20 +496,20 @@ $.Select = function( t, context ) { t = t.substr(t.indexOf('/'),t.length); } } - + var ret = [context]; var done = []; var last = null; - + while ( t.length > 0 && last != t ) { var r = []; last = t; - + t = $.cleanSpaces(t); - + var re = new RegExp( "^//", "i" ); t = t.replace( re, "" ); - + if ( t.indexOf('..') === 0 || t.indexOf('/..') === 0 ) { if ( t.indexOf('/') === 0 ) { t = t.substr(1,t.length); @@ -538,14 +546,14 @@ $.Select = function( t, context ) { } else { var re2 = new RegExp( "^([#.]?)([a-z0-9\\*_-]*)", "i" ); var m = re2.exec(t); - + if ( m[1] == "#" ) { // Ummm, should make this work in all XML docs var oid = document.getElementById(m[2]); r = ret = oid ? [oid] : []; t = t.replace( re2, "" ); } else { if ( m[2] === "" || m[1] == "." ) { m[2] = "*"; } - + for ( var i = 0; i < ret.length; i++ ) { var o = ret[i]; if ( o ) { @@ -556,7 +564,7 @@ $.Select = function( t, context ) { case 'text': case 'radio': case 'checkbox': case 'hidden': case 'button': case 'submit': case 'image': case 'password': case 'reset': case 'file': - r = $.merge( $.grep( $.tag(o,"input"), + r = $.merge( $.grep( $.tag(o,"input"), function(a){ return a.type == m[2]; }), r ); break; case 'input': @@ -597,18 +605,17 @@ $.attr = function(o,a,v){ 'for': 'htmlFor', 'text': 'cssText', 'class': 'className', - 'float': 'cssFloat', - 'style': 'cssText' + 'float': 'cssFloat' }; a = (fix[a] && fix[a].replace && fix[a]) || a; var r = new RegExp("-([a-z])","ig"); a = a.replace(r,function(z,b){return b.toUpperCase();}); if ( typeof v != 'undefined' ) { o[a] = v; - if ( o.setAttribute ) { + if ( o.setAttribute && a != 'disabled' ) { o.setAttribute(a,v); } - } + } return o[a] || o.getAttribute(a) || ''; } else { return ''; @@ -620,21 +627,21 @@ $.filter = function(t,r,not) { if ( not === false ) { g = function(a,f) {return $.grep(a,f,true);}; } - + while ( t.length > 0 && t.match(/^[:\\.#\\[a-zA-Z\\*]/) ) { - var re = new RegExp( "^\\[ *@([a-z0-9\\(\\)_-]+) *([~!\\|\\*$^=]*) *'?\"?([^'\"]*)'?\"? *\\]", "i" ); + var re = new RegExp( "^\\[ *@([a-z0-9\\*\\(\\)_-]+) *([~!\\|\\*$^=]*) *'?\"?([^'\"]*)'?\"? *\\]", "i" ); var m = re.exec(t); - + if ( m !== null ) { m = ['', '@', m[2], m[1], m[3]]; } else { re = new RegExp( "^(\\[) *([^\\]]*) *\\]", "i" ); m = re.exec(t); - + if ( m === null ) { re = new RegExp( "^(:)([a-z0-9\\*_-]*)\\( *[\"']?([^ \\)'\"]*)['\"]? *\\)", "i" ); m = re.exec(t); - + if ( m === null ) { re = new RegExp( "^([:\\.#]*)([a-z0-9\\*_-]*)", "i" ); m = re.exec(t); @@ -642,7 +649,7 @@ $.filter = function(t,r,not) { } } t = t.replace( re, "" ); - + if ( m[1] == ":" && m[2] == "not" ) { r = $.filter(m[3],r,false).r; } else { @@ -653,7 +660,7 @@ $.filter = function(t,r,not) { } else if ( $.g[m[1]][m[2]] ) { f = $.g[m[1]][m[2]]; } - + if ( f !== null ) { eval('f = function(a,i){return ' + f + '}'); r = g( r, f ); @@ -723,7 +730,7 @@ $.getAll = function(o,r) { $.merge = function(a,b) { var d = []; for ( var k = 0; k < b.length; k++ ) { d[k] = b[k]; } - + for ( var i = 0; i < a.length; i++ ) { var c = true; for ( var j = 0; j < b.length; j++ ) { @@ -768,7 +775,12 @@ $.event = {}; // Bind an event to an element // Original by Dean Edwards $.event.add = function(element, type, handler) { - if ( element.location ) { element = window; } // Ughhhhh.... + // For whatever reason, IE has trouble passing the window object + // around, causing it to be cloned in the process + if ( $.browser == "msie" && typeof element.setInterval != "undefined" ) { + element = window; + } + if (!handler.$$guid) { handler.$$guid = $.event.add.guid++; } if (!element.events) { element.events = {}; } var handlers = element.events[type]; @@ -804,7 +816,7 @@ $.event.remove = function(element, type, handler) { }; $.event.trigger = function(element,type,data) { - data = data || [{ type: type }]; + data = data || [ $.event.fix({ type: type }) ]; if ( element && element["on" + type] ) { $.apply( element, element["on" + type], data ); }