Skip to content

Instantly share code, notes, and snippets.

@wayferer
Last active February 5, 2019 21:57
Show Gist options
  • Save wayferer/8713384 to your computer and use it in GitHub Desktop.
Save wayferer/8713384 to your computer and use it in GitHub Desktop.
My default set of JS helpers
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