const keyboard = [
'abcde123',
'fghij456',
'klmno789',
'pqrst.@0',
'uvwxyz_/',
].reduce((acc, [...row], iRow) => {
row.forEach((key, iCol) => acc[key] = [ iRow, iCol ]);
return acc;
}, {});
function tvRemote(word) {
let steps = word.length;
let prev = [ 0, 0 ];
for (const n of word) {
const curr = keyboard[n];
steps += Math.abs(prev[0] - curr[0]) + Math.abs(prev[1] - curr[1]);
prev = curr;
}
return steps;
}
.close
- наоборот, закрыть.const modal = document.querySelector('.modal');
const close = modal.querySelector('.close');
document.addEventListener('click', function(e) {
if (e.target === modal || e.target === close) {
modal.style.display = 'none';
}
if (e.target.tagName === 'BUTTON') {
modal.style.display = 'block';
}
});
let count = null;
while (1) {
count = prompt('Введите количество колонок для таблицы умножения') | 0;
if (count > 0) {
break;
}
alert('Введите корректное число');
}
lat + x != 11
lon + y != 11
const itemSelector = '.item';
const activeClass = 'active';
const maxActive = 3;
const onMaxActiveClick = () => alert(`больше ${maxActive} нельзя`);
// делегирование, назначаем обработчик клика один раз для всех элементов
document.addEventListener('click', function(e) {
const item = e.target.closest(itemSelector);
if (item) {
const active = document.querySelectorAll(`${itemSelector}.${activeClass}`);
if (active.length < maxActive || item.classList.contains(activeClass)) {
item.classList.toggle(activeClass);
} else {
onMaxActiveClick();
}
}
});
// или, назначаем обработчик клика каждому элементу индивидуально
let activeCount = 0;
for (const n of document.querySelectorAll(itemSelector)) {
n.addEventListener('click', onClick);
activeCount += n.classList.contains(activeClass);
}
function onClick({ currentTarget: item }) {
if (activeCount < maxActive || item.classList.contains(activeClass)) {
activeCount += item.classList.toggle(activeClass) ? 1 : -1;
} else {
onMaxActiveClick();
}
}
const getCheckedValues = elements =>
[...elements].reduce((acc, n) => (
n.checked && (acc[n.name] = acc[n.name] || []).push(n.value),
acc
), {});
const getCheckedValues = elements =>
Array.prototype.reduce.call(
elements,
(acc, { name, value, checked }) => (
acc[name] = acc[name] || [],
checked && acc[name].push(value),
acc
),
{}
);
Получается, что объявляем две переменных <...> То есть это равносильно
Что не так делаю?
let uploadTo = null;
$('.file-upload-preview').click(function() {
uploadTo = this;
$('#file-upload').click();
});
$(".file-upload-preview")
на $(uploadTo)
. const inputSelector = '.hidden_field';
const itemSelector = '.item';
const activeClass = 'active';
// как это может выглядеть с использованием jquery
const $items = $(itemSelector).click(function() {
$(this).toggleClass(activeClass);
$(inputSelector).val($items
.filter(`.${activeClass}`)
.get()
.map(n => $(n).text())
.join(', ')
);
});
// или, к чёрту jquery
const items = [...document.querySelectorAll(itemSelector)];
items.forEach(n => n.addEventListener('click', onClick));
function onClick() {
this.classList.toggle(activeClass);
document.querySelector(inputSelector).value = items
.filter(n => n.classList.contains(activeClass))
.map(n => n.innerText)
.join(', ');
}
const result = Object.entries(commonObj).map(([ k, v ]) => ({
objDataName: (objectData.find(n => n.key === k) || {}).name || null,
packageName: (packageData.find(n => n.id === v.package_id) || {}).title || null,
}));
const arrToObj = (arr, key, val) =>
arr.reduce((acc, n) => (acc[n[key]] = n[val], acc), {});
const objects = arrToObj(objectData, 'key', 'name');
const packages = arrToObj(packageData, 'id', 'title');
const result = Object.entries(commonObj).map(n => ({
objDataName: objects[n[0]] || null,
packageName: packages[n[1].package_id] || null,
}));
for (let i = 0; i < 6; i++) {
const count = res.data.filter(n => +n.categoryid === i).length;
$(`#category_count_${i}`).html(`(${count})`);
}
checked
не приводит к возникновению события change
, так что его следует создавать самостоятельно - добавьте .trigger('change')
после вызова prop
.