Commit b850ab2b authored by John Resig's avatar John Resig

Added the new jQuery.support object and removed all uses of jQuery.browser...

Added the new jQuery.support object and removed all uses of jQuery.browser from within jQuery itself (while simultaneously deprecating the use of jQuery.browser).
parent 8ee1708e
...@@ -9,6 +9,7 @@ SPEED_DIR = ${PREFIX}/speed ...@@ -9,6 +9,7 @@ SPEED_DIR = ${PREFIX}/speed
PLUG_DIR = ../plugins PLUG_DIR = ../plugins
BASE_FILES = ${SRC_DIR}/core.js\ BASE_FILES = ${SRC_DIR}/core.js\
${SRC_DIR}/support.js\
${SRC_DIR}/selector.js\ ${SRC_DIR}/selector.js\
${SRC_DIR}/event.js\ ${SRC_DIR}/event.js\
${SRC_DIR}/ajax.js\ ${SRC_DIR}/ajax.js\
......
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
<concat destfile="${JQ}"> <concat destfile="${JQ}">
<fileset dir="${SRC_DIR}" includes="intro.js" /> <fileset dir="${SRC_DIR}" includes="intro.js" />
<fileset dir="${SRC_DIR}" includes="core.js" /> <fileset dir="${SRC_DIR}" includes="core.js" />
<fileset dir="${SRC_DIR}" includes="support.js" />
<fileset dir="${SRC_DIR}" includes="selector.js" /> <fileset dir="${SRC_DIR}" includes="selector.js" />
<fileset dir="${SRC_DIR}" includes="event.js" /> <fileset dir="${SRC_DIR}" includes="event.js" />
<fileset dir="${SRC_DIR}" includes="ajax.js" /> <fileset dir="${SRC_DIR}" includes="ajax.js" />
......
...@@ -459,8 +459,7 @@ jQuery.extend({ ...@@ -459,8 +459,7 @@ jQuery.extend({
try { try {
// IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450 // IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450
return !xhr.status && location.protocol == "file:" || return !xhr.status && location.protocol == "file:" ||
( xhr.status >= 200 && xhr.status < 300 ) || xhr.status == 304 || xhr.status == 1223 || ( xhr.status >= 200 && xhr.status < 300 ) || xhr.status == 304 || xhr.status == 1223;
jQuery.browser.safari && xhr.status === undefined;
} catch(e){} } catch(e){}
return false; return false;
}, },
...@@ -471,8 +470,7 @@ jQuery.extend({ ...@@ -471,8 +470,7 @@ jQuery.extend({
var xhrRes = xhr.getResponseHeader("Last-Modified"); var xhrRes = xhr.getResponseHeader("Last-Modified");
// Firefox always returns 200. check Last-Modified date // Firefox always returns 200. check Last-Modified date
return xhr.status == 304 || xhrRes == jQuery.lastModified[url] || return xhr.status == 304 || xhrRes == jQuery.lastModified[url];
jQuery.browser.safari && xhr.status === undefined;
} catch(e){} } catch(e){}
return false; return false;
}, },
......
...@@ -285,7 +285,7 @@ jQuery.fn = jQuery.prototype = { ...@@ -285,7 +285,7 @@ jQuery.fn = jQuery.prototype = {
clone: function( events ) { clone: function( events ) {
// Do the clone // Do the clone
var ret = this.map(function(){ var ret = this.map(function(){
if ( jQuery.browser.msie && !jQuery.isXMLDoc(this) ) { if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) {
// IE copies events bound via attachEvent when // IE copies events bound via attachEvent when
// using cloneNode. Calling detachEvent on the // using cloneNode. Calling detachEvent on the
// clone will also remove the events from the orignal // clone will also remove the events from the orignal
...@@ -642,10 +642,10 @@ jQuery.extend({ ...@@ -642,10 +642,10 @@ jQuery.extend({
script = document.createElement("script"); script = document.createElement("script");
script.type = "text/javascript"; script.type = "text/javascript";
if ( jQuery.browser.msie ) if ( jQuery.support.scriptEval )
script.text = data;
else
script.appendChild( document.createTextNode( data ) ); script.appendChild( document.createTextNode( data ) );
else
script.text = data;
// Use insertBefore instead of appendChild to circumvent an IE6 bug. // Use insertBefore instead of appendChild to circumvent an IE6 bug.
// This arises when a base node is used (#2709). // This arises when a base node is used (#2709).
...@@ -834,30 +834,14 @@ jQuery.extend({ ...@@ -834,30 +834,14 @@ jQuery.extend({
curCSS: function( elem, name, force ) { curCSS: function( elem, name, force ) {
var ret, style = elem.style; var ret, style = elem.style;
// A helper method for determining if an element's values are broken
function color( elem ) {
if ( !jQuery.browser.safari )
return false;
// defaultView is cached
var ret = defaultView.getComputedStyle( elem, null );
return !ret || ret.getPropertyValue("color") == "";
}
// We need to handle opacity special in IE // We need to handle opacity special in IE
if ( name == "opacity" && jQuery.browser.msie ) { if ( name == "opacity" && !jQuery.support.opacity ) {
ret = jQuery.attr( style, "opacity" ); ret = jQuery.attr( style, "opacity" );
return ret == "" ? return ret == "" ?
"1" : "1" :
ret; ret;
} }
// Opera sometimes will give the wrong display answer, this fixes it, see #2037
if ( jQuery.browser.opera && name == "display" ) {
var save = style.outline;
style.outline = "0 solid black";
style.outline = save;
}
// Make sure we're using the right name for getting the float value // Make sure we're using the right name for getting the float value
if ( name.match( /float/i ) ) if ( name.match( /float/i ) )
...@@ -876,38 +860,9 @@ jQuery.extend({ ...@@ -876,38 +860,9 @@ jQuery.extend({
var computedStyle = defaultView.getComputedStyle( elem, null ); var computedStyle = defaultView.getComputedStyle( elem, null );
if ( computedStyle && !color( elem ) ) if ( computedStyle )
ret = computedStyle.getPropertyValue( name ); ret = computedStyle.getPropertyValue( name );
// If the element isn't reporting its values properly in Safari
// then some display: none elements are involved
else {
var swap = [], stack = [], a = elem, i = 0;
// Locate all of the parent display: none elements
for ( ; a && color(a); a = a.parentNode )
stack.unshift(a);
// Go through and make them visible, but in reverse
// (It would be better if we knew the exact display type that they had)
for ( ; i < stack.length; i++ )
if ( color( stack[ i ] ) ) {
swap[ i ] = stack[ i ].style.display;
stack[ i ].style.display = "block";
}
// Since we flip the display style, we have to handle that
// one special, otherwise get the value
ret = name == "display" && swap[ stack.length - 1 ] != null ?
"none" :
( computedStyle && computedStyle.getPropertyValue( name ) ) || "";
// Finally, revert the display styles back
for ( i = 0; i < swap.length; i++ )
if ( swap[ i ] != null )
stack[ i ].style.display = swap[ i ];
}
// We should always get a number back from opacity // We should always get a number back from opacity
if ( name == "opacity" && ret == "" ) if ( name == "opacity" && ret == "" )
ret = "1"; ret = "1";
...@@ -991,7 +946,7 @@ jQuery.extend({ ...@@ -991,7 +946,7 @@ jQuery.extend({
[ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] || [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] ||
// IE can't serialize <link> and <script> tags normally // IE can't serialize <link> and <script> tags normally
jQuery.browser.msie && !jQuery.support.htmlSerialize &&
[ 1, "div<div>", "</div>" ] || [ 1, "div<div>", "</div>" ] ||
[ 0, "", "" ]; [ 0, "", "" ];
...@@ -1004,7 +959,7 @@ jQuery.extend({ ...@@ -1004,7 +959,7 @@ jQuery.extend({
div = div.lastChild; div = div.lastChild;
// Remove IE's autoinserted <tbody> from table fragments // Remove IE's autoinserted <tbody> from table fragments
if ( jQuery.browser.msie ) { if ( !jQuery.support.tbody ) {
// String was a <table>, *may* have spurious <tbody> // String was a <table>, *may* have spurious <tbody>
var tbody = !tags.indexOf("<table") && tags.indexOf("<tbody") < 0 ? var tbody = !tags.indexOf("<table") && tags.indexOf("<tbody") < 0 ?
...@@ -1019,11 +974,11 @@ jQuery.extend({ ...@@ -1019,11 +974,11 @@ jQuery.extend({
if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length )
tbody[ j ].parentNode.removeChild( tbody[ j ] ); tbody[ j ].parentNode.removeChild( tbody[ j ] );
// IE completely kills leading whitespace when innerHTML is used }
if ( /^\s/.test( elem ) )
div.insertBefore( context.createTextNode( elem.match(/^\s*/)[0] ), div.firstChild );
} // IE completely kills leading whitespace when innerHTML is used
if ( !jQuery.support.leadingWhitespace && /^\s/.test( elem ) )
div.insertBefore( context.createTextNode( elem.match(/^\s*/)[0] ), div.firstChild );
if ( fragment ) { if ( fragment ) {
var found = div.getElementsByTagName("script"); var found = div.getElementsByTagName("script");
...@@ -1068,8 +1023,7 @@ jQuery.extend({ ...@@ -1068,8 +1023,7 @@ jQuery.extend({
var notxml = !jQuery.isXMLDoc( elem ), var notxml = !jQuery.isXMLDoc( elem ),
// Whether we are setting (or getting) // Whether we are setting (or getting)
set = value !== undefined, set = value !== undefined;
msie = jQuery.browser.msie;
// Try to normalize/fix the name // Try to normalize/fix the name
name = notxml && jQuery.props[ name ] || name; name = notxml && jQuery.props[ name ] || name;
...@@ -1083,7 +1037,7 @@ jQuery.extend({ ...@@ -1083,7 +1037,7 @@ jQuery.extend({
// Safari mis-reports the default selected property of a hidden option // Safari mis-reports the default selected property of a hidden option
// Accessing the parent's selectedIndex property fixes it // Accessing the parent's selectedIndex property fixes it
if ( name == "selected" && jQuery.browser.safari ) if ( name == "selected" )
elem.parentNode.selectedIndex; elem.parentNode.selectedIndex;
// If applicable, access the attribute via the DOM 0 way // If applicable, access the attribute via the DOM 0 way
...@@ -1103,14 +1057,14 @@ jQuery.extend({ ...@@ -1103,14 +1057,14 @@ jQuery.extend({
return elem[ name ]; return elem[ name ];
} }
if ( msie && notxml && name == "style" ) if ( !jQuery.support.style && notxml && name == "style" )
return jQuery.attr( elem.style, "cssText", value ); return jQuery.attr( elem.style, "cssText", value );
if ( set ) if ( set )
// convert the value to a string (all browsers do this but IE) see #1070 // convert the value to a string (all browsers do this but IE) see #1070
elem.setAttribute( name, "" + value ); elem.setAttribute( name, "" + value );
var attr = msie && notxml && special var attr = !jQuery.support.hrefNormalized && notxml && special
// Some attributes require a special call on IE // Some attributes require a special call on IE
? elem.getAttribute( name, 2 ) ? elem.getAttribute( name, 2 )
: elem.getAttribute( name ); : elem.getAttribute( name );
...@@ -1122,7 +1076,7 @@ jQuery.extend({ ...@@ -1122,7 +1076,7 @@ jQuery.extend({
// elem is actually elem.style ... set the style // elem is actually elem.style ... set the style
// IE uses filters for opacity // IE uses filters for opacity
if ( msie && name == "opacity" ) { if ( !jQuery.support.opacity && name == "opacity" ) {
if ( set ) { if ( set ) {
// IE has trouble with opacity if it does not have layout // IE has trouble with opacity if it does not have layout
// Force it by setting the zoom level // Force it by setting the zoom level
...@@ -1183,7 +1137,7 @@ jQuery.extend({ ...@@ -1183,7 +1137,7 @@ jQuery.extend({
var i = 0, elem, pos = first.length; var i = 0, elem, pos = first.length;
// Also, we need to make sure that the correct elements are being returned // Also, we need to make sure that the correct elements are being returned
// (IE returns comment nodes in a '*' query) // (IE returns comment nodes in a '*' query)
if ( jQuery.browser.msie ) { if ( !jQuery.support.getAll ) {
while ( (elem = second[ i++ ]) ) while ( (elem = second[ i++ ]) )
if ( elem.nodeType != 8 ) if ( elem.nodeType != 8 )
first[ pos++ ] = elem; first[ pos++ ] = elem;
...@@ -1244,6 +1198,10 @@ jQuery.extend({ ...@@ -1244,6 +1198,10 @@ jQuery.extend({
} }
}); });
// Use of jQuery.browser is deprecated.
// It's included for backwards compatibility and plugins,
// although they should work to migrate away.
var userAgent = navigator.userAgent.toLowerCase(); var userAgent = navigator.userAgent.toLowerCase();
// Figure out what browser is being used // Figure out what browser is being used
...@@ -1255,26 +1213,8 @@ jQuery.browser = { ...@@ -1255,26 +1213,8 @@ jQuery.browser = {
mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent ) mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
}; };
var styleFloat = jQuery.browser.msie ? // Check to see if the W3C box model is being used
"styleFloat" : jQuery.boxModel = !jQuery.browser.msie || document.compatMode == "CSS1Compat";
"cssFloat";
jQuery.extend({
// Check to see if the W3C box model is being used
boxModel: !jQuery.browser.msie || document.compatMode == "CSS1Compat",
props: {
"for": "htmlFor",
"class": "className",
"float": styleFloat,
cssFloat: styleFloat,
styleFloat: styleFloat,
readonly: "readOnly",
maxlength: "maxLength",
cellspacing: "cellSpacing",
rowspan: "rowSpan"
}
});
jQuery.each({ jQuery.each({
parent: function(elem){return elem.parentNode;}, parent: function(elem){return elem.parentNode;},
...@@ -1359,39 +1299,6 @@ jQuery.each({ ...@@ -1359,39 +1299,6 @@ jQuery.each({
}; };
}); });
jQuery.each([ "Height", "Width" ], function(i, name){
var type = name.toLowerCase();
jQuery.fn[ type ] = function( size ) {
// Get window width or height
return this[0] == window ?
// Opera reports document.body.client[Width/Height] properly in both quirks and standards
jQuery.browser.opera && document.body.parentNode[ "client" + name ] ||
// Safari reports inner[Width/Height] just fine (Mozilla and Opera include scroll bar widths)
jQuery.browser.safari && window[ "inner" + name ] ||
// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
document.compatMode == "CSS1Compat" && document.documentElement[ "client" + name ] || document.body[ "client" + name ] :
// Get document width or height
this[0] == document ?
// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
Math.max(
Math.max(document.body["scroll" + name], document.documentElement["scroll" + name]),
Math.max(document.body["offset" + name], document.documentElement["offset" + name])
) :
// Get or set width or height on the element
size === undefined ?
// Get width or height on the element
(this.length ? jQuery.css( this[0], type ) : null) :
// Set the width or height on the element (default to pixels if value is unitless)
this.css( type, typeof size === "string" ? size : size + "px" );
};
});
// Helper function used by the dimensions and offset modules // Helper function used by the dimensions and offset modules
function num(elem, prop) { function num(elem, prop) {
return elem[0] && parseInt( jQuery.curCSS(elem[0], prop, true), 10 ) || 0; return elem[0] && parseInt( jQuery.curCSS(elem[0], prop, true), 10 ) || 0;
......
...@@ -19,5 +19,32 @@ jQuery.each([ "Height", "Width" ], function(i, name){ ...@@ -19,5 +19,32 @@ jQuery.each([ "Height", "Width" ], function(i, name){
(margin ? (margin ?
num(this, "margin" + tl) + num(this, "margin" + br) : 0); num(this, "margin" + tl) + num(this, "margin" + br) : 0);
}; };
var type = name.toLowerCase();
jQuery.fn[ type ] = function( size ) {
// Get window width or height
return this[0] == window ?
// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
document.compatMode == "CSS1Compat" && document.documentElement[ "client" + name ] ||
document.body[ "client" + name ] :
// Get document width or height
this[0] == document ?
// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
Math.max(
document.documentElement["client" + name],
document.body["scroll" + name], document.documentElement["scroll" + name],
document.body["offset" + name], document.documentElement["offset" + name]
) :
// Get or set width or height on the element
size === undefined ?
// Get width or height on the element
(this.length ? jQuery.css( this[0], type ) : null) :
// Set the width or height on the element (default to pixels if value is unitless)
this.css( type, typeof size === "string" ? size : size + "px" );
};
}); });
\ No newline at end of file
...@@ -13,7 +13,7 @@ jQuery.event = { ...@@ -13,7 +13,7 @@ jQuery.event = {
// For whatever reason, IE has trouble passing the window object // For whatever reason, IE has trouble passing the window object
// around, causing it to be cloned in the process // around, causing it to be cloned in the process
if ( jQuery.browser.msie && elem.setInterval ) if ( elem.setInterval && elem != window )
elem = window; elem = window;
// Make sure that the function being executed has a unique ID // Make sure that the function being executed has a unique ID
...@@ -383,39 +383,37 @@ function stopImmediatePropagation(){ ...@@ -383,39 +383,37 @@ function stopImmediatePropagation(){
this.stopPropagation(); this.stopPropagation();
} }
if ( !jQuery.browser.msie ){ // Checks if an event happened on an element within another element
// Checks if an event happened on an element within another element // Used in jQuery.event.special.mouseenter and mouseleave handlers
// Used in jQuery.event.special.mouseenter and mouseleave handlers var withinElement = function(event) {
var withinElement = function(event) { // Check if mouse(over|out) are still within the same parent element
// Check if mouse(over|out) are still within the same parent element var parent = event.relatedTarget;
var parent = event.relatedTarget; // Traverse up the tree
// Traverse up the tree while ( parent && parent != this )
while ( parent && parent != this ) try { parent = parent.parentNode; }
try { parent = parent.parentNode; } catch(e) { parent = this; }
catch(e) { parent = this; }
if( parent != this ){
// set the correct event type
event.type = event.data;
// handle event if we actually just moused on to a non sub-element
jQuery.event.handle.apply( this, arguments );
}
};
jQuery.each({ if( parent != this ){
mouseover: 'mouseenter', // set the correct event type
mouseout: 'mouseleave' event.type = event.data;
}, function( orig, fix ){ // handle event if we actually just moused on to a non sub-element
jQuery.event.special[ fix ] = { jQuery.event.handle.apply( this, arguments );
setup: function(){ }
jQuery.event.add( this, orig, withinElement, fix ); };
},
teardown: function(){ jQuery.each({
jQuery.event.remove( this, orig, withinElement ); mouseover: 'mouseenter',
} mouseout: 'mouseleave'
}; }, function( orig, fix ){
}); jQuery.event.special[ fix ] = {
} setup: function(){
jQuery.event.add( this, orig, withinElement, fix );
},
teardown: function(){
jQuery.event.remove( this, orig, withinElement );
}
};
});
jQuery.fn.extend({ jQuery.fn.extend({
bind: function( type, data, fn ) { bind: function( type, data, fn ) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment