Skip to content

Instantly share code, notes, and snippets.

@c7x43t
Last active March 22, 2018 08:23
Show Gist options
  • Save c7x43t/7d873ce9f2ad76c3d12143998588de2c to your computer and use it in GitHub Desktop.
Save c7x43t/7d873ce9f2ad76c3d12143998588de2c to your computer and use it in GitHub Desktop.
merc={
_kEquip:function(e){
e.setDefaultValue=function(value){
if(!(e instanceof Array)) e=merc._Array.from(e);
e.map(e=>{
e.value=value;
e.addEventListener("focusin",(e)=>{
if(e.target.value===value) e.target.value="";
});
e.addEventListener("focusout",(e)=>{
if(e.target.value==="") e.target.value=value;
});
});
}
return e;
}
};
$$k=s=>merc._kEquip(Array.from(document.querySelectorAll(s)).map(e=>merc._kEquip(e)));
document.addEventListener("DOMContentLoaded",e=>{
$$k("input[name='email']").setDefaultValue("e-mail");
$$k("input[name='password']").setDefaultValue("password");
});
function $$(sel){
_$=(e,sel)=>Array.from(e.querySelectorAll(sel)); // return array of elements from selector query
return _$(document,sel).map(e=>{ // equip elements with ...
e.query=sel=>_$(e,sel); // querySelectorAll shorthand
e.hasClass=str=>el.classList?el.classList.contains(str):new RegExp('(^| )'+str+'( |$)','gi').test(e.className);
e.addClass=str=>e.classList?e.classList.add(str):e.name+=' '+name;
e.removeClass=str=>el.classList?el.classList.remove(str):el.className=el.className.replace(new RegExp('(^|\\b)'+str.split(' ').join('|')+'(\\b|$)','gi'),' ');
e.after=str=>e.insertAdjacentHTML('afterend', str);
e.before=str=>e.insertAdjacentHTML('beforebegin', str);
e.append=el=>e.appendChild(el);
e.prepend=el=>e.insertBefore(el, e.firstChild);
e.remove=()=>e.parentNode.removeChild(e);
e.replace=str=>e.outerHTML=str;
e.clone=()=>e.cloneNode(true);
e.empty=()=>e.innerHTML='';
e.attr=(str,val)=>val?e.setAttribute(str,val):e.getAttribute(str);
e.css=(str,val)=>val?e.style[str]=val:getComputedStyle(e)[str];
e.html=str=>str?e.innerHTML=str:e.innerHTML;
e.text=str=>str?e.textContent=str:e.textContent;
e.next=()=>e.nextElementSibling;
e.prev=()=>e.previousElementSibling;
e.offset=()=>{
var rect = el.getBoundingClientRect();
return {
top: rect.top + document.body.scrollTop,
left: rect.left + document.body.scrollLeft
}
};
e.parent=()=>e.parentNode;
e.siblings=()=>Array.prototype.filter.call(e.parentNode.children,child=>child !== e);
e.position=()=>{return{left: e.offsetLeft, top: e.offsetTop}};
return e;
});
}
// $$.gather(query1,query2,query3) => joined list of all uqeries
(()=>{
// private vars
var a=2;
// private functions
_$=(e,sel)=>Array.from(e.querySelectorAll(sel));
function equip(a){
// map=fn=>a.map(e=>fn(arguments));
a.html=str=>a.map(e=>str?e.innerHTML=str:e.innerHTML);
a.on=(str,fn)=>a.map(e=>e.addEventListener(str,fn));
return a;
}
// main
var $$=sel=>{
var els=_$(document,sel);
return equip(els);
}
// public vars
$$.ajax=()=>{
}
// export
window.$$=$$;
})();
function $$(sel){
_$=(e,sel)=>Array.from(e.querySelectorAll(sel)); // return array of elements from selector query
var e=_$(document,sel); // equip elements with ...
e.query=sel=>_$(e,sel); // querySelectorAll shorthand
e.hasClass=str=>el.classList?el.classList.contains(str):new RegExp('(^| )'+str+'( |$)','gi').test(e.className);
e.addClass=str=>e.classList?e.classList.add(str):e.name+=' '+name;
e.removeClass=str=>el.classList?el.classList.remove(str):el.className=el.className.replace(new RegExp('(^|\\b)'+str.split(' ').join('|')+'(\\b|$)','gi'),' ');
e.toggleClass=str=>e.hasClass(str)?e.removeClass(str):e.addClass(str);
e.after=str=>e.insertAdjacentHTML('afterend', str);
e.before=str=>e.insertAdjacentHTML('beforebegin', str);
e.append=el=>e.appendChild(el);
e.prepend=el=>e.insertBefore(el, e.firstChild);
e.remove=()=>e.parentNode.removeChild(e);
e.replace=str=>e.outerHTML=str;
e.clone=()=>e.cloneNode(true);
e.empty=()=>e.innerHTML='';
e.attr=(str,val)=>val?e.setAttribute(str,val):e.getAttribute(str);
e.css=(str,val)=>val?e.style[str]=val:getComputedStyle(e)[str];
e.html=str=>str?e.innerHTML=str:e.innerHTML;
e.text=str=>str?e.textContent=str:e.textContent;
e.next=()=>e.nextElementSibling;
e.prev=()=>e.previousElementSibling;
e.offset=()=>{
var rect = el.getBoundingClientRect();
return {
top: rect.top + document.body.scrollTop,
left: rect.left + document.body.scrollLeft
}
};
e.parent=()=>e.parentNode;
e.siblings=()=>Array.prototype.filter.call(e.parentNode.children,child=>child !== e);
e.position=()=>{return{left: e.offsetLeft, top: e.offsetTop}};
//Events
e.on=(str,fn)=>e.addEventListener(str,fn);
e.off=(str,fn)=>e.removeEventListener(str,fn);
e.ready=fn=>(document.attachEvent?document.readyState==="complete":document.readyState!=="loading")?fn():document.addEventListener('DOMContentLoaded',fn);
return e;
}
// $$.gather(query1,query2,query3) => joined list of all uqeries
(()=>{
// ## private vars ##
var regexPreFilter=/[.#]?-?[_a-zA-Z]+[_a-zA-Z0-9-]*/;
var regexSpaceFilter=/ /;
// ## private functions ##
// fast functions copied from: https://github.com/codemix/fast.js/
function bindInternal3(func, thisContext) {
return function (a, b, c) {
return func.call(thisContext, a, b, c);
};
}
// fast Map
function fastMap(subject, fn, thisContext) {
var length = subject.length,
result = new Array(length),
iterator = thisContext !== undefined ? bindInternal3(fn, thisContext) : fn,
i;
for (i = 0; i < length; i++) {
result[i] = iterator(subject[i], i, subject);
}
return result;
};
// fast Reduce
function fastReduce (subject, fn, initialValue, thisContext) {
var length = subject.length,
iterator = thisContext !== undefined ? bindInternal4(fn, thisContext) : fn,
i, result;
if (initialValue === undefined) {
i = 1;
result = subject[0];
}
else {
i = 0;
result = initialValue;
}
for (; i < length; i++) {
result = iterator(result, subject[i], i, subject);
}
return result;
};
// fast Filter
function fastFilter (subject, fn, thisContext) {
var length = subject.length,
result = [],
iterator = thisContext !== undefined ? bindInternal3(fn, thisContext) : fn,
i;
for (i = 0; i < length; i++) {
if (iterator(subject[i], i, subject)) {
result.push(subject[i]);
}
}
return result;
};
// faster than querySelectorAll
function fastQuery(el,selector){
var nodeList;
if(regexPreFilter.exec(selector)&&!regexSpaceFilter.exec(selector)){
if(selector[0]==="."){
nodeList=el.getElementsByClassName(selector.replace('.',''))
}
else if(selector[0]==="#"){
nodeList=el.getElementById(selector.replace('#',''))
}
else{
nodeList=el.getElementsByTagName(selector)
}
}else{
nodeList=el.querySelectorAll(selector)
}
return nodeList;
}
/*
// obsolete with equip fast array native functions to nodeList
function queryToArray(el,selector){
return Array.from(fastQuery(el,selector));
};
//*/
function equip(nodeList){
// map=fn=>a.map(e=>fn(arguments));
nodeList.map=fn=>fastMap(nodeList,fn);
nodeList.reduce=fn=>fastReduce(nodeList,fn);
nodeList.filter=fn=>fastFilter(nodeList,fn);
nodeList.html=str=>{
nodeList.map(el=>str?el.innerHTML=str:el.innerHTML);
return nodeList;
};
nodeList.on=(str,fn)=>{
fastMap(nodeList,el=>el.addEventListener(str,fn));
return nodeList;
};
// faster replace operations
// {fn} must return an element
nodeList.map.replace=fn=>{
var list=[];
var nodes=Array.from(nodeList);
$$.map(nodes,e=>{
var k=e.cloneNode(true);
fn(k);
//list.push(k);
e.parentNode.replaceChild(k, e);
});
$$.map(nodes,(e,i)=>{
//e.parentNode.replaceChild(list[i], e);
});
}
return nodeList;
}
// main
var $$=selector=>{
var nodeArray=fastQuery(document,selector);
return equip(nodeArray);
}
// ## public vars ##
$$.map=fastMap;
$$.reduce=fastReduce;
$$.filter=fastFilter;
$$.ajax=()=>{
}
// export
window.$$=$$;
})();
function bindInternal3 (func, thisContext) {
return function (a, b, c) {
return func.call(thisContext, a, b, c);
};
}
// fast Map
function fastMap (subject, fn, thisContext) {
var length = subject.length,
result = new Array(length),
iterator = thisContext !== undefined ? bindInternal3(fn, thisContext) : fn,
i;
for (i = 0; i < length; i++) {
result[i] = iterator(subject[i], i, subject);
}
return result;
};
// fast Query
function query(sel){
var pre=/[.#]?-?[_a-zA-Z]+[_a-zA-Z0-9-]*/;
var sp=/ /;
var _=document;
var els;
if(pre.exec(s)&&!sp.exec(s)){
if(s[0]==="."){
els=_.getElementsByClassName(s.replace('.',''))
}
else if(s[0]==="#"){
els=_.getElementById(s.replace('#',''))
}
else{
els=_.getElementsByTagName(s)
}
}else{
els=_.querySelectorAll(s)
}
return els;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment