return X; // тут НУЖНО ...
return new Promise(resolve => {
const img = new Image();
img.onload = () => resolve(true);
img.onerror = () => resolve(false);
img.src = 'тут ссылка на изображение';
});
document.querySelector('.menu').addEventListener('click', ({ target: t }) => {
if (t.tagName === 'A') {
const submenu = [...t.parentNode.children].find(n => n.classList.contains('sub-menu'));
if (submenu) {
submenu.classList.toggle('red');
}
}
// или
if (t.matches('a')) {
t.parentNode.querySelector(':scope > .sub-menu')?.classList.toggle('red');
}
});
for (const n of document.querySelectorAll('.menu a')) {
n.addEventListener('click', onClick);
}
function onClick() {
this.nextElementSibling?.classList.toggle('red');
}
// или
document.querySelectorAll('.sub-menu').forEach(function(n) {
n.previousElementSibling.addEventListener('click', this);
}, e => e.target.nextElementSibling.classList.toggle('red'));
data-target="#id-следующего-collapse-блока"
и data-toggle="collapse"
.Авторы вопросов не всегда помечают решения среди всех полученных ответов. Поэтому мы решили позволить сообществу самостоятельно выбирать ответы, которые решают поставленный автором вопрос. С этого дня мы добавляем пользовательское голосование за ответы. Те, у кого вклад более 10, смогут голосовать за ответ и помечать его как решение.
Если в течение недели ответ получает 3 и более голосов, он становятся решением. Автор такого ответа получает 10 очков вклада (или 1 единицу), как если бы этот ответ выбрал автор вопроса или куратор.
Object.values(arr.reduce((acc, [ id, group, ...values ]) => {
const g = (acc[id] = acc[id] ?? { id, groups: {} }).groups;
(g[group] = g[group] ?? []).push(values);
return acc;
}, {}))
const wait = delay => new Promise(r => setTimeout(r, delay));
async function asyncDelayedForEach(data, callback, delay) {
for (let i = 0; i < data.length;) {
await callback.call(data, data[i], i, data);
if (++i < data.length) {
await wait(delay);
}
}
}
const asyncDelayedForEach = (data, callback, delay) =>
Array.prototype.reduce.call(
data,
(promise, n, i, a) => promise
.then(() => callback.call(a, n, i, a))
.then(() => -~i === a.length ? void 0 : wait(delay)),
Promise.resolve()
);
@click="selectCity"
selectCity(e, { cityCode, storeId, name }) {
$event
):@click="selectCity(city)"
selectCity({ cityCode, storeId, name }) {
...
Object.values(arr.reduce((acc, [ user, ...data ]) => {
(acc[user] = acc[user] ?? { user, data: [] }).data.push(data);
return acc;
}, {}))
document.querySelector('.todo-app__list').addEventListener('click', e => {
const li = e.target.closest('.todo-app__list-item');
if (li) {
console.log(li.dataset.id);
}
});
18 элементов tbody <...> недопустимо
div внутри tbody
нужно сделать один циклом
state.products
, вы передаёте в addBasket
его name
. Исправьте вызов addBasket
; если же там всё так, как и задумано, замените прямое обращение по имени свойства (state.products[action.payload]
) на поиск нужного объекта по его name
:Object.values(state.products).find(n => n.name === action.payload)