X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=jquery%2Fjquery.js;h=c377f63d5ac14ee1832a476249ae4592a77d9147;hb=7eb6a25d5e223053a1ebc824c78bf854a755ccd0;hp=a7629d51b840fac3748da2a3d8cc6e701eb48b01;hpb=66565227051d2e1a066268fe1a7416b3d304e602;p=jquery.git diff --git a/jquery/jquery.js b/jquery/jquery.js index a7629d5..c377f63 100644 --- a/jquery/jquery.js +++ b/jquery/jquery.js @@ -162,7 +162,7 @@ function $(a,c) { append: function() { var clone = this.size() > 1; var a = $.clean(arguments); - return this.each(function(){ + return this.domManip(function(){ for ( var i = 0; i < a.length; i++ ) { this.appendChild( clone ? a[i].cloneNode(true) : a[i] ); } @@ -181,7 +181,7 @@ function $(a,c) { prepend: function() { var clone = this.size() > 1; var a = $.clean(arguments); - return this.each(function(){ + return this.domManip(function(){ for ( var i = a.length - 1; i >= 0; i-- ) { this.insertBefore( clone ? a[i].cloneNode(true) : a[i], this.firstChild ); } @@ -318,7 +318,21 @@ function $(a,c) { return self; } -$.execute = eval; +(function(){ + var b = navigator.userAgent.toLowerCase(); + + // Figure out what browser is being used + $.browser = + ( /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 || []; @@ -330,7 +344,7 @@ $.apply = function(o,f,a) { p[i] = 'a['+i+']'; } o.$$exec = this; - var r = $.execute('o.$$exec(' + p.join(',') + ')'); + var r = eval('o.$$exec(' + p.join(',') + ')'); o.$$exec = null; return r; } @@ -339,24 +353,39 @@ $.apply = function(o,f,a) { $.getCSS = function(e,p) { // Adapted from Prototype 1.4.0 if ( p == 'height' || p == 'width' ) { - if ($.getCSS(e,"display") != 'none') { - return p == 'height' ? - e.offsetHeight || parseInt(e.style.height,10) : - e.offsetWidth || parseInt(e.style.width,10); + + // 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,"borderTop")) + parseInt($.css(e,"borderBottom")); + + var pw = !$.boxModel ? 0 : + parseInt($.css(e,"paddingLeft")) + parseInt($.css(e,"paddingRight")) + + parseInt($.css(e,"borderLeft")) + parseInt($.css(e,"borderRight")); + + var oHeight, oWidth; + + if ($.css(e,"display") != 'none') { + oHeight = e.offsetHeight || parseInt(e.style.height,10); + oWidth = e.offsetWidth || parseInt(e.style.width,10); + } else { + var els = e.style; + var ov = els.visibility; + var op = els.position; + var od = els.display; + els.visibility = 'hidden'; + els.position = 'absolute'; + els.display = ''; + oHeight = e.clientHeight || parseInt(e.style.height,10); + oWidth = e.clientWidth || parseInt(e.style.width,10); + els.display = od; + els.position = op; + els.visibility = ov; } - var els = e.style; - var ov = els.visibility; - var op = els.position; - var od = els.display; - els.visibility = 'hidden'; - els.position = 'absolute'; - els.display = ''; - var oHeight = e.clientHeight || parseInt(e.style.height,10); - var oWidth = e.clientWidth || parseInt(e.style.width,10); - els.display = od; - els.position = op; - els.visibility = ov; - return p == 'height' ? oHeight : oWidth; + + return p == 'height' ? + (oHeight - ph < 0 ? 0 : oHeight - ph) : + (oWidth - pw < 0 ? 0 : oWidth - pw); } if (e.style[p]) { @@ -379,12 +408,29 @@ $.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 || 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]; } @@ -396,9 +442,31 @@ $.clean = function(a) { 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", @@ -428,7 +496,6 @@ $.g = { disabled: "a.disabled", checked: "a.checked" }, - // TODO: Write getAttribute helper ".": "$.hasWord(a,m[2])", "@": { "=": "$.attr(a,m[3]) == m[4]", @@ -443,8 +510,6 @@ $.g = { "[": "$.Select(m[2],a).length > 0" }; -$.fn = {}; - $.Select = function( t, context ) { context = context || $.context || document; if ( t.constructor != String ) { @@ -476,22 +541,22 @@ $.Select = function( t, context ) { var re = new RegExp( "^//", "i" ); t = t.replace( re, "" ); - if ( t.indexOf('..') === 0 || t.indexOf('/..') === 0 ) { + if ( t.indexOf('..') === 0 || t.indexOf('/..') === 0 ) { if ( t.indexOf('/') === 0 ) { t = t.substr(1,t.length); } r = $.map( ret, function(a){ return a.parentNode; } ); t = t.substr(2,t.length); t = $.cleanSpaces(t); - } else if ( t.indexOf('>') === 0 || t.indexOf('/') === 0 ) { + } else if ( t.indexOf('>') === 0 || t.indexOf('/') === 0 ) { r = $.map( ret, function(a){ return ( a.childNodes.length > 0 ? $.sibling( a.firstChild ) : null ); } ); t = t.substr(1,t.length); t = $.cleanSpaces(t); - } else if ( t.indexOf('+') === 0 ) { + } else if ( t.indexOf('+') === 0 ) { r = $.map( ret, function(a){ return $.sibling(a).next; } ); t = t.substr(1,t.length); t = $.cleanSpaces(t); - } else if ( t.indexOf('~') === 0 ) { + } else if ( t.indexOf('~') === 0 ) { r = $.map( ret, function(a){ var r = []; var s = $.sibling(a); @@ -504,19 +569,19 @@ $.Select = function( t, context ) { }); t = t.substr(1,t.length); t = $.cleanSpaces(t); - } else if ( t.indexOf(',') === 0 || t.indexOf('|') === 0 ) { + } else if ( t.indexOf(',') === 0 || t.indexOf('|') === 0 ) { if ( ret[0] == context ) { ret.shift(); } done = $.merge( done, ret ); r = ret = [context]; t = " " + t.substr(1,t.length); - } else { + } 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 = oid ? [oid] : []; - t = t.replace( re, "" ); + r = ret = oid ? [oid] : []; + t = t.replace( re2, "" ); } else { if ( m[2] === "" || m[1] == "." ) { m[2] = "*"; } @@ -547,18 +612,21 @@ $.Select = function( t, context ) { } } - var val = $.filter(t,r); - ret = r = val.r; - t = $.cleanSpaces(val.t); + if ( t ) { + var val = $.filter(t,r); + ret = r = val.r; + t = $.cleanSpaces(val.t); + } } if ( ret && ret[0] == context ) { ret.shift(); } done = $.merge( done, ret ); + return done; }; $.tag = function(a,b){ - return a && typeof a.getElementsByTagName != "undefined" ? + return a && typeof a.getElementsByTagName != 'undefined' ? a.getElementsByTagName( b ) : []; }; @@ -592,7 +660,7 @@ $.filter = function(t,r,not) { } 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 ) { @@ -625,7 +693,7 @@ $.filter = function(t,r,not) { } if ( f !== null ) { - $.execute('f = function(a,i){return ' + f + '}'); + eval('f = function(a,i){return ' + f + '}'); r = g( r, f ); } } @@ -738,7 +806,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]; @@ -774,7 +847,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 ); } @@ -791,16 +864,14 @@ $.event.handle = function(event) { } for ( var i = 0; i < handlers.length; i++ ) { - try { - if ( handlers[i].constructor == Function ) { - this.$$handleEvent = handlers[i]; - if (this.$$handleEvent(event) === false) { - event.preventDefault(); - event.stopPropagation(); - returnValue = false; - } + if ( handlers[i].constructor == Function ) { + this.$$handleEvent = handlers[i]; + if (this.$$handleEvent(event) === false) { + event.preventDefault(); + event.stopPropagation(); + returnValue = false; } - } catch(e){} + } } return returnValue; };