123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288 |
- /*
- * jQuery JSONP Core Plugin 2.3.1 (2012-05-16)
- *
- * https://github.com/jaubourg/jquery-jsonp
- *
- * Copyright (c) 2012 Julian Aubourg
- *
- * This document is licensed as free software under the terms of the
- * MIT License: http://www.opensource.org/licenses/mit-license.php
- */
- ( function( $ ) {
- // ###################### UTILITIES ##
- // Noop
- function noop() {
- }
- // Generic callback
- function genericCallback( data ) {
- lastValue = [ data ];
- }
- // Call if defined
- function callIfDefined( method , object , parameters , returnFlag ) {
- try {
- returnFlag = method && method.apply( object.context || object , parameters );
- } catch( _ ) {
- returnFlag = !1;
- }
- return returnFlag;
- }
- // Give joining character given url
- function qMarkOrAmp( url ) {
- return /\?/ .test( url ) ? "&" : "?";
- }
- var // String constants (for better minification)
- STR_ASYNC = "async",
- STR_CHARSET = "charset",
- STR_EMPTY = "",
- STR_ERROR = "error",
- STR_INSERT_BEFORE = "insertBefore",
- STR_JQUERY_JSONP = "_jqjsp",
- STR_ON = "on",
- STR_ON_CLICK = STR_ON + "click",
- STR_ON_ERROR = STR_ON + STR_ERROR,
- STR_ON_LOAD = STR_ON + "load",
- STR_ON_READY_STATE_CHANGE = STR_ON + "readystatechange",
- STR_READY_STATE = "readyState",
- STR_REMOVE_CHILD = "removeChild",
- STR_SCRIPT_TAG = "<script>",
- STR_SUCCESS = "success",
- STR_TIMEOUT = "timeout",
- // Window
- win = window,
- // Deferred
- Deferred = $.Deferred,
- // Head element
- head = $( "head" )[ 0 ] || document.documentElement,
- // Page cache
- pageCache = {},
- // Counter
- count = 0,
- // Last returned value
- lastValue,
- // ###################### DEFAULT OPTIONS ##
- xOptionsDefaults = {
- //beforeSend: undefined,
- //cache: false,
- callback: STR_JQUERY_JSONP,
- //callbackParameter: undefined,
- //charset: undefined,
- //complete: undefined,
- //context: undefined,
- //data: "",
- //dataFilter: undefined,
- //error: undefined,
- //pageCache: false,
- //success: undefined,
- //timeout: 0,
- //traditional: false,
- url: location.href
- },
- // opera demands sniffing :/
- opera = win.opera;
- // ###################### MAIN FUNCTION ##
- function jsonp( xOptions ) {
- // Build data with default
- xOptions = $.extend( {} , xOptionsDefaults , xOptions );
- // References to xOptions members (for better minification)
- var successCallback = xOptions.success,
- errorCallback = xOptions.error,
- completeCallback = xOptions.complete,
- dataFilter = xOptions.dataFilter,
- callbackParameter = xOptions.callbackParameter,
- successCallbackName = xOptions.callback,
- cacheFlag = xOptions.cache,
- pageCacheFlag = xOptions.pageCache,
- charset = xOptions.charset,
- url = xOptions.url,
- data = xOptions.data,
- timeout = xOptions.timeout,
- pageCached,
- // Abort/done flag
- done = 0,
- // Life-cycle functions
- cleanUp = noop,
- // Support vars
- supportOnload,
- supportOnreadystatechange,
- // Request execution vars
- firstChild,
- script,
- scriptAfter,
- timeoutTimer;
- // If we have Deferreds:
- // - substitute callbacks
- // - promote xOptions to a promise
- Deferred && Deferred(function( defer ) {
- defer.done( successCallback ).fail( errorCallback );
- successCallback = defer.resolve;
- errorCallback = defer.reject;
- }).promise( xOptions );
- // Create the abort method
- xOptions.abort = function() {
- !( done++ ) && cleanUp();
- };
- // Call beforeSend if provided (early abort if false returned)
- if ( callIfDefined( xOptions.beforeSend, xOptions , [ xOptions ] ) === !1 || done ) {
- return xOptions;
- }
- // Control entries
- url = url || STR_EMPTY;
- data = data ? ( (typeof data) == "string" ? data : $.param( data , xOptions.traditional ) ) : STR_EMPTY;
- // Build final url
- url += data ? ( qMarkOrAmp( url ) + data ) : STR_EMPTY;
- // Add callback parameter if provided as option
- callbackParameter && ( url += qMarkOrAmp( url ) + encodeURIComponent( callbackParameter ) + "=?" );
- // Add anticache parameter if needed
- !cacheFlag && !pageCacheFlag && ( url += qMarkOrAmp( url ) + "_" + ( new Date() ).getTime() + "=" );
- // Replace last ? by callback parameter
- url = url.replace( /=\?(&|$)/ , "=" + successCallbackName + "$1" );
- // Success notifier
- function notifySuccess( json ) {
- if ( !( done++ ) ) {
- cleanUp();
- // Pagecache if needed
- pageCacheFlag && ( pageCache [ url ] = { s: [ json ] } );
- // Apply the data filter if provided
- dataFilter && ( json = dataFilter.apply( xOptions , [ json ] ) );
- // Call success then complete
- callIfDefined( successCallback , xOptions , [ json , STR_SUCCESS ] );
- callIfDefined( completeCallback , xOptions , [ xOptions , STR_SUCCESS ] );
- }
- }
- // Error notifier
- function notifyError( type ) {
- if ( !( done++ ) ) {
- // Clean up
- cleanUp();
- // If pure error (not timeout), cache if needed
- pageCacheFlag && type != STR_TIMEOUT && ( pageCache[ url ] = type );
- // Call error then complete
- callIfDefined( errorCallback , xOptions , [ xOptions , type ] );
- callIfDefined( completeCallback , xOptions , [ xOptions , type ] );
- }
- }
- // Check page cache
- if ( pageCacheFlag && ( pageCached = pageCache[ url ] ) ) {
- pageCached.s ? notifySuccess( pageCached.s[ 0 ] ) : notifyError( pageCached );
- } else {
- // Install the generic callback
- // (BEWARE: global namespace pollution ahoy)
- win[ successCallbackName ] = genericCallback;
- // Create the script tag
- script = $( STR_SCRIPT_TAG )[ 0 ];
- script.id = STR_JQUERY_JSONP + count++;
- // Set charset if provided
- if ( charset ) {
- script[ STR_CHARSET ] = charset;
- }
- opera && opera.version() < 11.60 ?
- // onerror is not supported: do not set as async and assume in-order execution.
- // Add a trailing script to emulate the event
- ( ( scriptAfter = $( STR_SCRIPT_TAG )[ 0 ] ).text = "document.getElementById('" + script.id + "')." + STR_ON_ERROR + "()" )
- :
- // onerror is supported: set the script as async to avoid requests blocking each others
- ( script[ STR_ASYNC ] = STR_ASYNC )
- ;
- // Internet Explorer: event/htmlFor trick
- if ( STR_ON_READY_STATE_CHANGE in script ) {
- script.htmlFor = script.id;
- script.event = STR_ON_CLICK;
- }
- // Attached event handlers
- script[ STR_ON_LOAD ] = script[ STR_ON_ERROR ] = script[ STR_ON_READY_STATE_CHANGE ] = function ( result ) {
- // Test readyState if it exists
- if ( !script[ STR_READY_STATE ] || !/i/.test( script[ STR_READY_STATE ] ) ) {
- try {
- script[ STR_ON_CLICK ] && script[ STR_ON_CLICK ]();
- } catch( _ ) {}
- result = lastValue;
- lastValue = 0;
- result ? notifySuccess( result[ 0 ] ) : notifyError( STR_ERROR );
- }
- };
- // Set source
- script.src = url;
- // Re-declare cleanUp function
- cleanUp = function( i ) {
- timeoutTimer && clearTimeout( timeoutTimer );
- script[ STR_ON_READY_STATE_CHANGE ] = script[ STR_ON_LOAD ] = script[ STR_ON_ERROR ] = null;
- head[ STR_REMOVE_CHILD ]( script );
- scriptAfter && head[ STR_REMOVE_CHILD ]( scriptAfter );
- };
- // Append main script
- head[ STR_INSERT_BEFORE ]( script , ( firstChild = head.firstChild ) );
- // Append trailing script if needed
- scriptAfter && head[ STR_INSERT_BEFORE ]( scriptAfter , firstChild );
- // If a timeout is needed, install it
- timeoutTimer = timeout > 0 && setTimeout( function() {
- notifyError( STR_TIMEOUT );
- } , timeout );
- }
- return xOptions;
- }
- // ###################### SETUP FUNCTION ##
- jsonp.setup = function( xOptions ) {
- $.extend( xOptionsDefaults , xOptions );
- };
- // ###################### INSTALL in jQuery ##
- $.jsonp = jsonp;
- } )( jQuery );
|