const buttons = document.querySelector('.content');
const blocks = document.querySelector('.wrap');
const dataAttr = 'block';
buttons.addEventListener('click', e => {
const block = e.target.dataset[dataAttr];
if (block) {
console.log(blocks.querySelectorAll(`:scope > [data-${dataAttr}="${block}"]`).length);
}
});
const onClick = ({ target: { attributes: { ['data-' + dataAttr]: { value } } } }) =>
console.log(Array.prototype.reduce.call(
blocks.children,
(acc, n) => acc + (n.getAttribute('data-'.concat(dataAttr)) === value),
0
));
for (const n of buttons.children) {
n.addEventListener('click', onClick);
}
top
.window.top
, который запрещён из-за кроссдоменности.#ball {
display: block;
position: absolute;
width: 80px;
height: 80px;
top: 50%;
left: 50%;
margin-top: -40px;
margin-left: -40px;
}
const processNonEmptyObjectOnly = (f, defaultResult) =>
data => (
data = data instanceof Object ? Object.entries(data) : [],
data.length ? f(data) : defaultResult
);
const createTreeHTML = processNonEmptyObjectOnly(data => `
<ul>${data.map(n => `
<li>
${n[0]}
${createTreeHTML(n[1])}
</li>`).join('')}
</ul>`
, '');
document.body.insertAdjacentHTML('beforeend', createTreeHTML(data));
const createTreeElement = processNonEmptyObjectOnly(data =>
data.reduce((ul, n) => (
ul.append(document.createElement('li')),
ul.lastChild.append(n[0], createTreeElement(n[1])),
ul
), document.createElement('ul'))
, '');
document.body.append(createTreeElement(data));