X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fajax%2Fjsonp.js;h=675ecc085963ae143cf8b2d8d8e84c64f93959aa;hb=914aa3d66b0d34fc44377a2facc00a77c65d0891;hp=0af00567c3e37bec7b92beab6acc6d5e82787ff4;hpb=62a1a1a8fa64f92f429a3f5b8ed2e0d1f6fc3d6c;p=jquery.git diff --git a/src/ajax/jsonp.js b/src/ajax/jsonp.js index 0af0056..675ecc0 100644 --- a/src/ajax/jsonp.js +++ b/src/ajax/jsonp.js @@ -1,7 +1,7 @@ (function( jQuery ) { var jsc = jQuery.now(), - jsre = /\=\?(&|$)/, + jsre = /(\=)(?:\?|%3F)(&|$)|()(?:\?\?|%3F%3F)()/i, rquery_jsonp = /\?/; // Default jsonp settings @@ -10,12 +10,9 @@ jQuery.ajaxSetup({ jsonpCallback: function() { return "jsonp" + jsc++; } -}); -// Normalize jsonp queries -// 1) put callback parameter in url or data -// 2) sneakily ensure transportDataType is always jsonp for jsonp requests -jQuery.ajax.prefilter("json jsonp", function(s, originalSettings) { +// Detect, normalize options and install callbacks for jsonp requests +}).ajaxPrefilter("json jsonp", function(s, originalSettings) { if ( s.dataTypes[ 0 ] === "jsonp" || originalSettings.jsonp || @@ -23,10 +20,12 @@ jQuery.ajax.prefilter("json jsonp", function(s, originalSettings) { jsre.test(s.url) || typeof(s.data) === "string" && jsre.test(s.data) ) { - var jsonpCallback = s.jsonpCallback = + var responseContainer, + 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; + previous = window[ jsonpCallback ], + url = s.url.replace(jsre, "$1" + jsonpCallback + "$2"), + data = s.url === url && typeof(s.data) === "string" ? s.data.replace(jsre, "$1" + jsonpCallback + "$2") : s.data; if ( url === s.url && data === s.data ) { url += (rquery_jsonp.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback; @@ -34,51 +33,42 @@ jQuery.ajax.prefilter("json jsonp", function(s, originalSettings) { s.url = url; s.data = data; - s.dataTypes[ 0 ] = "jsonp"; - } - -// Bind transport to jsonp dataType -}).transport("jsonp", function(s) { - - // 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] ); + // 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){} } - } else { - // else, more memory leak avoidance - try{ delete window[ jsonpCallback ]; } catch(e){} - } - }, s.complete ]; + }, s.complete ]; - // Sneakily ensure this will be handled as json - s.dataTypes[ 0 ] = "json"; + // 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 ]; + }; - // 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 ]; - }; + // force json dataType + s.dataTypes[ 0 ] = "json"; - // Delegate to script transport - return "script"; + // Delegate to script + return "script"; + } }); })( jQuery );