Last active
February 5, 2019 21:57
-
-
Save wayferer/8713384 to your computer and use it in GitHub Desktop.
My default set of JS helpers
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 zQ(selector){return document.querySelector(selector);} | |
function zQA(selector){return document.querySelectorAll(selector);} | |
function zAddClass(el,className){ | |
if(el === null) { return; } | |
if(!((' '+el.className+' ').indexOf(' '+className+' ')>-1)){el.className+=' '+className;} | |
} | |
function zHasClass(el,className){ | |
//if((' '+el.className+' ').indexOf(' '+className+' ')>-1){return true;} | |
//else{return false;} | |
return new RegExp(' '+className+' ').test(' '+el.className+' '); | |
} | |
function zRemoveClass(el,className){ | |
if (!el || !el.className) { return; } | |
el.className=el.className.replace(' '+className,'').replace(className,''); | |
} | |
function zToggleClass(el,className){ | |
if (!el || !el.className) { return; } | |
var newClass=' '+el.className.replace(/[\t\r\n]/g," ")+' '; | |
if(zHasClass(el,className)){ | |
while(newClass.indexOf(" "+className+" ")>=0){newClass=newClass.replace(" "+className+" "," ");} | |
el.className=newClass.replace(/^\s+|\s+$/g,''); | |
} | |
else{el.className+=' '+className;} | |
} | |
function zBindEvent(el,eventName,eventHandler){ | |
if(el === null) { return; } | |
if(el.addEventListener){el.addEventListener(eventName,eventHandler,false);} | |
//else if(el.attachEvent){el.attachEvent('on'+eventName,eventHandler);} | |
else if(el.attachEvent){el.attachEvent('on'+eventName,function(a){a.currentTarget=el;eventHandler(a);});} | |
} | |
function zUnbindEvent(el,eventName,eventHandler){ | |
if(el.removeEventListener){el.removeEventListener(eventName,eventHandler,false);} | |
else if(el.detachEvent){el.detachEvent('on'+eventName,function(a){a.currentTarget=el;eventHandler(a);});} | |
} | |
function zPreviousElementSibling(el){ | |
if(el.previousElementSibling){return el.previousElementSibling;} | |
else{while(el=el.previousSibling){if(el.nodeType===1) return el;}} | |
} | |
function zNextElementSibling(el){ | |
if(el.nextElementSibling){return el.nextElementSibling;} | |
else{while(el=el.nextSibling){if(el.nodeType===1) return el;}} | |
} | |
function zGetCurrentTargetElement(event){ | |
if(typeof event.currentTarget!='undefined'){currentTargetElement=event.currentTarget;} | |
else{currentTargetElement=window.event.srcElement;} | |
return currentTargetElement; | |
} | |
function zGetTargetElement(event){ | |
if(typeof event.target!='undefined'){targetElement=event.target;} | |
else{targetElement=window.event.srcElement;} | |
return targetElement; | |
} | |
function zIsTouchDevice(){ | |
var isTouch=(('ontouchstart' in window)||(navigator.msMaxTouchPoints>0)); | |
if(isTouch){zAddClass(document.documentElement,'touch');} | |
else{zAddClass(document.documentElement,'notouch');} | |
} | |
zIsTouchDevice(); | |
var wrap=function(toWrap,wrapper){ | |
wrapper=wrapper || document.createElement('div'); | |
if(toWrap.nextSibling){toWrap.parentNode.insertBefore(wrapper,toWrap.nextSibling);} | |
else{toWrap.parentNode.appendChild(wrapper);} | |
return wrapper.appendChild(toWrap); | |
}; | |
function serialize(form) { | |
var field, s = []; | |
var rs = {}; | |
if (typeof form == 'object' && form.nodeName == "FORM") { | |
var len = form.elements.length; | |
for (i=0; i<len; i++) { | |
field = form.elements[i]; | |
if (field.name && !field.disabled && field.type != 'file' && field.type != 'reset' && field.type != 'submit' && field.type != 'button') { | |
if (field.type == 'select-multiple') { | |
for (j=form.elements[i].options.length-1; j>=0; j--) { | |
if(field.options[j].selected) | |
s[s.length] = encodeURIComponent(field.name) + "=" + encodeURIComponent(field.options[j].value); | |
} | |
} else if ((field.type != 'checkbox' && field.type != 'radio') || field.checked) { | |
s[s.length] = encodeURIComponent(field.name) + "=" + encodeURIComponent(field.value); | |
rs[field.name] = field.value; | |
} | |
} | |
} | |
} | |
// return s.join('&').replace(/%20/g, '+');//returns array | |
return rs;//returns as object | |
} | |
function serializeAlt(form) { | |
var form_data = {}; | |
for (var i = 0, ii = form_jsea.length; i < ii; ++i) { | |
var input = form_jsea[i]; | |
if (input.name) { | |
form_data[input.name] = input.value; | |
} | |
} | |
JSON.stringify(form_data) | |
} | |
var serializeFancy = (function (slice) { | |
return function (form) { | |
//no form, no serialization | |
if (form == null) | |
return null; | |
//get the form elements and convert to an array | |
return slice.call(form.elements) | |
.filter(function (element) { | |
//remove disabled elements | |
return !element.disabled; | |
}).filter(function (element) { | |
//remove unchecked checkboxes and radio buttons | |
return !/^input$/i.test(element.tagName) || !/^(?:checkbox|radio)$/i.test(element.type) || element.checked; | |
}).filter(function (element) { | |
//remove <select multiple> elements with no values selected | |
return !/^select$/i.test(element.tagName) || element.selectedOptions.length > 0; | |
}).map(function (element) { | |
switch (element.tagName.toLowerCase()) { | |
case 'checkbox': | |
case 'radio': | |
return { | |
name: element.name, | |
value: element.value === null ? 'on' : element.value | |
}; | |
case 'select': | |
if (element.multiple) { | |
return { | |
name: element.name, | |
value: slice.call(element.selectedOptions) | |
.map(function (option) { | |
return option.value; | |
}) | |
}; | |
} | |
return { | |
name: element.name, | |
value: element.value | |
}; | |
default: | |
return { | |
name: element.name, | |
value: element.value || '' | |
}; | |
} | |
}); | |
} | |
}(Array.prototype.slice)); | |
function isScrolledIntoView(element){ | |
var elementTop = element.getBoundingClientRect().top, | |
elementBottom = element.getBoundingClientRect().bottom; | |
return isVisible = elementTop < window.innerHeight && elementBottom >= 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment