<div data-color="black"></div>
<div data-color="white"></div>document.addEventListener('click', ({ target: { dataset: { color } } }) => {
if (color) {
document.querySelector('button').dataset.id = color;
}
});
// или
const button = document.querySelector('button');
const onClick = e => button.setAttribute('data-id', e.target.getAttribute('data-color'));
document.querySelectorAll('[data-color]').forEach(n => n.addEventListener('click', onClick));
$('.btn-show').on('click', function() { $(this).toggleClass('.flip'); });
'flip', без точки..btn-show - вот там и дёргайте toggleClass.
const arr = Array.from({ length: max - min + 1 }, (n, i) => i + min);function* range(start, stop, step) {
if (stop === undefined) {
stop = start;
start = 0;
}
if (start === stop) {
step = 1;
}
if (step === undefined) {
step = Math.sign(stop - start);
}
if (start <= stop && step > 0 || start >= stop && step < 0) {
for (let i = start; step < 0 ? i >= stop : i <= stop; i += step) {
yield i;
}
}
}console.log(Array.from(range(3, 9))); // [3, 4, 5, 6, 7, 8, 9]
console.log([...range(-5)]); // [0, -1, -2, -3, -4, -5]
for (const n of range(100, 200, 33)) {
console.log(n); // 100 133 166 199
}
const r = range(12, -7, -5);
for (let n; !(n = r.next()).done;) {
console.log(n.value); // 12 7 2 -3
}
const replacements = {
worksAmount: 187,
reviewsAmount: 666,
};
const newStr = str.replace(/\$\$\[(\w+)\]/g, (m, g1) => replacements[g1] ?? m);
async function chain(arr) {
const result = [];
for (const item of arr) {
result.push(await item(result[result.length - 1]));
}
return result;
}function chain(arr) {
const result = [];
return arr
.reduce((prev, curr) => prev.then(curr).then(r => (result.push(r), r)), Promise.resolve())
.then(() => result);
}
const findInTree = (tree, childrenKey, test) =>
(Array.isArray(tree) ? tree : []).reduce((found, n) =>
found ?? (test(n) ? n : findInTree(n[childrenKey], childrenKey, test))
, null);const findInTree = function(tree, childrenKey, test) {
const stack = [];
for (let [ i, arr ] = this(tree); ++i < arr.length || stack.length;) {
if (i === arr.length) {
[ i, arr ] = stack.pop();
} else if (test(arr[i])) {
return arr[i];
} else {
stack.push([ i, arr ]);
[ i, arr ] = this(arr[i][childrenKey]);
}
}
return null;
}.bind(x => [ -1, x instanceof Array ? x : [] ]);const obj = findInTree(arr, 'children', n => n.id === id);
if (obj) {
obj.isSelected = isSelected;
}
arr.reduce((acc, n) => acc + n.startsWith(`${currency} `) * /\d+$/.exec(n), 0)arr.reduce((acc, n) => {
const [ currency, sum ] = n.split(' ');
acc[currency] = (acc[currency] ?? 0) + +sum;
return acc;
}, {})
const key = 'type';
const attr = `data-${key}`;
const attrSelector = `[${attr}]`;const getTypeGroup = el => el.dataset[key].replace(/\d/g, '');
// или
const getTypeGroup = el => el.getAttribute(attr).match(/\D+/)[0];
// или
const getTypeGroup = el => el.attributes[attr].value.split(/\d/).shift();document.addEventListener('click', e => {
const el = e.target.closest(attrSelector);
if (el) {
console.log(getTypeGroup(el));
}
});
// или
document.querySelectorAll(attrSelector).forEach(function(n) {
n.addEventListener('click', this);
}, e => console.log(getTypeGroup(e.currentTarget)));
const chunked = (data, chunkSize, slice = data.slice) =>
Array.from(
{ length: Math.ceil(data.length / chunkSize) },
function(_, i) {
return this(i * chunkSize, (i + 1) * chunkSize);
},
(slice instanceof Function ? slice : Array.prototype.slice).bind(data)
);const parentSelector = '.row-module';
const wrapperTag = 'div';
const wrapperClass = 'wrap';
const wrapSize = 4;for (const $n of chunked($(parentSelector).children(), wrapSize)) {
$n.wrapAll(`<${wrapperTag} class="${wrapperClass}">`);
}const parent = document.querySelector(parentSelector);
chunked(parent.children, wrapSize).forEach(n => {
parent.append(document.createElement(wrapperTag));
parent.lastChild.classList.add(wrapperClass);
parent.lastChild.append(...n);
});
const containerSelector = '.tabs';
const headerSelector = `${containerSelector} .tabs-nav__item`;
const contentSelector = `${containerSelector} .tab`;
const activeClass = 'is-active';
function setActiveTab(header) {
if (header instanceof Element && header.matches(headerSelector)) {
const container = header.closest(containerSelector);
const headers = container.querySelectorAll(headerSelector);
const contents = container.querySelectorAll(contentSelector);
const index = Array.prototype.indexOf.call(headers, header);
const toggle = (n, i) => n.classList.toggle(activeClass, i === index);
headers.forEach(toggle);
contents.forEach(toggle);
}
}
// делегирование, подключаем обработчик клика один раз для всех
document.addEventListener('click', e => {
setActiveTab(e.target.closest(headerSelector));
});
// или, назначаем обработчик клика индивидуально каждому заголовку
document.querySelectorAll(headerSelector).forEach(function(n) {
n.addEventListener('click', this);
}, e => setActiveTab(e.currentTarget));
function getUsersInfo(ids, callback) {
const results = [...Array(ids.length)];
ids.forEach((n, i) => {
getUserInfo(n, user => {
results[i] = user;
if (results.every(Boolean)) {
callback(result);
}
});
});
}
<div class="title" data-name="first">
<div class="title" data-name="second">
...
<div class="list" data-name="first">
<div class="list" data-name="second">
...$('.title').click(function() {
$(`.list[data-name="${this.dataset.name}"]`).slideToggle('fast');
});$('.title').click(function() {
$('.list').eq($(this).index()).slideToggle('fast');
});.title /.list, тогда можно так:$('.title').click(function() {
$(this).closest('здесь селектор общего предка').find('.list').slideToggle('fast');
});
document.addEventListener('input', function(e) {
const inputsWrapper = e.target.closest('.класс-блоков-которые-содержат-ваши-инпуты');
if (inputsWrapper) {
const inputs = [...inputsWrapper.querySelectorAll('input')];
const lastInput = inputs.pop();
lastInput.value = inputs.map(n => n.value).join(' ');
}
});
str.slice(0, 3) + '-'.repeat(Math.max(0, str.length - 3))
// или
str.replace(/(?<=.{3})./g, '-')
// или
Array.from(str, (n, i) => i < 3 ? n : '-').join('')
// или
str.replace(/./g, (m, i) => i < 3 ? m : '-')
// или
str.match(/.{0,3}/) + Array(Math.max(0, str.length - 2)).join`-`
// или
str.substring(0, 3).padEnd(str.length, '-')