X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fajax%2Fjsonp.js;h=2691591d2a8c9a585662998db2cdab000a7134ae;hb=cb49b4a1b648dea8ce5b1e5dbb2ab5432a84cb63;hp=883876fc0b1733ee58916def06c0d3df7385fa4e;hpb=158fa822dea3198de5a4bcff3955b869ebb758c8;p=jquery.git diff --git a/src/ajax/jsonp.js b/src/ajax/jsonp.js index 883876f..2691591 100644 --- a/src/ajax/jsonp.js +++ b/src/ajax/jsonp.js @@ -1,20 +1,20 @@ (function( jQuery ) { var jsc = jQuery.now(), - jsre = /(\=)(?:\?|%3F)(&|$)|()(?:\?\?|%3F%3F)()/i; + jsre = /(\=)\?(&|$)|()\?\?()/i; // Default jsonp settings jQuery.ajaxSetup({ jsonp: "callback", jsonpCallback: function() { - return "jsonp" + jsc++; + return jQuery.expando + "_" + ( jsc++ ); } +}); // Detect, normalize options and install callbacks for jsonp requests -// (dataIsString is used internally) -}).ajaxPrefilter("json jsonp", function(s, originalSettings, dataIsString) { +jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { - dataIsString = ( typeof(s.data) === "string" ); + var dataIsString = ( typeof s.data === "string" ); if ( s.dataTypes[ 0 ] === "jsonp" || originalSettings.jsonpCallback || @@ -28,7 +28,15 @@ jQuery.ajaxSetup({ 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,30 +54,17 @@ jQuery.ajaxSetup({ s.url = url; s.data = data; - window [ jsonpCallback ] = function( response ) { - responseContainer = [response]; + // 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 + jqXHR.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 ]; @@ -81,6 +76,6 @@ jQuery.ajaxSetup({ // Delegate to script return "script"; } -}); +} ); })( jQuery );