aboutsummaryrefslogtreecommitdiffstats
path: root/src/ajax/jsonp.js
diff options
context:
space:
mode:
authorjaubourg <j@ubourg.net>2011-01-06 01:17:31 +0100
committerjaubourg <j@ubourg.net>2011-01-06 01:17:31 +0100
commitc43b078c6911027fd4124d542446ad0098662f6a (patch)
tree4f24c342ae9cf5dac0dfc6e38c5112c9c545957a /src/ajax/jsonp.js
parente56de77df90e50b9999a02e57241b1cf498b0fe4 (diff)
downloadjquery-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.js85
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 );