Fixes #5803. Reworked jsonp prefilter so that it sets the dataType as jsonp and recognizes requests with originalSettings having jsonp or jsonpCallback to be jsonp. Moved default jsonp option value into ajaxSettings. Attached the transport to "jsonp" which avoids unnecessary testing. Transport factory sets dataType back to json for proper data conversion.
This commit is contained in:
parent
0f28835ee9
commit
62a1a1a8fa
|
@ -4,44 +4,41 @@ var jsc = jQuery.now(),
|
|||
jsre = /\=\?(&|$)/,
|
||||
rquery_jsonp = /\?/;
|
||||
|
||||
// Default jsonp callback name
|
||||
jQuery.ajaxSettings.jsonpCallback = function() {
|
||||
// Default jsonp settings
|
||||
jQuery.ajaxSetup({
|
||||
jsonp: "callback",
|
||||
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) {
|
||||
// 2) sneakily ensure transportDataType is always jsonp for jsonp requests
|
||||
jQuery.ajax.prefilter("json jsonp", function(s, originalSettings) {
|
||||
|
||||
var transportDataType = s.dataTypes[ 0 ];
|
||||
if ( s.dataTypes[ 0 ] === "jsonp" ||
|
||||
originalSettings.jsonp ||
|
||||
originalSettings.jsonpCallback ||
|
||||
jsre.test(s.url) ||
|
||||
typeof(s.data) === "string" && jsre.test(s.data) ) {
|
||||
|
||||
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 =
|
||||
var 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;
|
||||
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;
|
||||
if ( url === s.url && data === s.data ) {
|
||||
url += (rquery_jsonp.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
|
||||
}
|
||||
|
||||
s.url = url;
|
||||
s.data = data;
|
||||
s.dataTypes[ 0 ] = "jsonp";
|
||||
}
|
||||
|
||||
// Bind transport to json dataType
|
||||
}).transport("json", function(s) {
|
||||
|
||||
if ( s.jsonp ) {
|
||||
// Bind transport to jsonp dataType
|
||||
}).transport("jsonp", function(s) {
|
||||
|
||||
// Put callback in place
|
||||
var responseContainer,
|
||||
|
@ -69,6 +66,9 @@ jQuery.ajax.prefilter("json jsonp", function(s) {
|
|||
|
||||
}, 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 ) {
|
||||
|
@ -79,7 +79,6 @@ jQuery.ajax.prefilter("json jsonp", function(s) {
|
|||
|
||||
// Delegate to script transport
|
||||
return "script";
|
||||
}
|
||||
});
|
||||
|
||||
})( jQuery );
|
||||
|
|
Loading…
Reference in a new issue