const elems = document.querySelectorAll('.hint');
// или
const elems = document.getElementsByClassName('hint');
const getText = el => el.innerText;
// или
const getText = el => el.textContent;
// или
const getText = el => el.firstChild.nodeValue;
const hints = Array.from(elems, getText);
// или
const hints = Array.prototype.map.call(elems, getText);
// или
const hints = [];
for (const n of elems) {
hints.push(getText(n));
}
// или
const hints = [];
for (let i = 0; i < elems.length; i++) {
hints[i] = getText(elems[i]);
}
// или
const hints = (function get(i, n = elems.item(i)) {
return n ? [ getText(n), ...get(i + 1) ] : [];
})(0);
const filterSelector = '.s-mobile-filter-type-select';
const selectSelector = '.s-mobile-filter-type-select__select';
const selectedSelector = '.s-mobile-filter-type-select__selected-options-list-content';
$(selectSelector).on('change', function() {
$(this)
.closest(filterSelector)
.find(selectedSelector)
.text($('option:selected', this).get().map(n => $(n).text()).join(', '));
});
const updateSelected = select => select
.closest(filterSelector)
.querySelector(selectedSelector)
.textContent = Array
.from(select.selectedOptions, n => n.text)
.join(', ');
// можно назначить обработчик события каждому select'у индивидуально
document.querySelectorAll(selectSelector).forEach(function(n) {
n.addEventListener('change', this);
}, e => updateSelected(e.target));
// или, применяем делегирование
document.addEventListener('change', ({ target: t }) => {
if (t.matches(selectSelector)) {
updateSelected(t);
}
});
const uniqueWithSum = (arr, idKey, sumKey) =>
Object.values(arr.reduce((acc, n) => {
const id = n[idKey];
acc[id] = acc[id] || Object.assign(new n.constructor, n, { [sumKey]: 0 });
acc[id][sumKey] += n[sumKey];
return acc;
}, {}));
// ваш случай
const result = uniqueWithSum(arr, 'id', 'duration');
// элементам не обязательно быть объектами, это могут быть и массивы
uniqueWithSum([
[ 'A', 1 ],
[ 'B', 5 ],
[ 'A', 2 ],
[ 'A', 3 ],
], 0, 1) // [ [ 'A', 6 ], [ 'B', 5 ] ]
this.map.closePopup()
.А если открыты несколько попапов разных маркеров? <...> как можно открыть необходимый попап маркера (без нажатия на сам маркер конечно)
function randomArray(length, min, max) {
max = max || 0;
if (max < min) {
[ min, max ] = [ max, min ];
}
return Array.from(
{ length },
() => min + (Math.random() * (max - min + 1) | 0)
);
}
// создаём массив из 10 элементов, значения принадлежат интервалу [ 5, 25 ]
const arr1 = randomArray(10, 5, 25);
// аналогично - минимум и максимум можно указывать в любом порядке
const arr2 = randomArray(10, 25, 5);
// значения принадлежат интервалу [ 0, 25 ]
const arr3 = randomArray(10, 25);
// значения принадлежат интервалу [ -7, 0 ]
const arr4 = randomArray(10, -7);
const capitalize = str => str.replace(/(^|\s|-)+\S/g, m => m.toUpperCase());
$input.on('input', function() {
this.value = Math.min(MAX_VALUE, Math.max(MIN_VALUE, this.value));
});
<button @click="onClick(product)">click me</button>
methods: {
onClick(item) {
console.log(item.title);
},
},
document.addEventListener('keydown', e => {
if (e.key === 'Escape') {
const popups = document.querySelectorAll('#popupClient, #popupPartner');
popups.forEach(n => n.classList.remove('popup--open'));
}
});
const chainScripts = src =>
src.reduce((acc, n) => {
return acc.then(() => new Promise((resolve, reject) => {
const s = document.createElement('script');
s.onload = resolve;
s.onerror = reject;
s.src = n;
document.head.appendChild(s);
}));
}, Promise.resolve());
const inputs = new DOMParser()
.parseFromString(str, 'text/html')
.querySelectorAll('input');
// или
const { elements: inputs } = document
.createRange()
.createContextualFragment(str)
.querySelector('form');
// или
const inputs =
(el => (el.innerHTML = str, el.getElementsByTagName('input')))
(document.createElement('div'));
const getName = el => el.name;
// или
const getName = el => el.getAttribute('name');
// или
const getName = el => el.attributes.name.value;
const names = Array.from(inputs, getName);
// или
const names = Array.prototype.map.call(inputs, getName);
// или
const names = [];
for (const n of inputs) {
names.push(getName(n));
}
// или
const names = [];
for (let i = 0; i < inputs.length; i++) {
names[i] = getName(inputs[i]);
}
// или
const names = (function get(i, n = inputs.item(i)) {
return n ? [ getName(n), ...get(i + 1) ] : [];
})(0);
- e.originalEvent.target.getAttribute('data-id')
+ e.originalEvent.target.closest('[data-id]').dataset.id
Это верстка шаблона маркера 2гис, отдельно навешивать на нее обработчики нельзя
DG.divIcon
? Да, туда нельзя. А на сам маркер - можно:const marker = DG.marker(...
marker.on('click', onMarkerClick);
function onMarkerClick(e) {
// ...
}
Я вообще сделал это чтобы как то понять на какой маркер кликнули
target
.this.markers
- это DG.featureGroup
. Оставляете общий обработчик клика, смотрите у события свойство eventTargets
, это массив, внутри будет кликнутый маркер. this.message = this.rules.map(n => n(this.input)).find(n => n !== true);