Skip to content

Instantly share code, notes, and snippets.

@kwoktung
Created September 6, 2016 05:59
Show Gist options
  • Save kwoktung/cfbfb56c3ac58efd23e3a6d15f2ad45a to your computer and use it in GitHub Desktop.
Save kwoktung/cfbfb56c3ac58efd23e3a6d15f2ad45a to your computer and use it in GitHub Desktop.
JSONP simple implementation
(function(global,document){
var uid = 0 ;
function getJSON(url,callback){
var elem;
uid ++;
getJSON.callbacks[uid] = callback;
url = filterUrlCallback(url);
if(url.indexOf('?') !== -1){
url = url + '&callback=getJSON.CALLBACK';
}else{
url = url + '?callback=getJSON.CALLBACK'
}
elem = createScript();
addEventListener(elem);
elem.src = url;
document.head.appendChild(elem);
}
function filterUrlCallback(url){
var cbRegex = /((\??)callback=\w*(&?))/;
if(typeof url === 'string' ){
url = url.replace(cbRegex,function(all,match,prefix,post){
return prefix && post ? prefix : '';
})
}
return url
}
function createScript(){
var elem = document.createElement('script');
elem.type = 'text/javascript';
elem.id = uid + '_id';
return elem
}
function addEventListener(elem){
if (!isElement(elem)){ return }
elem.addEventListener('load',function(){
var id = parseInt(elem.id),
callback = getJSON.callbacks[id],
response = getJSON.response[id];
callback.call(null,response);
cleanHook(elem);
})
}
function cleanHook(elem){
var id = parseInt(elem.id);
getJSON.callbacks[id] = undefined;
getJSON.response[id] = undefined;
document.head.removeChild(elem);
}
function isElement(o){
return o && typeof o === 'object' && o !== null && o.nodeType === 1 && typeof o.nodeName === 'string'
}
getJSON.callbacks = {};
getJSON.response = {};
getJSON.CALLBACK = function(response){
return getJSON.response[uid] = response
}
global.getJSON = getJSON;
})(window,document)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment