Last active
May 24, 2022 16:12
-
-
Save Polyneue/6cb118e0be1cbc58135b50e6e8165847 to your computer and use it in GitHub Desktop.
Exploring alternatives to common jquery tasks, toggling classes on elements.
This file contains hidden or 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
/** | |
* Utility - Toggle Class | |
* @param {Object} el - element | |
* @param {String} cl - class name | |
* @use Check for and toggle specified class name | |
*/ | |
function toggleClass(el, cl) { | |
if(el.classList) { | |
el.classList.toggle(cl); | |
} else { | |
var classes = el.className.split(' '), | |
existingIndex = classes.indexOf(cl); | |
if (existingIndex >= 0) { | |
classes.splice(existingIndex, 1); | |
} else { | |
classes.push(cl); | |
} | |
el.className = classes.join(' '); | |
} | |
} | |
/** | |
* Utility - Add Event Listener to Classes | |
* @param {Array} arr - array | |
* @param {String} name - event name | |
* @param {Function} fn - function | |
* @use Add event listeners to all elements of a class | |
*/ | |
function addEventListenersToArray(arr, name, fn) { | |
Array.prototype.forEach.call(arr, function(el, i) { | |
el.addEventListener(name, fn); | |
}); | |
} | |
/** | |
* Interaction - Toggle Class on Parent | |
* @param {Object} e - event | |
*/ | |
function toggleClassOnParent(e) { | |
e.preventDefault(); | |
toggleClass(this.parentNode, 's-toggled'); | |
} | |
/** | |
* Interaction - Toggle Class on Self | |
* @param {Object} e - event | |
*/ | |
function toggleClassOnSelf(e) { | |
e.preventDefault(); | |
toggleClass(this, 's-toggled'); | |
} | |
/** | |
* Interaction - Toggle Class on Target | |
* @param {Object} e - event | |
*/ | |
function toggleClassOnTarget(e) { | |
e.preventDefault(); | |
var dataTarget = this.getAttribute('data-toggle-target'), | |
target = document.querySelectorAll(dataTarget)[0]; | |
toggleClass(target, 's-toggled'); | |
} | |
/** | |
* Create Event Listeners | |
*/ | |
function appInit() { | |
var parentToggles = document.querySelectorAll('.js-toggle-parent'), | |
selfToggles = document.querySelectorAll('.js-toggle-self'), | |
targetToggles = document.querySelectorAll('.js-toggle-target'); | |
addEventListenersToArray(parentToggles, 'click', toggleClassOnParent); | |
addEventListenersToArray(selfToggles, 'click', toggleClassOnSelf); | |
addEventListenersToArray(targetToggles, 'click', toggleClassOnTarget); | |
} | |
/** | |
* Check for Document Ready and Initialize | |
* @param {function} fn - function | |
*/ | |
function ready(fn) { | |
if(document.readyState != 'loading') { | |
fn(); | |
} else { | |
document.addEventListener('DOMContentLoaded', fn); | |
} | |
} | |
/** | |
* Initialize | |
*/ | |
ready(appInit); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment