diff options
author | jaubourg <j@ubourg.net> | 2011-01-06 01:17:31 +0100 |
---|---|---|
committer | jaubourg <j@ubourg.net> | 2011-01-06 01:17:31 +0100 |
commit | c43b078c6911027fd4124d542446ad0098662f6a (patch) | |
tree | 4f24c342ae9cf5dac0dfc6e38c5112c9c545957a /src/ajax/jsonp.js | |
parent | e56de77df90e50b9999a02e57241b1cf498b0fe4 (diff) | |
download | jquery-c43b078c6911027fd4124d542446ad0098662f6a.tar.gz jquery-c43b078c6911027fd4124d542446ad0098662f6a.zip |
Renamed src/transports to src/ajax (in case we need prefilters in the future and to avoid a separate prefilters directory).
Diffstat (limited to 'src/ajax/jsonp.js')
-rw-r--r-- | src/ajax/jsonp.js | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/src/ajax/jsonp.js b/src/ajax/jsonp.js new file mode 100644 index 000000000..5cfb7834a --- /dev/null +++ b/src/ajax/jsonp.js @@ -0,0 +1,85 @@ +(function( jQuery ) { + +var jsc = jQuery.now(), + jsre = /\=\?(&|$)/, + rquery_jsonp = /\?/; + +// Default jsonp callback name +jQuery.ajaxSettings.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) { + + var transportDataType = s.dataTypes[ 0 ]; + + 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 = + 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; + + if ( url == s.url && data == s.data ) { + url = url += (rquery_jsonp.test( url ) ? "&" : "?") + jsonp + "=" + jsonpCallback; + } + + s.url = url; + s.data = data; + } + +// Bind transport to json dataType +}).transport("json", function(s) { + + if ( s.jsonp ) { + + // Put callback in place + var responseContainer, + jsonpCallback = s.jsonpCallback, + previous = window[ jsonpCallback ]; + + 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 ]; + + // 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 ); |