Created
February 25, 2017 15:51
-
-
Save sgen/e00d68752006515fdf4c3e69163ab410 to your computer and use it in GitHub Desktop.
A Simple Mobile Nav
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() { | |
'use strict'; | |
function addClassIfNotPresent(e, c) { | |
console.log('addClassIFNotPresent'); | |
console.log(e); | |
console.log(c); | |
var val = e.getAttribute('class'); | |
if (val === null) { | |
e.setAttribute('class', c); | |
return; | |
} | |
var classes = val.split(' '); | |
var hasClass = false; | |
classes.forEach(function(i) { | |
if (i == c) { | |
hasClass = true; | |
} | |
}); | |
if (!hasClass) { | |
classes.push(c); | |
e.setAttribute('class', classes.join(' ')); | |
} | |
} | |
function removeClassIfPresent(e, c) { | |
console.log('removeClassIFPresent'); | |
console.log(e); | |
console.log(c); | |
var val = e.getAttribute('class'); | |
if (val === null) { | |
return; | |
} | |
var classes = val.split(' '); | |
console.log(classes); | |
for (var i = 0; i < classes.length; i++) { | |
var v = classes[i]; | |
if (c === v) { | |
if (i === 0) { | |
classes = classes.slice(1, classes.length); | |
} else if (i === classes.length - 1) { | |
classes = classes.slice(0, classes.length - 1); | |
} else { | |
classes = classes.slice(0, i).concat(classes.slice(i + 1, classes.length)); | |
} | |
} | |
} | |
console.log(classes); | |
e.setAttribute('class', classes.join(' ')); | |
} | |
function Nav(config) { | |
this._configure(config); | |
return this; | |
} | |
Nav.prototype._configure = function(config) { | |
var sources = this._parseSources(config.sources); | |
var target = document.getElementById(config.target); | |
if (toggle === null) { | |
throw new Error('nav: config.target must be a valid id'); | |
} | |
this._copySources(sources, target); | |
var toggle = document.getElementById(config.toggle); | |
if (toggle === null) { | |
throw new Error('nav: config.toggle must be a valid id'); | |
} | |
this._initToggle(toggle, target); | |
} | |
Nav.prototype._parseSources = function(sources) { | |
var sourceElems = []; | |
if (typeof sources === 'string') { | |
var sourceElem = document.getElementById(sources); | |
if (sourceElem === null) { | |
throw new Error('nav: config.sources must be a valid id or array of valid ids'); | |
} else { | |
sourceElems.push(sourceElem); | |
} | |
} else if (Array.isArray(sources)) { | |
for (var i = 0; i < sources.length; i++) { | |
var source = sources[i]; | |
var elem = document.getElementById(source); | |
if (elem === null) { | |
throw new Error('nav: config.sources must be a valid id or array of valid ids'); | |
} | |
sourceElems.push(elem); | |
} | |
} | |
return sourceElems; | |
} | |
Nav.prototype._copySources = function(sources, target) { | |
for (var i = 0; i < sources.length; i++) { | |
var children = sources[i].children; | |
for (var j = 0; j < children.length; j++) { | |
var child = children[j]; | |
var clone = child.cloneNode(true); | |
target.appendChild(clone); | |
} | |
} | |
} | |
Nav.prototype._initToggle = function(toggle, target) { | |
var f = toggle.onclick; | |
if (f === null) { | |
toggle.onclick = this._toggle(toggle, target); | |
} else { | |
var t = this._toggle(toggle, target); | |
toggle.onclick = function(e) { | |
f(e); | |
t(); | |
}; | |
} | |
} | |
Nav.prototype._toggle = function(toggle, target) { | |
var active = false; | |
return function() { | |
console.log('Toggled'); | |
if (active) { | |
console.log(active); | |
removeClassIfPresent(toggle, 'active'); | |
addClassIfNotPresent(target, 'collapsed'); | |
active = false; | |
} else { | |
console.log(active); | |
removeClassIfPresent(target, 'collapsed'); | |
addClassIfNotPresent(toggle, 'active'); | |
active = true; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment