kotarok
8/20/2016 - 9:53 PM

Simple JSONP caller. Load JSON data as JSONP with given function.

Simple JSONP caller. Load JSON data as JSONP with given function.

var JSONP = function(apiurl, params, options) {

  if (params) {
    this.apiurl = this.constructURL_(apiurl, params);
  }

  this.conf = {
    callbackKey: 'callback',
    callbackName: 'uni',
    paramDelimiter: '&'
  };

  if (options) {
    Object.keys(options).forEach(function(option) {
      this.conf[option] = options[option];
    });
  }

  this.apiurl = apiurl.replace(
    RegExp(this.conf.paramDelimiter + '?' + this.conf.callbackKey + '='), '');
};

JSONP.prototype.buildParamStr_ = function(obj) {
  if (!obj) return false;
  var paramSets = [];
  Object.keys(obj).forEach(function(key) {
    paramSets.push(key + '=' + obj[key]);
  });
  return paramSets.join(this.conf.paramDelimiter);
};

JSONP.prototype.constructURL_ = function(baseURL, params) {
  return baseURL.replace(/&?$/,
    this.conf.paramDelimiter + this.buildParamStr_(params));
};

JSONP.discard = function(callbackName) {
  delete window[callbackName];
  var script = document.getElementById(callbackName);
  script.parentNode.removeChild(script);
};

JSONP.prototype.call = function(callback, params) {
  var callbackKey = this.conf.callbackKey;
  var delimiter = this.conf.paramDelimiter;
  var callbackName = this.conf.callbackName + Date.now();
  var callbackParam = callbackKey + '=' + callbackName;

  window[callbackName] = function(json) {
    callback(json);
    JSONP.discard(callbackName);
  };

  params[callbackKey] = callbackName;

  var script = document.createElement('script');
  script.src = this.apiurl + delimiter + this.buildParamStr_(params);
  script.id = callbackName;
  document.body.appendChild(script);
};