X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=jquery%2Fjquery.js;h=7577936580e49ec4de4d588e286fe9409c4cdfd2;hb=9e27d8d1b4d5a93ef4107aab5e815a2c24ed899d;hp=bd25ed2055a7401bebe16b8165167130e292ff6f;hpb=d71a85001b0562ed05925e0c5635c3c0a1d52068;p=jquery.git diff --git a/jquery/jquery.js b/jquery/jquery.js index bd25ed2..7577936 100644 --- a/jquery/jquery.js +++ b/jquery/jquery.js @@ -9,6 +9,9 @@ * $Rev$ */ +/* For JSLint (jslint.com): */ +/*extern ActiveXObject Prototype setTimeout setInterval clearInterval document window XMLHttpRequest navigator*/ + function $(a,c) { var $a = a || $.context || document; var $c = c && c.$jquery && c.get(0) || c; @@ -22,7 +25,7 @@ function $(a,c) { $c = $c && $c.documentElement || document; if ( $c.getElementsByTagName($a).length === 0 ) { var obj = $c.getElementById($a); - if ( obj !== null ) { return obj; } + if ( obj ) { return obj; } } } } else if ( $a.constructor == Array ) { @@ -43,7 +46,7 @@ function $(a,c) { // The only two getters size: function() {return this.get().length;}, get: function(i) { - return i === null ? this.cur : this.cur[i]; + return typeof i == 'undefined' ? this.cur : this.cur[i]; }, each: function(f) { @@ -54,7 +57,7 @@ function $(a,c) { }, set: function(a,b) { return this.each(function(){ - if ( b === null ) { + if ( typeof b == 'undefined' ) { for ( var j in a ) { $.attr(this,j,a[j]); } @@ -64,11 +67,11 @@ function $(a,c) { }); }, html: function(h) { - return h === null && this.size() ? + return typeof h == 'undefined' && this.size() ? this.get(0).innerHTML : this.set( "innerHTML", h ); }, val: function(h) { - return h === null && this.size() ? + return typeof h == 'undefined' && this.size() ? this.get(0).value : this.set( "value", h ); }, @@ -121,7 +124,7 @@ function $(a,c) { }, removeClass: function(c) { return this.each(function(){ - this.className = c === null ? '' : + this.className = !c ? '' : this.className.replace( new RegExp('(^|\\s*\\b[^-])'+c+'($|\\b(?=[^-]))', 'g'), ''); }); @@ -214,13 +217,13 @@ function $(a,c) { }, bind: function(t,f) { - return this.each(function(){addEvent(this,t,f);}); + return this.each(function(){$.event.add(this,t,f);}); }, unbind: function(t,f) { - return this.each(function(){removeEvent(this,t,f);}); + return this.each(function(){$.event.remove(this,t,f);}); }, trigger: function(t) { - return this.each(function(){triggerEvent(this,t);}); + return this.each(function(){$.event.trigger(this,t);}); }, find: function(t) { @@ -302,7 +305,7 @@ function $(a,c) { } for ( var k in self ) {(function(j){ try { - if ( $a[j] === null ) { + if ( !$a[j] ) { $a[j] = function() { return $.apply(self,self[j],arguments); }; @@ -315,6 +318,22 @@ function $(a,c) { return self; } +(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 || []; if ( f.apply ) { @@ -334,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]) { @@ -374,8 +408,15 @@ $.clean = function(a) { var r = []; for ( var i = 0; i < a.length; i++ ) { if ( a[i].constructor == String ) { + if ( a[i].indexOf(""; + } var div = document.createElement("div"); div.innerHTML = a[i]; + if ( tr ) { + div = div.firstChild.firstChild; + } for ( var j = 0; j < div.childNodes.length; j++ ) { r[r.length] = div.childNodes[j]; } @@ -393,7 +434,7 @@ $.clean = function(a) { $.g = { '': "m[2] == '*' || a.nodeName.toUpperCase() == m[2].toUpperCase()", - '#': "a.id == m[2]", + '#': "a.getAttribute('id') && a.getAttribute('id').nodeValue == m[2]", ':': { lt: "i < m[3]-0", gt: "i > m[3]-0", @@ -471,22 +512,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); @@ -499,19 +540,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] = "*"; } @@ -542,18 +583,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 ) : []; }; @@ -563,12 +607,13 @@ $.attr = function(o,a,v){ 'for': 'htmlFor', 'text': 'cssText', 'class': 'className', - 'float': 'cssFloat' + 'float': 'cssFloat', + 'style': 'cssText' }; 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 ( v !== null ) { + if ( typeof v != 'undefined' ) { o[a] = v; if ( o.setAttribute ) { o.setAttribute(a,v); @@ -620,7 +665,7 @@ $.filter = function(t,r,not) { } if ( f !== null ) { - f = new Function('a','i','return ' + f); + eval('f = function(a,i){return ' + f + '}'); r = g( r, f ); } } @@ -646,7 +691,7 @@ $.cleanSpaces = function(t){ $.ofType = function(a,n,e) { var t = $.grep($.sibling(a),function(b){return b.nodeName == a.nodeName;}); if ( e ) { n = t.length - n - 1; } - return n !== null ? t[n] == a : t.length; + return typeof n != 'undefined' ? t[n] == a : t.length; }; $.sibling = function(a,n,e) { @@ -668,7 +713,7 @@ $.sibling = function(a,n,e) { }; $.hasWord = function(e,a) { - if ( e === null ) { return false; } + if ( typeof e == 'undefined' ) { return false; } if ( e.className !== null ) { e = e.className; } return new RegExp("(^|\\s)" + a + "(\\s|$)").test(e); }; @@ -706,7 +751,7 @@ $.merge = function(a,b) { $.grep = function(a,f,s) { var r = []; - if ( a !== null ) { + if ( typeof a != 'undefined' ) { for ( var i = 0; i < a.length; i++ ) { if ( (!s && f(a[i],i)) || (s && !f(a[i],i)) ) { r[r.length] = a[i]; @@ -728,11 +773,18 @@ $.map = function(a,f) { return r; }; +$.event = {}; + // Bind an event to an element // Original by Dean Edwards -function addEvent(element, type, handler) { - if ( element.location ) { element = window; } // Ughhhhh.... - if (!handler.$$guid) { handler.$$guid = addEvent.guid++; } +$.event.add = function(element, type, handler) { + // 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]; if (!handlers) { @@ -742,13 +794,13 @@ function addEvent(element, type, handler) { } } handlers[handler.$$guid] = handler; - element["on" + type] = handleEvent; -} + element["on" + type] = $.event.handle; +}; -addEvent.guid = 1; +$.event.add.guid = 1; // Detach an event or set of events from an element -function removeEvent(element, type, handler) { +$.event.remove = function(element, type, handler) { if (element.events) { if (type && element.events[type]) { if ( handler ) { @@ -760,52 +812,53 @@ function removeEvent(element, type, handler) { } } else { for ( var j in element.events ) { - removeEvent( element, j ); + $.event.remove( element, j ); } } } -} +}; -function triggerEvent(element,type,data) { - data = data || [{ type: type }]; +$.event.trigger = function(element,type,data) { + data = data || [ $.event.fix({ type: type }) ]; if ( element && element["on" + type] ) { $.apply( element, element["on" + type], data ); } -} +}; + +$.event.handle = function(event) { + if ( !event && !window.event ) { return null; } + + var returnValue = true, handlers = []; + event = event || $.event.fix(window.event); -function handleEvent(event) { - var returnValue = true; - event = event || fixEvent(window.event); - var handlers = []; for ( var j in this.events[event.type] ) { handlers[handlers.length] = this.events[event.type][j]; } + 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; -} +}; -function fixEvent(event) { - event.preventDefault = fixEvent.preventDefault; - event.stopPropagation = fixEvent.stopPropagation; +$.event.fix = function(event) { + event.preventDefault = $.event.fix.preventDefault; + event.stopPropagation = $.event.fix.stopPropagation; return event; -} +}; -fixEvent.preventDefault = function() { +$.event.fix.preventDefault = function() { this.returnValue = false; }; -fixEvent.stopPropagation = function() { +$.event.fix.stopPropagation = function() { this.cancelBubble = true; };