diff --git a/src/ajax/jsonp.js b/src/ajax/jsonp.js index 5cfb7834a..0af00567c 100644 --- a/src/ajax/jsonp.js +++ b/src/ajax/jsonp.js @@ -4,82 +4,81 @@ var jsc = jQuery.now(), jsre = /\=\?(&|$)/, rquery_jsonp = /\?/; -// Default jsonp callback name -jQuery.ajaxSettings.jsonpCallback = function() { - return "jsonp" + jsc++; -}; +// Default jsonp settings +jQuery.ajaxSetup({ + jsonp: "callback", + jsonpCallback: function() { + return "jsonp" + jsc++; + } +}); // Normalize jsonp queries // 1) put callback parameter in url or data -// 2) sneakily ensure transportDataType is json -// 3) ensure options jsonp is always provided so that jsonp requests are always -// json request with the jsonp option set -jQuery.ajax.prefilter("json jsonp", function(s) { +// 2) sneakily ensure transportDataType is always jsonp for jsonp requests +jQuery.ajax.prefilter("json jsonp", function(s, originalSettings) { - var transportDataType = s.dataTypes[ 0 ]; + if ( s.dataTypes[ 0 ] === "jsonp" || + originalSettings.jsonp || + originalSettings.jsonpCallback || + jsre.test(s.url) || + typeof(s.data) === "string" && jsre.test(s.data) ) { - s.dataTypes[ 0 ] = "json"; - - if ( s.jsonp || - transportDataType === "jsonp" || - transportDataType === "json" && ( jsre.test(s.url) || typeof(s.data) === "string" && jsre.test(s.data) ) ) { - - var jsonp = s.jsonp = s.jsonp || "callback", - jsonpCallback = s.jsonpCallback = + var jsonpCallback = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback, url = s.url.replace(jsre, "=" + jsonpCallback + "$1"), - data = s.url == url && typeof(s.data) === "string" ? s.data.replace(jsre, "=" + jsonpCallback + "$1") : s.data; + data = s.url === url && typeof(s.data) === "string" ? s.data.replace(jsre, "=" + jsonpCallback + "$1") : s.data; - if ( url == s.url && data == s.data ) { - url = url += (rquery_jsonp.test( url ) ? "&" : "?") + jsonp + "=" + jsonpCallback; + if ( url === s.url && data === s.data ) { + url += (rquery_jsonp.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback; } s.url = url; s.data = data; + s.dataTypes[ 0 ] = "jsonp"; } -// Bind transport to json dataType -}).transport("json", function(s) { +// Bind transport to jsonp dataType +}).transport("jsonp", function(s) { - if ( s.jsonp ) { + // Put callback in place + var responseContainer, + jsonpCallback = s.jsonpCallback, + previous = window[ jsonpCallback ]; - // Put callback in place - var responseContainer, - jsonpCallback = s.jsonpCallback, - previous = window[ jsonpCallback ]; + window [ jsonpCallback ] = function( response ) { + responseContainer = [response]; + }; - window [ jsonpCallback ] = function( response ) { - responseContainer = [response]; - }; + s.complete = [function() { - s.complete = [function() { + // Set callback back to previous value + window[ jsonpCallback ] = previous; - // Set callback back to previous value - window[ jsonpCallback ] = previous; - - // Call if it was a function and we have a response - if ( previous) { - if ( responseContainer && jQuery.isFunction ( previous ) ) { - window[ jsonpCallback ] ( responseContainer[0] ); - } - } else { - // else, more memory leak avoidance - try{ delete window[ jsonpCallback ]; } catch(e){} + // Call if it was a function and we have a response + if ( previous) { + if ( responseContainer && jQuery.isFunction ( previous ) ) { + window[ jsonpCallback ] ( responseContainer[0] ); } + } else { + // else, more memory leak avoidance + try{ delete window[ jsonpCallback ]; } catch(e){} + } - }, s.complete ]; + }, s.complete ]; - // Use data converter to retrieve json after script execution - s.converters["script json"] = function() { - if ( ! responseContainer ) { - jQuery.error( jsonpCallback + " was not called" ); - } - return responseContainer[ 0 ]; - }; + // Sneakily ensure this will be handled as json + s.dataTypes[ 0 ] = "json"; - // Delegate to script transport - return "script"; - } + // Use data converter to retrieve json after script execution + s.converters["script json"] = function() { + if ( ! responseContainer ) { + jQuery.error( jsonpCallback + " was not called" ); + } + return responseContainer[ 0 ]; + }; + + // Delegate to script transport + return "script"; }); })( jQuery );