aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Resig <jeresig@gmail.com>2008-12-21 21:22:44 +0000
committerJohn Resig <jeresig@gmail.com>2008-12-21 21:22:44 +0000
commitb850ab2b8e65eadd25093c81bbc67a881daa0488 (patch)
treedf385b3c4b165384f3a6c4ade60760b94db8cac4
parent8ee1708ea93517f69979a6805480597b96b58da7 (diff)
downloadjquery-b850ab2b8e65eadd25093c81bbc67a881daa0488.tar.gz
jquery-b850ab2b8e65eadd25093c81bbc67a881daa0488.zip
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).
-rw-r--r--Makefile1
-rw-r--r--build.xml1
-rw-r--r--src/ajax.js6
-rw-r--r--src/core.js141
-rw-r--r--src/dimensions.js27
-rw-r--r--src/event.js64
6 files changed, 86 insertions, 154 deletions
diff --git a/Makefile b/Makefile
index 05e8a4267..c3a16b955 100644
--- a/Makefile
+++ b/Makefile
@@ -9,6 +9,7 @@ SPEED_DIR = ${PREFIX}/speed
PLUG_DIR = ../plugins
BASE_FILES = ${SRC_DIR}/core.js\
+ ${SRC_DIR}/support.js\
${SRC_DIR}/selector.js\
${SRC_DIR}/event.js\
${SRC_DIR}/ajax.js\
diff --git a/build.xml b/build.xml
index 6ccb0afe8..ec081cea2 100644
--- a/build.xml
+++ b/build.xml
@@ -35,6 +35,7 @@
<concat destfile="${JQ}">
<fileset dir="${SRC_DIR}" includes="intro.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="event.js" />
<fileset dir="${SRC_DIR}" includes="ajax.js" />
diff --git a/src/ajax.js b/src/ajax.js
index d02d33135..6c8a22e8a 100644
--- a/src/ajax.js
+++ b/src/ajax.js
@@ -459,8 +459,7 @@ jQuery.extend({
try {
// IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450
return !xhr.status && location.protocol == "file:" ||
- ( xhr.status >= 200 && xhr.status < 300 ) || xhr.status == 304 || xhr.status == 1223 ||
- jQuery.browser.safari && xhr.status === undefined;
+ ( xhr.status >= 200 && xhr.status < 300 ) || xhr.status == 304 || xhr.status == 1223;
} catch(e){}
return false;
},
@@ -471,8 +470,7 @@ jQuery.extend({
var xhrRes = xhr.getResponseHeader("Last-Modified");
// Firefox always returns 200. check Last-Modified date
- return xhr.status == 304 || xhrRes == jQuery.lastModified[url] ||
- jQuery.browser.safari && xhr.status === undefined;
+ return xhr.status == 304 || xhrRes == jQuery.lastModified[url];
} catch(e){}
return false;
},
diff --git a/src/core.js b/src/core.js
index ea043c807..7ddb2c5b0 100644
--- a/src/core.js
+++ b/src/core.js
@@ -285,7 +285,7 @@ jQuery.fn = jQuery.prototype = {
clone: function( events ) {
// Do the clone
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
// using cloneNode. Calling detachEvent on the
// clone will also remove the events from the orignal
@@ -642,10 +642,10 @@ jQuery.extend({
script = document.createElement("script");
script.type = "text/javascript";
- if ( jQuery.browser.msie )
- script.text = data;
- else
+ if ( jQuery.support.scriptEval )
script.appendChild( document.createTextNode( data ) );
+ else
+ script.text = data;
// Use insertBefore instead of appendChild to circumvent an IE6 bug.
// This arises when a base node is used (#2709).
@@ -834,30 +834,14 @@ jQuery.extend({
curCSS: function( elem, name, force ) {
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
- if ( name == "opacity" && jQuery.browser.msie ) {
+ if ( name == "opacity" && !jQuery.support.opacity ) {
ret = jQuery.attr( style, "opacity" );
return ret == "" ?
"1" :
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
if ( name.match( /float/i ) )
@@ -876,38 +860,9 @@ jQuery.extend({
var computedStyle = defaultView.getComputedStyle( elem, null );
- if ( computedStyle && !color( elem ) )
+ if ( computedStyle )
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
if ( name == "opacity" && ret == "" )
ret = "1";
@@ -991,7 +946,7 @@ jQuery.extend({
[ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] ||
// IE can't serialize <link> and <script> tags normally
- jQuery.browser.msie &&
+ !jQuery.support.htmlSerialize &&
[ 1, "div<div>", "</div>" ] ||
[ 0, "", "" ];
@@ -1004,7 +959,7 @@ jQuery.extend({
div = div.lastChild;
// Remove IE's autoinserted <tbody> from table fragments
- if ( jQuery.browser.msie ) {
+ if ( !jQuery.support.tbody ) {
// String was a <table>, *may* have spurious <tbody>
var tbody = !tags.indexOf("<table") && tags.indexOf("<tbody") < 0 ?
@@ -1019,11 +974,11 @@ jQuery.extend({
if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length )
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 ) {
var found = div.getElementsByTagName("script");
@@ -1068,8 +1023,7 @@ jQuery.extend({
var notxml = !jQuery.isXMLDoc( elem ),
// Whether we are setting (or getting)
- set = value !== undefined,
- msie = jQuery.browser.msie;
+ set = value !== undefined;
// Try to normalize/fix the name
name = notxml && jQuery.props[ name ] || name;
@@ -1083,7 +1037,7 @@ jQuery.extend({
// Safari mis-reports the default selected property of a hidden option
// Accessing the parent's selectedIndex property fixes it
- if ( name == "selected" && jQuery.browser.safari )
+ if ( name == "selected" )
elem.parentNode.selectedIndex;
// If applicable, access the attribute via the DOM 0 way
@@ -1103,14 +1057,14 @@ jQuery.extend({
return elem[ name ];
}
- if ( msie && notxml && name == "style" )
+ if ( !jQuery.support.style && notxml && name == "style" )
return jQuery.attr( elem.style, "cssText", value );
if ( set )
// convert the value to a string (all browsers do this but IE) see #1070
elem.setAttribute( name, "" + value );
- var attr = msie && notxml && special
+ var attr = !jQuery.support.hrefNormalized && notxml && special
// Some attributes require a special call on IE
? elem.getAttribute( name, 2 )
: elem.getAttribute( name );
@@ -1122,7 +1076,7 @@ jQuery.extend({
// elem is actually elem.style ... set the style
// IE uses filters for opacity
- if ( msie && name == "opacity" ) {
+ if ( !jQuery.support.opacity && name == "opacity" ) {
if ( set ) {
// IE has trouble with opacity if it does not have layout
// Force it by setting the zoom level
@@ -1183,7 +1137,7 @@ jQuery.extend({
var i = 0, elem, pos = first.length;
// Also, we need to make sure that the correct elements are being returned
// (IE returns comment nodes in a '*' query)
- if ( jQuery.browser.msie ) {
+ if ( !jQuery.support.getAll ) {
while ( (elem = second[ i++ ]) )
if ( elem.nodeType != 8 )
first[ pos++ ] = elem;
@@ -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();
// Figure out what browser is being used
@@ -1255,26 +1213,8 @@ jQuery.browser = {
mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
};
-var styleFloat = jQuery.browser.msie ?
- "styleFloat" :
- "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"
- }
-});
+// Check to see if the W3C box model is being used
+jQuery.boxModel = !jQuery.browser.msie || document.compatMode == "CSS1Compat";
jQuery.each({
parent: function(elem){return elem.parentNode;},
@@ -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
function num(elem, prop) {
return elem[0] && parseInt( jQuery.curCSS(elem[0], prop, true), 10 ) || 0;
diff --git a/src/dimensions.js b/src/dimensions.js
index bcef47fdf..297118457 100644
--- a/src/dimensions.js
+++ b/src/dimensions.js
@@ -19,5 +19,32 @@ jQuery.each([ "Height", "Width" ], function(i, name){
(margin ?
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
diff --git a/src/event.js b/src/event.js
index 662fc4848..9d0645731 100644
--- a/src/event.js
+++ b/src/event.js
@@ -13,7 +13,7 @@ jQuery.event = {
// For whatever reason, IE has trouble passing the window object
// around, causing it to be cloned in the process
- if ( jQuery.browser.msie && elem.setInterval )
+ if ( elem.setInterval && elem != window )
elem = window;
// Make sure that the function being executed has a unique ID
@@ -383,39 +383,37 @@ function stopImmediatePropagation(){
this.stopPropagation();
}
-if ( !jQuery.browser.msie ){
- // Checks if an event happened on an element within another element
- // Used in jQuery.event.special.mouseenter and mouseleave handlers
- var withinElement = function(event) {
- // Check if mouse(over|out) are still within the same parent element
- var parent = event.relatedTarget;
- // Traverse up the tree
- while ( parent && parent != this )
- try { parent = parent.parentNode; }
- 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 );
- }
- };
+// Checks if an event happened on an element within another element
+// Used in jQuery.event.special.mouseenter and mouseleave handlers
+var withinElement = function(event) {
+ // Check if mouse(over|out) are still within the same parent element
+ var parent = event.relatedTarget;
+ // Traverse up the tree
+ while ( parent && parent != this )
+ try { parent = parent.parentNode; }
+ catch(e) { parent = this; }
- jQuery.each({
- 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 );
- }
- };
- });
-}
+ 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({
+ 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({
bind: function( type, data, fn ) {