mirror of
https://github.com/jquery/jquery.git
synced 2024-11-23 02:54:22 +00:00
refactor jsonp.js for size and clarity
This commit is contained in:
parent
d3b61de520
commit
b0ea80e9fd
@ -1,14 +1,15 @@
|
||||
(function( jQuery ) {
|
||||
|
||||
var jsc = jQuery.now(),
|
||||
jsre = /(\=)\?(&|$)|\?\?/i,
|
||||
jscallbacks = [];
|
||||
var oldCallbacks = [],
|
||||
rquestion = /\?/,
|
||||
rjsonp = /(=)\?(?=&|$)|\?\?/,
|
||||
nonce = jQuery.now();
|
||||
|
||||
// Default jsonp settings
|
||||
jQuery.ajaxSetup({
|
||||
jsonp: "callback",
|
||||
jsonpCallback: function() {
|
||||
var callback = jscallbacks.pop() || ( jQuery.expando + "_" + ( jsc++ ) );
|
||||
var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
|
||||
this[ callback ] = true;
|
||||
return callback;
|
||||
}
|
||||
@ -17,62 +18,38 @@ jQuery.ajaxSetup({
|
||||
// Detect, normalize options and install callbacks for jsonp requests
|
||||
jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
|
||||
|
||||
var inspectData = ( typeof s.data === "string" ) && /^application\/x\-www\-form\-urlencoded/.test( s.contentType );
|
||||
var callbackName, overwritten, responseContainer,
|
||||
data = s.data,
|
||||
url = s.url,
|
||||
hasCallback = s.jsonp !== false,
|
||||
replaceInUrl = hasCallback && rjsonp.test( url ),
|
||||
replaceInData = hasCallback && typeof data === "string" &&
|
||||
!( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") &&
|
||||
rjsonp.test( data );
|
||||
|
||||
if ( s.dataTypes[ 0 ] === "jsonp" ||
|
||||
s.jsonp !== false && ( jsre.test( s.url ) ||
|
||||
inspectData && jsre.test( s.data ) ) ) {
|
||||
// Handle iff the expected data type is "jsonp" or we have a parameter to set
|
||||
if ( s.dataTypes[ 0 ] === "jsonp" || hasCallback &&
|
||||
( replaceInUrl || replaceInData ) ) {
|
||||
|
||||
var responseContainer,
|
||||
jsonpCallback = s.jsonpCallback =
|
||||
jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
|
||||
previous = window[ jsonpCallback ],
|
||||
url = s.url,
|
||||
data = s.data,
|
||||
replace = "$1" + jsonpCallback + "$2";
|
||||
// Get callback name, remembering preexisting value associated with it
|
||||
callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
|
||||
s.jsonpCallback() :
|
||||
s.jsonpCallback;
|
||||
overwritten = window[ callbackName ];
|
||||
|
||||
if ( s.jsonp !== false ) {
|
||||
url = url.replace( jsre, replace );
|
||||
if ( s.url === url ) {
|
||||
if ( inspectData ) {
|
||||
data = data.replace( jsre, replace );
|
||||
}
|
||||
if ( s.data === data ) {
|
||||
// Add callback manually
|
||||
url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
|
||||
}
|
||||
}
|
||||
// Insert callback into url or form data
|
||||
if ( replaceInUrl ) {
|
||||
s.url = url.replace( rjsonp, "$1" + callbackName );
|
||||
} else if ( replaceInData ) {
|
||||
s.data = data.replace( rjsonp,"$1" + callbackName );
|
||||
} else if ( hasCallback ) {
|
||||
s.url += ( rquestion.test( url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
|
||||
}
|
||||
|
||||
s.url = url;
|
||||
s.data = data;
|
||||
|
||||
// Install callback
|
||||
window[ jsonpCallback ] = function( response ) {
|
||||
responseContainer = [ response ];
|
||||
};
|
||||
|
||||
// Clean-up function
|
||||
jqXHR.always(function() {
|
||||
// Set callback back to previous value
|
||||
window[ jsonpCallback ] = previous;
|
||||
// Save back as free
|
||||
if ( s[ jsonpCallback ] ) {
|
||||
// make sure that re-using the options doesn't screw things around
|
||||
s.jsonpCallback = originalSettings.jsonpCallback;
|
||||
// save the callback name for future use
|
||||
jscallbacks.push( jsonpCallback );
|
||||
}
|
||||
// Call if it was a function and we have a response
|
||||
if ( responseContainer && jQuery.isFunction( previous ) ) {
|
||||
window[ jsonpCallback ]( responseContainer[ 0 ] );
|
||||
}
|
||||
});
|
||||
|
||||
// Use data converter to retrieve json after script execution
|
||||
s.converters["script json"] = function() {
|
||||
if ( !responseContainer ) {
|
||||
jQuery.error( jsonpCallback + " was not called" );
|
||||
jQuery.error( callbackName + " was not called" );
|
||||
}
|
||||
return responseContainer[ 0 ];
|
||||
};
|
||||
@ -80,6 +57,33 @@ jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
|
||||
// force json dataType
|
||||
s.dataTypes[ 0 ] = "json";
|
||||
|
||||
// Install callback
|
||||
window[ callbackName ] = function() {
|
||||
responseContainer = arguments;
|
||||
};
|
||||
|
||||
// Clean-up function (fires after converters)
|
||||
jqXHR.always(function() {
|
||||
// Restore preexisting value
|
||||
window[ callbackName ] = overwritten;
|
||||
|
||||
// Save back as free
|
||||
if ( s[ callbackName ] ) {
|
||||
// make sure that re-using the options doesn't screw things around
|
||||
s.jsonpCallback = originalSettings.jsonpCallback;
|
||||
|
||||
// save the callback name for future use
|
||||
oldCallbacks.push( callbackName );
|
||||
}
|
||||
|
||||
// Call if it was a function and we have a response
|
||||
if ( responseContainer && jQuery.isFunction( overwritten ) ) {
|
||||
overwritten( responseContainer[ 0 ] );
|
||||
}
|
||||
|
||||
responseContainer = overwritten = undefined;
|
||||
});
|
||||
|
||||
// Delegate to script
|
||||
return "script";
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user