const chunks = (arr, chunkSize) =>
arr.reduce((acc, n, i) => (
(i % chunkSize) || acc.push([]),
acc[acc.length - 1].push(n),
acc
), []);
const data = [...Array(12).keys()];
const chunkSize = 2;
const html = chunks(data, chunkSize)
.map(n => `<div>${n.map(m => `<div>${m}</div>`).join('')}</div>`)
.join('');
let index = -1;
setInterval(radios => {
radios.item(index = (index + 1) % radios.length).click();
}, 1000, document.querySelectorAll('.gallery-colors input'));
(function click(radios) {
const radio = radios[-~radios.findIndex(n => n.checked)] || radios[0];
radio.checked = true;
radio.dispatchEvent(new Event('change', { bubbles: true }));
setTimeout(click, 1000, radios);
})([...document.getElementsByName('bmw')]);
<div class="modal-content">
, например.const valueToDel = 'value1';
for (const n of Object.entries(obj)) {
if (n[1] === valueToDel) {
delete obj[n[0]];
}
}
const newObj = Object
.entries(obj)
.reduce((acc, [ k, v ]) => (v !== valueToDel && (acc[k] = v), acc), {});
// или
const newObj = Object.fromEntries(Object
.entries(obj)
.filter(n => n[1] !== valueToDel)
);
let workingLine = function() {
firstLetter = workingLine[0]
firstLetter.match( /[a-z]|[а-я]/g )
0
, которого нет, т.е., получаете undefined
, и у этого undefined
пытаетесь вызвать строковый метод..b-popup
появляется, он закрывает собой .b-block
, возникает событие mouseleave, и его надо скрывать. А как он скрылся - его надо снова показывать, потому что на .b-block
возникает событие mouseenter. Ну вот так оно по кругу и происходит.pointer-events: none
для .b-popup
. Или поместите .b-popup
внутрь .b-block
. Внутри цикла не работает setTimeout
(async () => {
const data = [ 1, 2, 3, 4, 5 ];
for (const n of data) {
console.log(n);
await new Promise(r => setTimeout(r, 1000));
}
})();
в Storage сохраняются введенные значения, а в инпут - нет
$('#text')
.val(localStorage.getItem('key') || '')
.on('input', e => localStorage.setItem('key', e.target.value));
.ranging {
display: none;
}
.ranging.opened {
display: block;
}
const buttonSelector = '.selector';
const contentSelector = '.ranging';
const activeClass = 'opened';
const toggleContent = (contents, index) =>
contents.forEach((n, i) => n.classList.toggle(activeClass, i === index));
// делегирование, назначаем обработчик клика один раз для всех кнопок
// наверное, у них есть какой-то общий предок, тогда вместо документа
// вешать обработчик следует на него:
// document.querySelector('селектор_контейнера_с_кнопками').addEventListener(...
document.addEventListener('click', e => {
const button = e.target.closest(buttonSelector);
if (button) {
const buttons = document.querySelectorAll(buttonSelector);
const index = Array.prototype.indexOf.call(buttons, button);
toggleContent(document.querySelectorAll(contentSelector), index);
}
});
// или, назначаем обработчик клика индивидуально каждой кнопке
const onClick = function(e) {
toggleContent(this, +e.currentTarget.dataset.index);
}.bind(document.querySelectorAll(contentSelector));
document.querySelectorAll(buttonSelector).forEach((n, i) => {
n.dataset.index = i;
n.addEventListener('click', onClick);
});
.tab-content__item {
display: none;
}
.tab-content__item.active {
display: list-item;
}
.tab-header__item.active {
color: red;
}
const headerSelector = '.tab-header__item';
const contentSelector = '.tab-content__item';
const activeClass = 'active';
// делегирование, обработчик клика добавляется один раз для всех хедеров;
// контент, соответствующий нажатому хедеру, определяем через равенство data-атрибутов
document.addEventListener('click', e => {
const header = e.target.closest(headerSelector);
if (header) {
const { tab } = header.dataset;
const toggle = n => n.classList[n.dataset.tab === tab ? 'toggle' : 'remove'](activeClass);
document.querySelectorAll(headerSelector).forEach(toggle);
document.querySelectorAll(contentSelector).forEach(toggle);
}
});
// или, обработчик клика добавляется каждому хедеру индивидуально;
// контент, соответствующий нажатому хедеру, определяем по равенству индексов
const headers = document.querySelectorAll(headerSelector);
const contents = document.querySelectorAll(contentSelector);
headers.forEach(n => n.addEventListener('click', onClick));
function onClick() {
const index = Array.prototype.indexOf.call(headers, this);
const toggle = (n, i) => n.classList[i === index ? 'toggle' : 'remove'](activeClass);
headers.forEach(toggle);
contents.forEach(toggle);
}
i * 4000
на (i * 2 + 1) * 1000
- чтобы таймауты не совпадали <input id="min" type="number" value="25"> -
<input id="max" type="number" value="75">
<div id="range"></div>
const values = {
min: 0,
max: 100,
};
const range = $('#range').ionRangeSlider({
type: 'double',
grid: true,
...values,
onChange(e) {
$('#min').val(e.from);
$('#max').val(e.to);
},
}).data('ionRangeSlider');
$('#min, #max').attr(values).on('input', function() {
const v = [ $('#min').val(), $('#max').val() ]
.sort((a, b) => a - b)
.map(n => Math.max(values.min, Math.min(values.max, +n)));
$('#min').val(v[0]);
$('#max').val(v[1]);
range.update({
from: v[0],
to: v[1],
});
}).trigger('input');
<input id="min" type="number" value="25"> -
<input id="max" type="number" value="75">
<div id="range"></div>
const values = {
min: 0,
max: 100,
};
$('#range').slider({
range: true,
...values,
slide(e, ui) {
$('#min').val(ui.values[0]);
$('#max').val(ui.values[1]);
},
});
$('#min, #max').attr(values).on('input', function() {
const v = [ $('#min').val(), $('#max').val() ]
.sort((a, b) => a - b)
.map(n => Math.max(values.min, Math.min(values.max, +n)));
$('#min').val(v[0]);
$('#max').val(v[1]);
$('#range').slider('values', v);
}).trigger('input');
const reg = new RegExp(`(.+).{${symbolsForHide}}$`);
$('.phone_number')
.attr('data-phone', function() {
return $(this).text()
})
.text((i, text) => text.replace(reg , '$1...'));
const
$this = $(this),
$phone = $this.siblings('.phone_number'),
phone = $phone.data('phone');
$phone.text(phone).attr('href', `tel: ${phone}`);
$this.remove();
const key = 'prop';
const val = 1;
const result = array.flatMap(n => n.filter(m => m[key] === val));
// или
const result = array.reduce((acc, n) => (
n.forEach(m => m[key] === val && acc.push(m)),
acc
), []);
// или
const result = [];
for (const n of [].concat(...array)) {
if (n[key] === val) {
result[result.length] = n;
}
}