const result = await Promise.all([ 1, 2, 3 ].map((n, i) => {
return new Promise(resolve => {
setTimeout(() => {
console.log(`timeout #${i}`);
resolve(n * 10);
}, Math.random() * 3000 | 0);
});
}));
console.log('result:', result);
не оборачиваются
$('.list').find('li:gt(2)').hide();
// или
$('li:gt(2)', '.list').hide();
// или
$('.list li:nth-child(3)').nextAll().hide();
// или
$('.list li:nth-child(n + 4)').hide();
// или
$('.list li').next().next().next().hide();
// или
$('.list > + + +').hide();
Array
.from(document.querySelectorAll('.list'))
.flatMap(n => [...n.children].slice(3))
.forEach(n => n.hidden = true);
// или (тут надо будет стиль добавить: .hidden { display: none; })
[].forEach.call(document.getElementsByClassName('list'), n => {
[].forEach.call(n.getElementsByTagName('li'), (m, i) => {
m.classList.toggle('hidden', i > 2);
});
});
hide('.list', 'li', 3);
): function hide(containerSelector, elementSelector, hideFrom) {
$(containerSelector).each((i, n) => {
$(elementSelector, n).slice(hideFrom).hide();
});
}
// или
function hide(containerSelector, elementSelector, hideFrom) {
for (const n of document.querySelectorAll(containerSelector)) {
const elements = n.querySelectorAll(elementSelector);
for (let i = hideFrom; i < elements.length; i++) {
elements[i].style.display = 'none';
}
}
}
add() {
const clone = this.clone.cloneNode(true);
clone.classList.add(`new${this.index++}`);
this.wrap.insertBefore(clone, this.beforeInsert);
}
.filter-values
класс лучше переключать у их самых дальних не общих предков, т.е., у .material-block
. В этом случае не надо искать внутри контейнера элемент, у которого должен быть переключен класс, а если в будущем захотите внутри открытого .material-block
стилизовать ещё какой-то элемент, то не придётся переписывать js-код.- .material-block .filter-values.open {
+ .material-block.open .filter-values {
const containerSelector = '.material-block';
const buttonSelector = `${containerSelector} .catalog-filter-block-title`;
const activeClass = 'open';
$(document).on('click', ({ target: t }) => {
const $container = $(t).closest(containerSelector);
const $button = $(t).closest(buttonSelector);
if ($button.length) {
$container.toggleClass(activeClass);
}
$(containerSelector).not($container).removeClass(activeClass);
});
document.addEventListener('click', ({ target: t }) => {
const container = t.closest(containerSelector);
const button = t.closest(buttonSelector);
if (button) {
container.classList.toggle(activeClass);
}
document.querySelectorAll(containerSelector).forEach(n => {
if (n !== container) {
n.classList.remove(activeClass);
}
});
});
.expanded
). Гуглите "делегирование".click(false)
не годится в качестве отмены действия по умолчанию - надо сделать нормальный обработчик, в котором выполнять preventDefault
. Типа так (ну или тоже через делегирование, но это как-то глупо будет выглядеть - два обработчика одного события, хотя мог бы быть и один). $('.break-word').html((i, html) => {
const [ a, b, c ] = html.split(' ');
return `${a} ${b}<br>${c}`;
});
document.querySelectorAll('.break-word').forEach(n => {
n.innerHTML = n.innerText.replace(/(.+ .+) /, '$1<br>');
});
почему-то не отрабатывает ни один из хуков
Object.entries(comments).reduce((acc, [ k, v ]) => v.parent === null ? { ...acc, [k]: v } : acc, {})
Object.values(comments).reduce((acc, n) => (n.parent === null && (acc[n.id] = n), acc), {})
<button class="click-count">click me</button>
<button class="click-count">click me</button>
<button class="click-count">click me</button>
document.addEventListener('click', ({ target: t }) => {
if (t.classList.contains('click-count')) {
t.innerText = (t.innerText | 0) + 1;
}
});
// или
const onClick = e => e.target.textContent = -~e.target.textContent;
document.querySelectorAll('.click-count').forEach(n => n.addEventListener('click', onClick));
Есть 3 блока, которые хранятся в массиве
let block = document.querySelectorAll(".block");
const index = Array.prototype.indexOf.call(block, e.target);
const index = [...block].findIndex(n => n === e.target);
let index = block.length;
while (index-- > 0 && block[index] !== e.target) ;
$('blockquote').html((i, html) => html.replace(/(©)(.*)$/, '$1<cite>$2</cite>'));
const el = document.querySelector('blockquote');
const html = el.innerHTML;
const index = html.indexOf('©') + 1;
el.innerHTML = `${html.slice(0, index)}<cite>${html.slice(index)}</cite>`;
const el = document.querySelector('blockquote');
el.innerHTML = el.innerHTML
.split('©')
.map((n, i) => i ? '<cite>' + n + '</cite>' : n)
.join('©');
выдаёт неправильную дату
let ts = 1539338750;
function movie(card, ticket, perc) {
let count = 0;
let price = ticket;
let sum = card;
while (Math.ceil(sum) >= ticket * count) {
count++;
price *= perc;
sum += price;
}
return count;
}
(function timeout() {
if (--container.textContent > to) {
setTimeout(timeout, rand(1000, 4000));
}
})();
const arrayToObject = (array) => { array.reduce(...
return
или убрать фигурные скобки.{id: '1', content: 'Some stuff'},
obj[item._id] = item
как лучше решить задачу преобразования массива в такой объект?
const arrToObj = (arr, key) => arr.reduce((acc, n) => (acc[key(n)] = n, acc), {});
const obj = arrToObj(arr, n => n.id);