get
, можно ничем его не заменять. При обработке клика вместо первого попавшегося audio
надо хватать тот, что соответствует нажатой кнопке (это же касается элементов .play
и .pause
, с той лишь разницей, что тут вы хватаете всё, что есть), т.е., который находится в том же .container
. От кликнутого элемента поднимаемся к .container
и ищем внутри него нужные элементы:$(document).on('click', '.play, .pause', function() {
const $this = $(this);
const $container = $this.closest('.container');
const isPlay = $this.hasClass('play');
$container.find('.play').toggleClass('active', isPlay);
$container.find('.pause').toggleClass('active', !isPlay);
$container.find('audio').get(0)[isPlay ? 'play' : 'pause']();
});
document.querySelector('.music-album').addEventListener('click', e => {
const { target: t, currentTarget: ct } = e;
const playButton = ct.querySelector('.play_button');
const stopButton = ct.querySelector('.stop_button');
const state =
playButton.contains(t) ? true :
stopButton.contains(t) ? false :
null;
if (state !== null) {
ct.querySelector('audio')[state ? 'play' : 'pause']();
playButton.style.display = state ? 'none' : 'block';
stopButton.style.display = state ? 'block' : 'none';
}
});
const sum = data =>
(data instanceof Array ? data : [ data ]).reduce((acc, n) => {
return acc + n.value + sum(n.children || []);
}, 0);
const valueSum = sum(valueList);
function sum(data) {
let result = 0;
for (const stack = [].concat(data); stack.length;) {
const { value, children: c } = stack.pop();
stack.push(...(Array.isArray(c) ? c : []));
result += value;
}
return result;
}
$('.wr').on('input', 'input', function() {
const
$this = $(this),
val = $this.val(),
$link = $this.closest('.item').find('.link-a');
$link.toggleClass('success', /* здесь проверяете, что val какой надо */);
});
.hidden {
display: none;
}
const searchInput = document.querySelector('#txtsearchinput');
const clearButton = document.querySelector('#deltxtinput');
clearButton.addEventListener('click', function() {
searchInput.value = '';
searchInput.dispatchEvent(new Event('input'));
});
searchInput.addEventListener('input', function() {
clearButton.classList.toggle('hidden', !this.value);
});
document.addEventListener('click', ({ target: t }) => {
if (t.classList.contains('xxx')) {
currColor.style.backgroundColor = t.nextElementSibling.textContent;
}
// или
if (t.matches('.xxx')) {
currColor.style.backgroundColor = getComputedStyle(t).backgroundColor;
}
});
const findMin = obj =>
(obj.children || []).reduce((min, n) => (
n = findMin(n),
min.value < n.value ? min : n
), obj);
const count = obj =>
(obj.children || []).reduce((acc, n) => {
const c = count(n);
acc.num += c.num;
acc.sum += c.sum;
return acc;
}, { num: 1, sum: obj.value });
const c = count(obj);
const average = c.sum / c.num;
const tower = length =>
Array.from({ length }, (n, i) => Array(2)
.fill(' '.repeat(length - i - 1))
.join('*'.repeat(i * 2 + 1))
);
const tower = length =>
Array.from({ length }, (n, i) => (
n = Array(length - i).join(' '),
n + Array(-~i << 1).join('*') + n
));
const FILTER_VALUE = 'eg';
const filteredArr = arr.reduce((acc, el) => {
const items = el.items
.filter(n => n.keywords.some(m => m.includes(FILTER_VALUE)))
.map(n => ({ ...n, keywords: [...n.keywords] }));
if (items.length) {
acc.push({ ...el, items });
}
return acc;
}, []);
const $initial = $('.some-div').clone();
$('.some-div').replaceWith($initial);
$('.some-div').replaceWith($initial.clone());
const queryIfSelector = f => x =>
f(typeof x === 'string' ? document.querySelector(x) : x);
const getTableData = queryIfSelector(table =>
Array.from(table.querySelectorAll('tbody tr'), tr =>
Object.fromEntries(Array.from(tr.querySelectorAll('td'), td => [
td.getAttribute('data-name'),
td.querySelector('input').value,
]))
)
);
// или
const getTableData = queryIfSelector(table =>
Array.prototype.flatMap.call(table.tBodies, tbody =>
Array.prototype.map.call(tbody.rows, tr =>
Array.prototype.reduce.call(tr.cells, (acc, td) => (
acc[td.dataset.name] = td.firstElementChild.value,
acc
), {})
)
)
);
// или
const getTableData = queryIfSelector(table => {
const result = [];
const numHeadRows = table.querySelectorAll('thead tr').length;
for (const input of table.querySelectorAll('tbody input')) {
const td = input.closest('td');
const i = td.parentNode.rowIndex - numHeadRows;
const item = result[i] = result[i] || {};
item[td.attributes['data-name'].value] = input.value;
}
return result;
});
const data1 = getTableData('#table1');
const data2 = getTableData(document.querySelector('#table2'));
document.querySelector('textarea').addEventListener('keydown', e => e.preventDefault());
<textarea readonly></textarea>
const text = '|||';
.$el.children().slice(1).before(text);
// или
$el.children(':nth-child(n + 2)').before(text);
// или
$el.find('> :nth-last-child(n + 2)').after(text);
Array.prototype.forEach.call(
el.children,
(n, i) => i && n.before(new Text(text))
);
// или
for (const n of el.children) {
if (n.nextElementSibling) {
n.insertAdjacentText('afterend', text);
}
}
// или
for (let i = 1; i < el.children.length; i++) {
el.insertBefore(document.createTextNode(text), el.children[i]);
}
// или
el.querySelectorAll(':scope > * + *').forEach(n => n.outerHTML = text + n.outerHTML);
const gallerySelector = '.js-product__item';
const previewSelector = '.view__item img';
const mainImageSelector = '.js-product__img--current';
const showImage = preview => preview
.closest(gallerySelector)
.querySelector(mainImageSelector)
.src = preview.src;
document.addEventListener('click', ({ target: t }) => {
if (t.matches(previewSelector)) {
showImage(t);
}
});
// или
document.querySelectorAll(previewSelector).forEach(function(n) {
n.addEventListener('click', this);
}, e => showImage(e.target));
const keys = [
[
{ on: [ 'ё', 'Ё' ], off: [ '`', '~' ], name: 'Backquote' },
{ on: [ '1', '!' ], off: [ '1', '!' ], name: 'Digit1' },
...
],
...
];
document.querySelector('.keyboard').innerHTML = keys.map(row => `
<div class="row">${row.map(n => `
<div class="key">
<span class="${n.name} on">
<span class="case down">${n.on[0]}</span>
<span class="case up">${n.on[1]}</span>
</span>
<span class="${n.name} off">
<span class="case down">${n.off[0]}</span>
<span class="case up">${n.off[1]}</span>
</span>
</div>`).join('')}
</div>`).join('');
const urls = [
'http://sitename.net/somedirectory/14545/',
'http://sitename.net/somedirectory/14545/count-1145',
'http://sitename.net/somedirectory/14545/specific-345',
'http://sitename.net/somedirectory/14545/count-1145/specific-345',
];
const getParams = (url, params) =>
params instanceof Array && params.length
? (url.match(RegExp(`(${params.join('|')})-\\d+`, 'g')) || [])
.map(n => n.split('-'))
.reduce((acc, n) => (acc[n[0]] = n[1], acc), {})
: {};
const params = urls.map(n => getParams(n, [ 'count', 'specific' ]));
const getParams = url =>
Object.fromEntries((url
.match(/[a-z]+-\d+/g) || [])
.map(n => n.split('-'))
);