diff options
author | jaubourg <j@ubourg.net> | 2011-01-31 18:53:44 +0100 |
---|---|---|
committer | jaubourg <j@ubourg.net> | 2011-01-31 18:53:44 +0100 |
commit | f286a716d5e5836b8508eb5771624de0aafdb235 (patch) | |
tree | 713d084c12d681731a10f400ef4339dce25e85b7 /src/ajax | |
parent | 7c9a5e6016c2fcd38872367a891e5b3887d3df53 (diff) | |
download | jquery-f286a716d5e5836b8508eb5771624de0aafdb235.tar.gz jquery-f286a716d5e5836b8508eb5771624de0aafdb235.zip |
Makes sure jsonp callback is not left in the global namespace in case of an early abort (beforeSend). Unit test added.
Diffstat (limited to 'src/ajax')
-rw-r--r-- | src/ajax/jsonp.js | 37 |
1 files changed, 15 insertions, 22 deletions
diff --git a/src/ajax/jsonp.js b/src/ajax/jsonp.js index cbe36804b..ebc660fba 100644 --- a/src/ajax/jsonp.js +++ b/src/ajax/jsonp.js @@ -12,9 +12,9 @@ jQuery.ajaxSetup({ }); // Detect, normalize options and install callbacks for jsonp requests -jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, dataIsString /* internal */ ) { +jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jXHR ) { - dataIsString = ( typeof s.data === "string" ); + var dataIsString = ( typeof s.data === "string" ); if ( s.dataTypes[ 0 ] === "jsonp" || originalSettings.jsonpCallback || @@ -28,7 +28,15 @@ jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, dataIsString previous = window[ jsonpCallback ], url = s.url, data = s.data, - replace = "$1" + jsonpCallback + "$2"; + replace = "$1" + jsonpCallback + "$2", + cleanUp = function() { + // Set callback back to previous value + window[ jsonpCallback ] = previous; + // Call if it was a function and we have a response + if ( responseContainer && jQuery.isFunction( previous ) ) { + window[ jsonpCallback ]( responseContainer[ 0 ] ); + } + }; if ( s.jsonp !== false ) { url = url.replace( jsre, replace ); @@ -46,32 +54,17 @@ jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, dataIsString s.url = url; s.data = data; + // Install callback window[ jsonpCallback ] = function( response ) { responseContainer = [ response ]; }; - s.complete = [ function() { - - // 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 ) {} - } - - }, s.complete ]; + // Install cleanUp function + jXHR.then( cleanUp, cleanUp ); // Use data converter to retrieve json after script execution s.converters["script json"] = function() { - if ( ! responseContainer ) { + if ( !responseContainer ) { jQuery.error( jsonpCallback + " was not called" ); } return responseContainer[ 0 ]; |