JAVASCRIPT   71

jsonp.js

Guest on 29th July 2021 12:59:05 AM

  1. define( [
  2.         "../core",
  3.         "./var/nonce",
  4.         "./var/rquery",
  5.         "../ajax"
  6. ], function( jQuery, nonce, rquery ) {
  7.  
  8. "use strict";
  9.  
  10. var oldCallbacks = [],
  11.         rjsonp = /(=)\?(?=&|$)|\?\?/;
  12.  
  13. // Default jsonp settings
  14. jQuery.ajaxSetup( {
  15.         jsonp: "callback",
  16.         jsonpCallback: function() {
  17.                 var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
  18.                 this[ callback ] = true;
  19.                 return callback;
  20.         }
  21. } );
  22.  
  23. // Detect, normalize options and install callbacks for jsonp requests
  24. jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
  25.  
  26.         var callbackName, overwritten, responseContainer,
  27.                 jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
  28.                         "url" :
  29.                         typeof s.data === "string" &&
  30.                                 ( s.contentType || "" )
  31.                                         .indexOf( "application/x-www-form-urlencoded" ) === 0 &&
  32.                                 rjsonp.test( s.data ) && "data"
  33.                 );
  34.  
  35.         // Handle iff the expected data type is "jsonp" or we have a parameter to set
  36.         if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
  37.  
  38.                 // Get callback name, remembering preexisting value associated with it
  39.                 callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
  40.                         s.jsonpCallback() :
  41.                         s.jsonpCallback;
  42.  
  43.                 // Insert callback into url or form data
  44.                 if ( jsonProp ) {
  45.                         s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
  46.                 } else if ( s.jsonp !== false ) {
  47.                         s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
  48.                 }
  49.  
  50.                 // Use data converter to retrieve json after script execution
  51.                 s.converters[ "script json" ] = function() {
  52.                         if ( !responseContainer ) {
  53.                                 jQuery.error( callbackName + " was not called" );
  54.                         }
  55.                         return responseContainer[ 0 ];
  56.                 };
  57.  
  58.                 // Force json dataType
  59.                 s.dataTypes[ 0 ] = "json";
  60.  
  61.                 // Install callback
  62.                 overwritten = window[ callbackName ];
  63.                 window[ callbackName ] = function() {
  64.                         responseContainer = arguments;
  65.                 };
  66.  
  67.                 // Clean-up function (fires after converters)
  68.                 jqXHR.always( function() {
  69.  
  70.                         // If previous value didn't exist - remove it
  71.                         if ( overwritten === undefined ) {
  72.                                 jQuery( window ).removeProp( callbackName );
  73.  
  74.                         // Otherwise restore preexisting value
  75.                         } else {
  76.                                 window[ callbackName ] = overwritten;
  77.                         }
  78.  
  79.                         // Save back as free
  80.                         if ( s[ callbackName ] ) {
  81.  
  82.                                 // Make sure that re-using the options doesn't screw things around
  83.                                 s.jsonpCallback = originalSettings.jsonpCallback;
  84.  
  85.                                 // Save the callback name for future use
  86.                                 oldCallbacks.push( callbackName );
  87.                         }
  88.  
  89.                         // Call if it was a function and we have a response
  90.                         if ( responseContainer && jQuery.isFunction( overwritten ) ) {
  91.                                 overwritten( responseContainer[ 0 ] );
  92.                         }
  93.  
  94.                         responseContainer = overwritten = undefined;
  95.                 } );
  96.  
  97.                 // Delegate to script
  98.                 return "script";
  99.         }
  100. } );
  101.  
  102. } );

Raw Paste


Login or Register to edit or fork this paste. It's free.