1/* 2 * jQuery JSONP Core Plugin 2.4.0 (2012-08-21) 3 * jQuery JSONP Core Plugin 2.4.0-1 (2013-02-14) customized 4 * 5 * https://github.com/jaubourg/jquery-jsonp 6 * 7 * Copyright (c) 2012 Julian Aubourg 8 * 9 * This document is licensed as free software under the terms of the 10 * MIT License: http://www.opensource.org/licenses/mit-license.php 11 */ 12( function( $ ) { 13 14 // ###################### UTILITIES ## 15 16 // Noop 17 function noop() { 18 } 19 20 // Generic callback 21 function genericCallback( data ) { 22 lastValue = [ data ]; 23 } 24 25 // Call if defined 26 function callIfDefined( method , object , parameters ) { 27 return method && method.apply( object.context || object , parameters ); 28 } 29 30 // Give joining character given url 31 function qMarkOrAmp( url ) { 32 return /\?/ .test( url ) ? "&" : "?"; 33 } 34 35 var STR_ASYNC = "async", 36 STR_CHARSET = "charset", 37 STR_EMPTY = "", 38 STR_ERROR = "error", 39 STR_INSERT_BEFORE = "insertBefore", 40 STR_JQUERY_JSONP = "_jqjsp", 41 STR_ON = "on", 42 STR_ON_CLICK = STR_ON + "click", 43 STR_ON_ERROR = STR_ON + STR_ERROR, 44 STR_ON_LOAD = STR_ON + "load", 45 STR_ON_READY_STATE_CHANGE = STR_ON + "readystatechange", 46 STR_READY_STATE = "readyState", 47 STR_REMOVE_CHILD = "removeChild", 48 STR_SCRIPT_TAG = "<script>", 49 STR_SUCCESS = "success", 50 STR_TIMEOUT = "timeout", 51 52 // Window 53 win = window, 54 // Deferred 55 Deferred = $.Deferred, 56 // Head element 57 head = $( "head" )[ 0 ] || document.documentElement, 58 // Page cache 59 pageCache = {}, 60 // Counter 61 count = 0, 62 // Last returned value 63 lastValue, 64 65 // ###################### DEFAULT OPTIONS ## 66 xOptionsDefaults = { 67 //beforeSend: undefined, 68 //cache: false, 69 callback: STR_JQUERY_JSONP, 70 //callbackParameter: undefined, 71 //charset: undefined, 72 //complete: undefined, 73 //context: undefined, 74 //data: "", 75 //dataFilter: undefined, 76 //error: undefined, 77 //pageCache: false, 78 //success: undefined, 79 //timeout: 0, 80 //traditional: false, 81 url: location.href 82 }, 83 84 // opera demands sniffing :/ 85 opera = win.opera; 86 87 // IE < 10 88 var oldIE = !!$( "<div>" ).html( "<!--[if IE]><i><![endif]-->" ).find("i").length; 89 // customized start 90 if (typeof isMediaGo != "undefined" && isMediaGo) { 91 oldIE = false; 92 } else if (navigator.userAgent.indexOf("MusicCenter/2") > 0){ 93 oldIE = false; 94 } else if (typeof isXapl != "undefined" && isXapl) { 95 oldIE = true; 96 } else if (navigator.userAgent.indexOf("Windows NT 6.2") > 0) { 97 oldIE = false; 98 } else if (navigator.userAgent.indexOf("MSIE 7.0") > 0) { 99 oldIE = true; 100 } else if (navigator.userAgent.indexOf("MSIE 8.0") > 0) { 101 oldIE = true; 102 } 103 104 // end 105 // ###################### MAIN FUNCTION ## 106 function jsonp( xOptions ) { 107 108 // Build data with default 109 xOptions = $.extend( {} , xOptionsDefaults , xOptions ); 110 111 // References to xOptions members (for better minification) 112 var successCallback = xOptions.success, 113 errorCallback = xOptions.error, 114 completeCallback = xOptions.complete, 115 dataFilter = xOptions.dataFilter, 116 callbackParameter = xOptions.callbackParameter, 117 successCallbackName = xOptions.callback, 118 cacheFlag = xOptions.cache, 119 pageCacheFlag = xOptions.pageCache, 120 charset = xOptions.charset, 121 url = xOptions.url, 122 data = xOptions.data, 123 timeout = xOptions.timeout, 124 pageCached, 125 126 // Abort/done flag 127 done = 0, 128 129 // Life-cycle functions 130 cleanUp = noop, 131 132 // Support vars 133 supportOnload, 134 supportOnreadystatechange, 135 136 // Request execution vars 137 firstChild, 138 script, 139 scriptAfter, 140 timeoutTimer; 141 142 // If we have Deferreds: 143 // - substitute callbacks 144 // - promote xOptions to a promise 145 Deferred && Deferred(function( defer ) { 146 defer.done( successCallback ).fail( errorCallback ); 147 successCallback = defer.resolve; 148 errorCallback = defer.reject; 149 }).promise( xOptions ); 150 151 // Create the abort method 152 xOptions.abort = function() { 153 !( done++ ) && cleanUp(); 154 }; 155 156 // Call beforeSend if provided (early abort if false returned) 157 if ( callIfDefined( xOptions.beforeSend , xOptions , [ xOptions ] ) === !1 || done ) { 158 return xOptions; 159 } 160 161 // Control entries 162 url = url || STR_EMPTY; 163 data = data ? ( (typeof data) == "string" ? data : $.param( data , xOptions.traditional ) ) : STR_EMPTY; 164 165 // Build final url 166 url += data ? ( qMarkOrAmp( url ) + data ) : STR_EMPTY; 167 168 // Add callback parameter if provided as option 169 callbackParameter && ( url += qMarkOrAmp( url ) + encodeURIComponent( callbackParameter ) + "=?" ); 170 171 // Add anticache parameter if needed 172 !cacheFlag && !pageCacheFlag && ( url += qMarkOrAmp( url ) + "_" + ( new Date() ).getTime() + "=" ); 173 174 // Replace last ? by callback parameter 175 url = url.replace( /=\?(&|$)/ , "=" + successCallbackName + "$1" ); 176 177 // Success notifier 178 function notifySuccess( json ) { 179 180 if ( !( done++ ) ) { 181 182 cleanUp();
183 // Pagecache if needed 184 pageCacheFlag && ( pageCache [ url ] = { s: [ json ] } ); 185 // Apply the data filter if provided 186 dataFilter && ( json = dataFilter.apply( xOptions , [ json ] ) ); 187 // Call success then complete 188 callIfDefined( successCallback , xOptions , [ json , STR_SUCCESS, xOptions ] ); 189 callIfDefined( completeCallback , xOptions , [ xOptions , STR_SUCCESS ] ); 190 191 } 192 } 193 194 // Error notifier 195 function notifyError( type ) { 196 197 if ( !( done++ ) ) { 198 199 // Clean up 200 cleanUp(); 201 // If pure error (not timeout), cache if needed 202 pageCacheFlag && type != STR_TIMEOUT && ( pageCache[ url ] = type ); 203 // Call error then complete 204 callIfDefined( errorCallback , xOptions , [ xOptions , type ] ); 205 callIfDefined( completeCallback , xOptions , [ xOptions , type ] ); 206 207 } 208 } 209 210 // Check page cache 211 if ( pageCacheFlag && ( pageCached = pageCache[ url ] ) ) { 212 213 pageCached.s ? notifySuccess( pageCached.s[ 0 ] ) : notifyError( pageCached ); 214 215 } else { 216 217 // Install the generic callback 218 // (BEWARE: global namespace pollution ahoy) 219 win[ successCallbackName ] = genericCallback; 220 221 // Create the script tag 222 script = $( STR_SCRIPT_TAG )[ 0 ]; 223 script.id = STR_JQUERY_JSONP + count++; 224 225 // Set charset if provided 226 if ( charset ) { 227 script[ STR_CHARSET ] = charset; 228 } 229 230 opera && opera.version() < 11.60 ? 231 // onerror is not supported: do not set as async and assume in-order execution. 232 // Add a trailing script to emulate the event 233 ( ( scriptAfter = $( STR_SCRIPT_TAG )[ 0 ] ).text = "document.getElementById('" + script.id + "')." + STR_ON_ERROR + "()" ) 234 : 235 // onerror is supported: set the script as async to avoid requests blocking each others 236 ( script[ STR_ASYNC ] = STR_ASYNC ) 237 238 ; 239 240 // Internet Explorer: event/htmlFor trick 241 if ( oldIE ) { 242 script.htmlFor = script.id; 243 script.event = STR_ON_CLICK; 244 } 245 246 // Attached event handlers 247 script[ STR_ON_LOAD ] = script[ STR_ON_ERROR ] = script[ STR_ON_READY_STATE_CHANGE ] = function ( result ) { 248 249 // Test readyState if it exists 250 if ( !script[ STR_READY_STATE ] || !/i/.test( script[ STR_READY_STATE ] ) ) { 251 252 try { 253 254 script[ STR_ON_CLICK ] && script[ STR_ON_CLICK ](); 255 256 } catch( _ ) {} 257 258 result = lastValue; 259 lastValue = 0; 260 result ? notifySuccess( result[ 0 ] ) : notifyError( STR_ERROR ); 261 262 } 263 }; 264 265 // Set source 266 script.src = url; 267 268 // Re-declare cleanUp function 269 cleanUp = function( i ) { 270 timeoutTimer && clearTimeout( timeoutTimer ); 271 script[ STR_ON_READY_STATE_CHANGE ] = script[ STR_ON_LOAD ] = script[ STR_ON_ERROR ] = null; 272 head[ STR_REMOVE_CHILD ]( script ); 273 scriptAfter && head[ STR_REMOVE_CHILD ]( scriptAfter ); 274 }; 275 276 // Append main script 277 head[ STR_INSERT_BEFORE ]( script , ( firstChild = head.firstChild ) ); 278 279 // Append trailing script if needed 280 scriptAfter && head[ STR_INSERT_BEFORE ]( scriptAfter , firstChild ); 281 282 // If a timeout is needed, install it 283 timeoutTimer = timeout > 0 && setTimeout( function() { 284 notifyError( STR_TIMEOUT ); 285 } , timeout ); 286 287 } 288 289 return xOptions; 290 } 291 292 // ###################### SETUP FUNCTION ## 293 jsonp.setup = function( xOptions ) { 294 $.extend( xOptionsDefaults , xOptions ); 295 }; 296 297 // ###################### INSTALL in jQuery ## 298 $.jsonp = jsonp; 299 300} )( jQuery );
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.