DanWebb
6/18/2009 - 6:18 PM

Simple JSONP in vanilla JS

Simple JSONP in vanilla JS

/**
 * loadJSONP( url, hollaback [, context] ) -> Null
 * - url (String): URL to data resource.
 * - hollaback (Function): Function to call when data is successfully loaded,
 *   it receives one argument: the data.
 * - context (Object): Context to invoke the hollaback function in.
 * 
 * Load external data through a JSONP interface.
 * 
 * ### Examples
 * 
 *     loadJSONP(
 *       'http://www.gigpark.com/businesses/runlevel6.json',
 *       function(data) {
 *         console.log(data)
 *       }
 *     )
**/

var loadJSONP = (function loadJSONP_outer( window, document, undefined ) { var uuid, head, main_script
  uuid = 0
  head = document.head || document.getElementsByTagName( 'head' )[0]
  main_script = document.createElement( 'script' )
  main_script.type = 'text/javascript'

  return function loadJSONP_inner( url, callback, context ) { var name, script
    // INIT
    name = '__jsonp_' + uuid++
    if ( url.match(/\?/) )
      url += '&callback=' + name
    else
      url += '?callback=' + name
    
    // Create script
    script = main_script.cloneNode()
    script.src = url
    
    // Setup handler
    window[name] = function( data ) {
      callback.call( ( context || window ), data )
      head.removeChild( script )
      script = null
      delete window[name]
    }
    
    // Load JSON
    head.appendChild( script )
  }
})( window, document )