Last active
December 16, 2015 05:19
-
-
Save noblethrasher/5383649 to your computer and use it in GitHub Desktop.
A small AJAX library
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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