I've created a web page based on a sample from a book. It works fine, but seems to have become too complicated.
'use strict';
function toggle (triggers, elements, per_trigger, events) {
function toggle(index, per, elem, func) {
for (var i = 0; i < per; i++)
func(elem[index+i]);
}
if ((elements.length % triggers.length != 0 && elements.length != triggers.length * per_trigger)
|| (elements.length == 0 || triggers.length == 0)
|| (events[0].func == undefined || events[0].ev == undefined)) {
console.error('toggle: number of elements must be divisible by' +
'number of triggers, because one trigger can toggle more than one element\n' +
'for example: if you want a trigger to toggle two elements, then the per_trigger' +
' argument will be 2 and the number of elements must be equal to the number of triggers * 2');
return false;
}
for (var i = 0; i < triggers.length; i++) {
for (var f = 0; f < events.length; ++f) {
(function(_i, _f) {
$(triggers[_i]).on(events[_f].ev, function() {
toggle(_i*per_trigger, per_trigger, elements, events[_f].func);
})
})(i, f);
}
}
return true;
}
var hidden, trigger, PER_TRIGGER = 1, onclick;
function defineTriggers(hide) {
hidden = document.getElementsByTagName('div');
trigger = document.getElementsByTagName('h2');
if (hide) {
// hiding elements ..
for (var r=0; r<hidden.length; ++r) {
if (hidden[r].displayinfo == undefined)
hidden[r].displayinfo = hidden[r].style.display;
hidden[r].style.display = 'none';
hidden[r].shown = false;
}
toggle(trigger, hidden, PER_TRIGGER, [{'ev': 'click', 'func': onclick}]); // defined externally ..
}
}
function addDiv(date, info) {
var d = document.createElement('div'),
s = document.createElement('h2'),
p = document.createElement('p');
p.textContent = info;
s.textContent = date;
document.body.appendChild(s);
document.body.appendChild(d);
d.appendChild(p);
d.style.display = 'none';
d.shown = false;
d.displayinfo = 'block';
hidden[hidden.length] = d;
trigger[trigger.length] = s;
toggle([s], [d], PER_TRIGGER, [{'ev': 'click', 'func' : onclick}]);
}
alert('running')
onclick = function(e) {
e.style.display = e.shown ? 'none' : e.displayinfo;
e.shown = !e.shown;
};
defineTriggers(true);
// adding btn
var b = document.createElement('button'),
f = document.getElementsByTagName('footer')[0];
f.appendChild(b);
b.textContent = 'Add a Date'
b.onclick = function() {
var day, info, day_regex = /[A-Z][a-z]{1,7} [1-9][0-9]?, 2[0-9]{3}/;
do {
day = prompt('Day');
if (!day_regex.test(day)) alert('Day not correct .. !');
} while(!day_regex.test(day))
info = prompt('Info');
addDiv(day, info);
}
Is it possible to improve the clarity of this code, without affecting its functionality?
jQuery
more as it appears you have it already included in the page based on theon
handler \$\endgroup\$