Create a JavaScript jsonP Class
Classic AJAX requests are limited to the same domain. JSON with padding allows us to make requests to different domains. Below is an example of how to create a jsonP class, and handle requests using PHP.
JSON with padding works by making a JavaScript script request, using a SCRIPT tag and a callback function. The back end, in this example a PHP script, generates a JavaScript response wrapped around the callback function’s name. For each request, the JavaScript object below appends a new script tag, and generates a random function name, which in turn calls a user defined function bound to an optional scope.
var JsonP = function() { // Class constructor. Do nothing. } // Method used for appending the script tag, to the document body JsonP.prototype.appendBodyScript = function( url, funcName ) { // Create the tag var element = document.createElement( 'script' ); element.src = url + '?cb=' + funcName // Append to body document.body.appendChild( element ); } // Method used for generating a long random number JsonP.prototype.generateRandomNumber = function() { return Math.floor( Math.random() * 100000000000 ); } // Method used for generating the random function name, and function JsonP.prototype.generateFunc = function( cb, scope ) { // Generate random function name var funcName = 'jsonP' + this.generateRandomNumber(); while ( typeof window[funcName] !== "undefined" ) { // Ensure we don't overwrite existing functions funcName = 'jsonP' + this.generateRandomNumber(); } // NOTE: Function must be global, for the server generated script to be able to issue a call window[funcName] = function( response ) { if ( scope ) { cb.bind( scope )( response ); } else { cb( response ); } } return funcName; } // Method used for issuing a call JsonP.prototype.get = function( url, cb, scope ) { this.appendBodyScript( url, this.generateFunc( cb, scope ) ); } // Example usage var testJsonP = new JsonP(); testJsonP.get( 'http://localhost/' ,function( response ) { console.log( this ); console.log( response ); } ,{ name: 'Test Scope' } );
Example PHP Script: