Skip to content

Instantly share code, notes, and snippets.

@noblethrasher
Last active December 16, 2015 05:19
Show Gist options
  • Save noblethrasher/5383649 to your computer and use it in GitHub Desktop.
Save noblethrasher/5383649 to your computer and use it in GitHub Desktop.
A small AJAX library
function $xhr(url, success, fail) {
var _url = url;
var me = this;
var seperator = 'sdfsdfsdfdsweriweournClkjwa'; //TODO: Replace with a real pseudo random string generator
me.data = {};
function request_success(x) {
return (x.status == 200) || (x.status == 304);
}
function createXHR(method, url) {
var _xhr = XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
_xhr.onreadystatechange = function () {
if (_xhr.readyState == 4) {
console.log(_xhr.status);
var is_success = me.SucessCondition && typeof (me.SuccessCondition) == 'function'
? SuccessCondition(_xhr) : request_success(_xhr);
if (is_success)
{
if (success != null)
{
var responseData;
var content_type = _xhr.getResponseHeader('Content-Type');
if (content_type == null)
content_type = '';
if (content_type.search(/json/i) >= 0)
eval('responseData=' + _xhr.responseText);
if (content_type.search(/xml/i) >= 0)
responseData = _xhr.responseXML;
if (content_type.search(/script/i) >= 0)
eval(_xhr.responseText);
if (responseData == null)
responseData = _xhr.responseText;
success(responseData);
}
}
else
{
if (fail != null)
console.log(_xhr);
}
}
}
url = url ? url : _url;
if (url == null)
throw 'URL IS NULL';
_xhr.open(method, url);
return _xhr;
}
function createDataString(obj) {
if (obj == null)
return null;
var xs = new Array();
for (p in obj) {
if (obj.hasOwnProperty(p) && (typeof (obj[p]) != 'function')) {
var __name = encodeURIComponent(p);
var split = (obj[p].toString()).split(seperator);
var array = new Array();
for (var i = 0; i < split.length; i++)
array.push(encodeURIComponent(split[i]))
var __val = array.join(',');
xs.push(__name + '=' + __val);
}
}
return xs.length > 0 ? xs.join('&') : null;
}
this.get = function (url) {
createXHR('get', url).send();
}
this.post = function (url) {
var xhr = createXHR('post', url);
var payload = createDataString(me.data);
if (payload != null && payload.length > 0) {
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.setRequestHeader('Accept', 'application/json');
console.log(payload);
xhr.send(payload);
}
else {
xhr.send();
}
}
function ensureDataObject() {
if (me.data == null)
me.data = {};
}
this.setData = function (obj) {
if (arguments.length > 1) {
ensureDataObject();
me.data[arguments[0]] = arguments[1];
return true;
}
var __id = null;
var successful_data_extraction = false;
if (!obj)
return false;
if (typeof (obj.checked) == 'boolean' && obj.type == 'checkbox' && !obj.checked)
return false;
if (typeof (obj) == 'string')
return this.setData(document.getElementById(obj));
if (obj.toString == '[object HTMLFormElement]')
return this.setData(obj.childNodes);
ensureDataObject();
if (obj.length && parseInt(obj.length, 10) > 0) {
var len = obj.length;
for (var i = 0; i < len; i++) {
var elem = obj[i];
if (typeof (elem.checked) == 'boolean' && elem.type == 'checkbox' && !elem.checked)
continue;
if (elem.name)
__id = encodeURI(elem.name)
else
if (elem.id)
__id = encodeURI(elem.id);
if (__id != null) {
if (elem.selectedOptions) {
var selected = new Array();
var items = elem.selectedOptions;
var len = items.length;
for (var i = 0; i < len; i++)
selected.push({ name: elem.name, value: elem.value });
return this.setData(selected);
}
else
if (elem.value) {
if (me.data[__id])
me.data[__id] += seperator + elem.value;
else
me.data[__id] = elem.value;
successful_data_extraction = true
}
}
}
}
else {
__id = obj.name || obj.id;
if (__id != null && obj.value) {
me.data[__id] = obj.value;
successful_data_extraction = true
}
else {
me.data = obj;
successful_data_extraction = true
}
}
return successful_data_extraction;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment