Skip to content

Instantly share code, notes, and snippets.

@jkarnowski
Created July 19, 2016 17:17
Show Gist options
  • Save jkarnowski/c0ef20317392a61b3f6393aa2534c064 to your computer and use it in GitHub Desktop.
Save jkarnowski/c0ef20317392a61b3f6393aa2534c064 to your computer and use it in GitHub Desktop.
/*!
* minQuery example, inspired by former teacher JulianB @
*/
var miniQuery = function(htmlElement){
function isMultiple(htmlElement){
var type = htmlElement.substring(0,1);
return type != '#';
}
function breakDownElement(htmlElement){
var type = htmlElement.substring(0,1);
element = SweetSelector.select(htmlElement);
if (isMultiple(htmlElement)){
element = element[0];
}
return element;
}
}
var SweetSelector = (function(){
var exports = {};
exports.select = function(htmlElement){
var type = htmlElement.substring(0,1);
var name = htmlElement.substring(1);
if (type == '#') { // id selector
return document.getElementById(name)
}
else if (type == '.') { // class selector
return document.getElementsByClassName(name);
}
else { // better only be a tag
return document.getElementsByTagName(htmlElement);
}
};
return exports;
})(); //end of SweetSelector
var DOM = (function(){
var exports = {};
exports.hide = function(elementToManipulate){
var element = breakDownElement(elementToManipulate);
element.style.display = 'none'
};
exports.show = function(elementToManipulate){
var element = breakDownElement(elementToManipulate);
element.style.display = '';
};
exports.addClass = function(elementToManipulate, klass){
var element = breakDownElement(elementToManipulate)
var currentClass = element.getAttribute('class') || '';
if (currentClass == ''){
var updateClass = klass;
} else {
var updateClass = currentClass + " " + klass;
}
element.setAttribute('class', updateClass);
};
exports.removeClass = function(elementToManipulate, klass) {
var element = breakDownElement(elementToManipulate);
var existingClasses = element.getAttribute('class') || '';
re = new RegExp("\\s*" + klass + "\\s*", "g");
var resultingClasses = existingClasses.replace(re, '');
if (resultingClasses == ''){
element.removeAttribute('class');
} else {
element.setAttribute('class', resultingClasses);
}
};
return exports;
})();
var EventDispatcher = (function(){
var exports = {};
exports.on = function(target, name, callback){
var element = SweetSelector.select(target);
// what is happening here
if (isMultiple(target)){
Array.prototype.map.call(element, function(el){
callback.bind(el);
el.addEventListener(name, callback, false)
});
} else {
callback.bind(el)
element.addEventListener(name, callback, false);
}
};
exports.trigger = function(target, name){
var event = new Event(name);
var element = SweetSelector.select(target);
if (isMultiple(target)){
Array.prototype.map.call(element, function(el){
el.dispatchEvent(event)
});
} else {
element.dispatchEvent(event);
}
};
return exports;
})();
var AjaxWrap = (function(){
var exports = {};
exports.request = function(args){
return new Promise(function(resolve, reject){
var oRequest = new XMLHttpRequest();
oRequest.open(args.type, args.url);
oRequest.onload = function(){
if (this.status >= 200 && this.status <= 300){
resolve(oRequest.response);
} else {
reject(oRequest.statusText)
}
}
if (args.type == 'POST'){
oRequest.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
}
if (args.data == undefined){
oRequest.send();
} else {
oRequest.send(args.data);
}
oRequest.onerror = function(){
reject(this.statusText)
}
oRequest.send(args.data);
});
};
return exports;
})();
var exports = SweetSelector.select(selector);
exports.hide = function(){
DOM.hide(selector);
}
exports.show = function(){
DOM.show(selector);
}
exports.addClass = function(){
DOM.addClass(selector, klass);
}
exports.removeClass = function(){
DOM.removeClass(selector, klass);
}
exports.on = function(){
EventDispatcher.on(selector, eventName, callback);
}
exports.trigger = function(){
EventDispatcher.trigger(selector, eventName);
}
exports.ready = function(callback){
if (document.readyState != 'loading'){
callback();
} else {
document.addEventListener('DOMContentReady', callback);
}
}
return exports;
miniQuery.ajax = function(params) {
if (params.success === undefined || params.fail === undefined) {
return Error('missing success or fail callback');
}
var success = params.success;
var fail = params.fail;
var ajaxProm = new Promise(function(resolve, reject) {
var req = new XMLHttpRequest();
req.open(params.type, params.url);
req.onload = function() {
if (Math.floor(req.status / 100) == 2) {
resolve(req.response);
} else {
reject(req.statusText);
}
}
if (params.type == 'POST') {
req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
}
if (params.data === undefined) {
req.send();
} else {
req.send(params.data);
}
});
ajaxProm.then(success).catch(fail);
}
var $ = miniQuery;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment