From dcf0fa5048ef2379d551f29ffa29b14ec5ee09d5 Mon Sep 17 00:00:00 2001 From: jeresig Date: Mon, 1 Mar 2010 21:24:49 -0500 Subject: [PATCH] More changes to get jQuery in line with JSLint. --- src/ajax.js | 266 ++++++++++++++++++++++---------------------- src/core.js | 10 +- src/css.js | 2 +- src/effects.js | 22 ++-- src/event.js | 18 +-- src/manipulation.js | 16 +-- src/support.js | 4 +- src/traversing.js | 3 +- test/unit/ajax.js | 44 ++++---- 9 files changed, 195 insertions(+), 190 deletions(-) diff --git a/src/ajax.js b/src/ajax.js index bf11a531..360c87c4 100644 --- a/src/ajax.js +++ b/src/ajax.js @@ -203,11 +203,10 @@ jQuery.extend({ etag: {}, ajax: function( origSettings ) { - var s = jQuery.extend(true, {}, jQuery.ajaxSettings, origSettings); - - var jsonp, status, data, - callbackContext = origSettings && origSettings.context || s, - type = s.type.toUpperCase(); + var s = jQuery.extend(true, {}, jQuery.ajaxSettings, origSettings), + jsonp, status, data, type = s.type.toUpperCase(); + + s.context = origSettings && origSettings.context || s; // convert data if not already a string if ( s.data && s.processData && typeof s.data !== "string" ) { @@ -244,14 +243,14 @@ jQuery.extend({ // Handle JSONP-style loading window[ jsonp ] = window[ jsonp ] || function( tmp ) { data = tmp; - success(); - complete(); + jQuery.ajax.handleSuccess( s, xhr, status, data ); + jQuery.ajax.handleComplete( s, xhr, status, data ); // Garbage collect window[ jsonp ] = undefined; try { delete window[ jsonp ]; - } catch(e) {} + } catch( jsonpError ) {} if ( head ) { head.removeChild( script ); @@ -279,7 +278,7 @@ jQuery.extend({ } // Watch for a new set of requests - if ( s.global && jQuery.active++ === 0 ) { + if ( s.global && jQuery.ajax.active++ === 0 ) { jQuery.event.trigger( "ajaxStart" ); } @@ -306,8 +305,8 @@ jQuery.extend({ if ( !done && (!this.readyState || this.readyState === "loaded" || this.readyState === "complete") ) { done = true; - success(); - complete(); + jQuery.ajax.handleSuccess( s, xhr, status, data ); + jQuery.ajax.handleComplete( s, xhr, status, data ); // Handle memory leak in IE script.onload = script.onreadystatechange = null; @@ -371,12 +370,12 @@ jQuery.extend({ xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ? s.accepts[ s.dataType ] + ", */*" : s.accepts._default ); - } catch(e) {} + } catch( headerError ) {} // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && s.beforeSend.call(callbackContext, xhr, s) === false ) { + if ( s.beforeSend && s.beforeSend.call(s.context, xhr, s) === false ) { // Handle the global AJAX counter - if ( s.global && ! --jQuery.active ) { + if ( s.global && jQuery.ajax.active-- === 1 ) { jQuery.event.trigger( "ajaxStop" ); } @@ -386,7 +385,7 @@ jQuery.extend({ } if ( s.global ) { - contextTrigger("ajaxSend", [xhr, s]); + jQuery.ajax.triggerGlobal( s, "ajaxSend", [xhr, s] ); } // Wait for a response to come back @@ -396,7 +395,7 @@ jQuery.extend({ // Opera doesn't call onreadystatechange before this point // so we simulate the call if ( !requestDone ) { - complete(); + jQuery.ajax.handleComplete( s, xhr, status, data ); } requestDone = true; @@ -411,9 +410,9 @@ jQuery.extend({ status = isTimeout === "timeout" ? "timeout" : - !jQuery.httpSuccess( xhr ) ? + !jQuery.ajax.httpSuccess( xhr ) ? "error" : - s.ifModified && jQuery.httpNotModified( xhr, s.url ) ? + s.ifModified && jQuery.ajax.httpNotModified( xhr, s.url ) ? "notmodified" : "success"; @@ -423,10 +422,10 @@ jQuery.extend({ // Watch for, and catch, XML document parse errors try { // process the data (runs the xml through httpData regardless of callback) - data = jQuery.httpData( xhr, s.dataType, s ); - } catch(err) { + data = jQuery.ajax.httpData( xhr, s.dataType, s ); + } catch( parserError ) { status = "parsererror"; - errMsg = err; + errMsg = parserError; } } @@ -434,14 +433,14 @@ jQuery.extend({ if ( status === "success" || status === "notmodified" ) { // JSONP handles its own success callback if ( !jsonp ) { - success(); + jQuery.ajax.handleSuccess( s, xhr, status, data ); } } else { - jQuery.handleError(s, xhr, status, errMsg); + jQuery.ajax.handleError( s, xhr, status, errMsg ); } // Fire the complete handlers - complete(); + jQuery.ajax.handleComplete( s, xhr, status, data ); if ( isTimeout === "timeout" ) { xhr.abort(); @@ -465,7 +464,7 @@ jQuery.extend({ onreadystatechange( "abort" ); }; - } catch(e) { } + } catch( abortError ) {} // Timeout checker if ( s.async && s.timeout > 0 ) { @@ -480,10 +479,12 @@ jQuery.extend({ // Send the data try { xhr.send( type === "POST" || type === "PUT" || type === "DELETE" ? s.data : null ); - } catch(e) { - jQuery.handleError(s, xhr, null, e); + + } catch( sendError ) { + jQuery.ajax.handleError( s, xhr, null, e ); + // Fire the complete handlers - complete(); + jQuery.ajax.handleComplete( s, xhr, status, data ); } // firefox 1.5 doesn't fire statechange for sync requests @@ -491,57 +492,125 @@ jQuery.extend({ onreadystatechange(); } - function success() { - // If a local callback was specified, fire it and pass it the data - if ( s.success ) { - s.success.call( callbackContext, data, status, xhr ); - } - - // Fire the global callback - if ( s.global ) { - contextTrigger( "ajaxSuccess", [xhr, s] ); - } - } - - function complete() { - // Process result - if ( s.complete ) { - s.complete.call( callbackContext, xhr, status); - } - - // The request was completed - if ( s.global ) { - contextTrigger( "ajaxComplete", [xhr, s] ); - } - - // Handle the global AJAX counter - if ( s.global && ! --jQuery.active ) { - jQuery.event.trigger( "ajaxStop" ); - } - } - - function contextTrigger(type, args) { - (s.context ? jQuery(s.context) : jQuery.event).trigger(type, args); - } - // return XMLHttpRequest to allow aborting the request etc. return xhr; }, + // Serialize an array of form elements or a set of + // key/values into a query string + param: function( a, traditional ) { + var s = [], add = function( key, value ) { + // If value is a function, invoke it and return its value + value = jQuery.isFunction(value) ? value() : value; + s[ s.length ] = encodeURIComponent(key) + "=" + encodeURIComponent(value); + }; + + // Set traditional to true for jQuery <= 1.3.2 behavior. + if ( traditional === undefined ) { + traditional = jQuery.ajaxSettings.traditional; + } + + // If an array was passed in, assume that it is an array of form elements. + if ( jQuery.isArray(a) || a.jquery ) { + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + }); + + } else { + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( var prefix in a ) { + buildParams( prefix, a[prefix], traditional, add ); + } + } + + // Return the resulting serialization + return s.join("&").replace(r20, "+"); + } +}); + +function buildParams( prefix, obj, traditional, add ) { + if ( jQuery.isArray(obj) ) { + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || /\[\]$/.test( prefix ) ) { + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + // If array item is non-scalar (array or object), encode its + // numeric index to resolve deserialization ambiguity issues. + // Note that rack (as of 1.0.0) can't currently deserialize + // nested arrays properly, and attempting to do so may cause + // a server error. Possible fixes are to modify rack's + // deserialization algorithm or to provide an option or flag + // to force array serialization to be shallow. + buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add ); + } + }); + + } else if ( !traditional && obj != null && typeof obj === "object" ) { + // Serialize object item. + jQuery.each( obj, function( k, v ) { + buildParams( prefix + "[" + k + "]", v, traditional, add ); + }); + + } else { + // Serialize scalar item. + add( prefix, obj ); + } +} + +jQuery.extend( jQuery.ajax, { + + // Counter for holding the number of active queries + active: 0, + handleError: function( s, xhr, status, e ) { // If a local callback was specified, fire it if ( s.error ) { - s.error.call( s.context || s, xhr, status, e ); + s.error.call( s.context, xhr, status, e ); } // Fire the global callback if ( s.global ) { - (s.context ? jQuery(s.context) : jQuery.event).trigger( "ajaxError", [xhr, s, e] ); + jQuery.ajax.triggerGlobal( s, "ajaxError", [xhr, s, e] ); } }, - // Counter for holding the number of active queries - active: 0, + handleSuccess: function( s, xhr, status, data ) { + // If a local callback was specified, fire it and pass it the data + if ( s.success ) { + s.success.call( s.context, data, status, xhr ); + } + + // Fire the global callback + if ( s.global ) { + jQuery.ajax.triggerGlobal( s, "ajaxSuccess", [xhr, s] ); + } + }, + + handleComplete: function( s, xhr, status ) { + // Process result + if ( s.complete ) { + s.complete.call( s.context, xhr, status ); + } + + // The request was completed + if ( s.global ) { + jQuery.ajax.triggerGlobal( s, "ajaxComplete", [xhr, s] ); + } + + // Handle the global AJAX counter + if ( s.global && jQuery.ajax.active-- === 1 ) { + jQuery.event.trigger( "ajaxStop" ); + } + }, + + triggerGlobal: function( s, type, args ) { + (s.context && s.context.url == null ? jQuery(s.context) : jQuery.event).trigger(type, args); + }, // Determines if an XMLHttpRequest was successful or not httpSuccess: function( xhr ) { @@ -601,71 +670,6 @@ jQuery.extend({ } return data; - }, - - // Serialize an array of form elements or a set of - // key/values into a query string - param: function( a, traditional ) { - var s = []; - - // Set traditional to true for jQuery <= 1.3.2 behavior. - if ( traditional === undefined ) { - traditional = jQuery.ajaxSettings.traditional; - } - - // If an array was passed in, assume that it is an array of form elements. - if ( jQuery.isArray(a) || a.jquery ) { - // Serialize the form elements - jQuery.each( a, function() { - add( this.name, this.value ); - }); - - } else { - // If traditional, encode the "old" way (the way 1.3.2 or older - // did it), otherwise encode params recursively. - for ( var prefix in a ) { - buildParams( prefix, a[prefix] ); - } - } - - // Return the resulting serialization - return s.join("&").replace(r20, "+"); - - function buildParams( prefix, obj ) { - if ( jQuery.isArray(obj) ) { - // Serialize array item. - jQuery.each( obj, function( i, v ) { - if ( traditional || /\[\]$/.test( prefix ) ) { - // Treat each array item as a scalar. - add( prefix, v ); - } else { - // If array item is non-scalar (array or object), encode its - // numeric index to resolve deserialization ambiguity issues. - // Note that rack (as of 1.0.0) can't currently deserialize - // nested arrays properly, and attempting to do so may cause - // a server error. Possible fixes are to modify rack's - // deserialization algorithm or to provide an option or flag - // to force array serialization to be shallow. - buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v ); - } - }); - - } else if ( !traditional && obj != null && typeof obj === "object" ) { - // Serialize object item. - jQuery.each( obj, function( k, v ) { - buildParams( prefix + "[" + k + "]", v ); - }); - - } else { - // Serialize scalar item. - add( prefix, obj ); - } - } - - function add( key, value ) { - // If value is a function, invoke it and return its value - value = jQuery.isFunction(value) ? value() : value; - s[ s.length ] = encodeURIComponent(key) + "=" + encodeURIComponent(value); - } } + }); diff --git a/src/core.js b/src/core.js index 16d05296..50e16765 100644 --- a/src/core.js +++ b/src/core.js @@ -18,7 +18,7 @@ var jQuery = function( selector, context ) { // A simple way to check for HTML strings or ID strings // (both of which we optimize for) - quickExpr = /^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/, + quickExpr = /^[^<]*(<[\w\W]+>)[^>]*$|^#([\w\-]+)$/, // Is it a simple selector isSimple = /^.[^:#\[\.,]*$/, @@ -623,12 +623,14 @@ jQuery.extend({ }, grep: function( elems, callback, inv ) { - var ret = []; + var ret = [], retVal; + inv = !!inv; // Go through the array, only saving the items // that pass the validator function for ( var i = 0, length = elems.length; i < length; i++ ) { - if ( !inv !== !callback( elems[ i ], i ) ) { + retVal = !!callback( elems[ i ], i ); + if ( inv !== retVal ) { ret.push( elems[ i ] ); } } @@ -748,7 +750,7 @@ function doScrollCheck() { // If IE is used, use the trick by Diego Perini // http://javascript.nwbox.com/IEContentLoaded/ document.documentElement.doScroll("left"); - } catch( error ) { + } catch(e) { setTimeout( doScrollCheck, 1 ); return; } diff --git a/src/css.js b/src/css.js index 42d038a2..f675e13f 100644 --- a/src/css.js +++ b/src/css.js @@ -186,7 +186,7 @@ jQuery.extend({ callback.call( elem ); // Revert the old values - for ( var name in options ) { + for ( name in options ) { elem.style[ name ] = old[ name ]; } } diff --git a/src/effects.js b/src/effects.js index c84ff6a8..97456ccc 100644 --- a/src/effects.js +++ b/src/effects.js @@ -1,6 +1,6 @@ var elemdisplay = {}, rfxtypes = /toggle|show|hide/, - rfxnum = /^([+-]=)?([\d+-.]+)(.*)$/, + rfxnum = /^([+\-]=)?([\d+.\-]+)(.*)$/, timerId, fxAttrs = [ // height animations @@ -221,6 +221,16 @@ jQuery.fn.extend({ }); +function genFx( type, num ) { + var obj = {}; + + jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() { + obj[ this ] = type; + }); + + return obj; +} + // Generate shortcuts for custom animations jQuery.each({ slideDown: genFx("show", 1), @@ -470,13 +480,3 @@ if ( jQuery.expr && jQuery.expr.filters ) { }).length; }; } - -function genFx( type, num ) { - var obj = {}; - - jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() { - obj[ this ] = type; - }); - - return obj; -} diff --git a/src/event.js b/src/event.js index abfdc4f1..cec2845a 100644 --- a/src/event.js +++ b/src/event.js @@ -146,7 +146,7 @@ jQuery.event = { handler = returnFalse; } - var ret, type, fn, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType, + var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType, elemData = jQuery.data( elem ), events = elemData && elemData.events; @@ -197,7 +197,7 @@ jQuery.event = { } if ( !handler ) { - for ( var j = 0; j < eventType.length; j++ ) { + for ( j = 0; j < eventType.length; j++ ) { handleObj = eventType[ j ]; if ( all || namespace.test( handleObj.namespace ) ) { @@ -211,7 +211,7 @@ jQuery.event = { special = jQuery.event.special[ type ] || {}; - for ( var j = pos || 0; j < eventType.length; j++ ) { + for ( j = pos || 0; j < eventType.length; j++ ) { handleObj = eventType[ j ]; if ( handler.guid === handleObj.guid ) { @@ -329,7 +329,7 @@ jQuery.event = { } // prevent IE from throwing an error for some elements with some event types, see #3533 - } catch (e) {} + } catch (inlineError) {} if ( !event.isPropagationStopped() && parent ) { jQuery.event.trigger( event, data, parent, true ); @@ -356,7 +356,7 @@ jQuery.event = { } // prevent IE from throwing an error for some elements with some event types, see #3533 - } catch (e) {} + } catch (triggerError) {} if ( old ) { target[ "on" + type ] = old; @@ -368,9 +368,9 @@ jQuery.event = { }, handle: function( event ) { - var all, handlers, namespaces, namespace, events; + var all, handlers, namespaces, namespace, events, args = jQuery.makeArray( arguments ); - event = arguments[0] = jQuery.event.fix( event || window.event ); + event = args[0] = jQuery.event.fix( event || window.event ); event.currentTarget = this; // Namespaced event handlers @@ -400,7 +400,7 @@ jQuery.event = { event.data = handleObj.data; event.handleObj = handleObj; - var ret = handleObj.handler.apply( this, arguments ); + var ret = handleObj.handler.apply( this, args ); if ( ret !== undefined ) { event.result = ret; @@ -1080,7 +1080,7 @@ jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblcl // Handle event binding jQuery.fn[ name ] = function( data, fn ) { - if ( fn == undefined ) { + if ( fn == null ) { fn = data; data = null; } diff --git a/src/manipulation.js b/src/manipulation.js index 529280a6..f276a07c 100644 --- a/src/manipulation.js +++ b/src/manipulation.js @@ -357,16 +357,16 @@ jQuery.fn.extend({ } return this; - - function root( elem, cur ) { - return jQuery.nodeName(elem, "table") ? - (elem.getElementsByTagName("tbody")[0] || - elem.appendChild(elem.ownerDocument.createElement("tbody"))) : - elem; - } } }); +function root( elem, cur ) { + return jQuery.nodeName(elem, "table") ? + (elem.getElementsByTagName("tbody")[0] || + elem.appendChild(elem.ownerDocument.createElement("tbody"))) : + elem; +} + function cloneCopyEvent(orig, ret) { var i = 0; @@ -530,7 +530,7 @@ jQuery.extend({ } if ( fragment ) { - for ( var i = 0; ret[i]; i++ ) { + for ( i = 0; ret[i]; i++ ) { if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) { scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] ); diff --git a/src/support.js b/src/support.js index 5821301a..f9429f95 100644 --- a/src/support.js +++ b/src/support.js @@ -69,7 +69,7 @@ script.type = "text/javascript"; try { script.appendChild( document.createTextNode( "window." + id + "=1;" ) ); - } catch(e) {} + } catch( scriptError ) {} root.insertBefore( script, root.firstChild ); @@ -86,7 +86,7 @@ try { delete script.test; - } catch(e) { + } catch( expandoError ) { jQuery.support.deleteExpando = false; } diff --git a/src/traversing.js b/src/traversing.js index e597e204..67760450 100644 --- a/src/traversing.js +++ b/src/traversing.js @@ -7,7 +7,8 @@ var runtil = /Until$/, var winnow = function( elements, qualifier, keep ) { if ( jQuery.isFunction( qualifier ) ) { return jQuery.grep(elements, function( elem, i ) { - return !!qualifier.call( elem, i, elem ) === keep; + var retVal = !!qualifier.call( elem, i, elem ); + return retVal === keep; }); } else if ( qualifier.nodeType ) { diff --git a/test/unit/ajax.js b/test/unit/ajax.js index 0464c7b5..ce257f88 100644 --- a/test/unit/ajax.js +++ b/test/unit/ajax.js @@ -14,30 +14,28 @@ test("jQuery.ajax() - success callbacks", function() { stop(); - setTimeout(function(){ - jQuery('#foo').ajaxStart(function(){ - ok( true, "ajaxStart" ); - }).ajaxStop(function(){ - ok( true, "ajaxStop" ); - start(); - }).ajaxSend(function(){ - ok( true, "ajaxSend" ); - }).ajaxComplete(function(){ - ok( true, "ajaxComplete" ); - }).ajaxError(function(){ - ok( false, "ajaxError" ); - }).ajaxSuccess(function(){ - ok( true, "ajaxSuccess" ); - }); + jQuery('#foo').ajaxStart(function(){ + ok( true, "ajaxStart" ); + }).ajaxStop(function(){ + ok( true, "ajaxStop" ); + start(); + }).ajaxSend(function(){ + ok( true, "ajaxSend" ); + }).ajaxComplete(function(){ + ok( true, "ajaxComplete" ); + }).ajaxError(function(){ + ok( false, "ajaxError" ); + }).ajaxSuccess(function(){ + ok( true, "ajaxSuccess" ); + }); - jQuery.ajax({ - url: url("data/name.html"), - beforeSend: function(){ ok(true, "beforeSend"); }, - success: function(){ ok(true, "success"); }, - error: function(){ ok(false, "error"); }, - complete: function(){ ok(true, "complete"); } - }); - }, 13); + jQuery.ajax({ + url: url("data/name.html"), + beforeSend: function(){ ok(true, "beforeSend"); }, + success: function(){ ok(true, "success"); }, + error: function(){ ok(false, "error"); }, + complete: function(){ ok(true, "complete"); } + }); }); test("jQuery.ajax() - error callbacks", function() {