<gmap-map
ref="map"
v-bind="options"
@click="onMapClick"
>
<gmap-marker
v-for="m in markers"
:key="m.id"
:position="m.position"
:clickable="true"
:draggable="true"
@click="onMarkerClick"
/>
</gmap-map>data: () => ({
options: {
center: { lat: 45.101637, lng: 38.986345 },
zoom: 15,
},
markers: [],
}),
methods: {
onMapClick(e) {
this.markers.push({
id: 1 + Math.max(0, ...this.markers.map(n => n.id)),
position: e.latLng,
});
},
onMarkerClick(e) {
this.$refs.map.panTo(e.latLng);
// или
// this.options.center = e.latLng;
},
},
.hover {
opacity: 0.5;
}const map = document.querySelector('.map svg');
map.addEventListener('mouseover', onHover);
map.addEventListener('mouseout', onHover);
function onHover({ target: t }) {
this.querySelectorAll('.hover-effect').forEach(n => {
n.classList.toggle('hover', n !== t && this !== t);
});
}.map:hover .hover-effect {
opacity: 0.5;
}
.map:hover .hover-effect:hover {
opacity: 1;
}
Если выводить в консоль то коллекции не чем не отличаются.
HTMLCollection, хранящая элементы DOM, является динамической. При изменении документа она моментально отражает все произведённые изменения.// вариант раз - меняем направление обхода, от конца к началу:
for (let i = elements.length; i--;) {
elements.item(i).replaceWith();
}
// вариант два - удаляем нулевой элемент коллекции, пока он существует:
for (let n; n = elements[0]; n.remove()) ;
foreach ($array as [ 'id' => $id, 'taste' => $taste ]) {
$result[$id][$taste] = 1 + ($result[$id][$taste] ?? 0);
}
const keys = [ 'a', 'd', 'e', 'f' ];.const obj1 = {};
const obj2 = {};
for (const k in obj) {
if (obj.hasOwnProperty(k)) {
(keys.indexOf(k) > -1 ? obj2 : obj1)[k] = obj[k];
}
}const partition = (data, f) =>
Array.prototype.reduce.call(
data,
(acc, n, i, a) => (
acc[+!!f(n, i, a)].push(n),
acc
),
[ [], [] ]
);
const [ obj1, obj2 ] = partition(
Object.entries(obj),
n => keys.includes(n[0])
).map(Object.fromEntries);
$('.scheme-wrap polygon').click(function() {
$(`.scheme-wrap__item[data-id="${this.dataset.id}"] .scheme-wrap__popup`).show();
});.scheme-wrap__popup.visible {
display: block;
}document.querySelectorAll('.scheme-wrap polygon').forEach(n => {
n.addEventListener('click', onClick);
});
function onClick({ currentTarget: { dataset: { id } } }) {
const selector = `.scheme-wrap__item[data-id="${id}"] .scheme-wrap__popup`;
const popup = document.querySelector(selector);
if (popup) {
popup.classList.add('visible');
}
}
const groupedUsers = users && users.reduce((acc, n) => {
acc[new Date(n.dob).getMonth()].users.push(n);
return acc;
}, [...Array(12)].map((n, i) => ({
month: new Date(0, i).toLocaleString('ru-RU', { month: 'long' }),
users: [],
})));{groupedUsers && groupedUsers.map(n => (
<div key={n.month}>
<h2>{n.month}</h2>
{n.users.map(user => (
<div key={user.id}>
<h3>user #{user.id}</h3>
<div>данные пользователя...</div>
</div>
))}
</div>
))}
document.addEventListener('click', function(e) {
if (e.target.classList.contains('sbros')) {
for (let el = e.target; el = el.previousElementSibling;) {
if (el.classList.contains('fields')) {
el.value = el.getAttribute('default-value');
break;
}
}
}
});document.addEventListener('click', ({ target: t }) => {
if (t.matches('.sbros')) {
const el = t.closest('здесь селектор обёртки').querySelector('.fields');
el.value = el.getAttribute('default-value');
}
});const inputs = document.querySelectorAll('.fields');
const buttons = [...document.querySelectorAll('.sbros')];
buttons.forEach(n => n.addEventListener('click', onClick));
function onClick(e) {
const el = inputs[buttons.indexOf(e.target)];
el.value = el.getAttribute('default-value');
}
const chunkSize = 10;.const arr = [];
let i = -1;
for (const k in obj) {
const j = (++i / chunkSize) | 0;
(arr[j] = arr[j] || {})[k] = obj[k];
}const chunked = (data, chunkSize) =>
Array.from(
{ length: Math.ceil(data.length / chunkSize) },
(n, i) => data.slice(i * chunkSize, (i + 1) * chunkSize)
);
const arr = chunked(Object.keys(obj), chunkSize).map(n => {
return n.reduce((acc, k) => (acc[k] = obj[k], acc), {});
});function* chunked(data, chunkSize) {
const iter = data[Symbol.iterator]();
for (let chunk = [], n = {}; !n.done && (n = iter.next());) {
if ((n.done && chunk.length) || (!n.done && chunk.push(n.value) === chunkSize)) {
yield chunk;
chunk = [];
}
}
}
const arr = Array.from(chunked(Object.entries(obj), chunkSize), Object.fromEntries);
v-model свойства checked элементов products. Отключить чекбокс - свойства disabled у вас уже есть, просто привяжите их значения к чекбоксам.<input
type="checkbox"
v-model="product.checked"
:disabled="product.disabled"
>computed: {
totalPrice() {
return this.products.reduce((acc, n) => acc + n.checked * n.price, 0);
},
},
event.target.tagName != 'button'В XML (и XML-подобных языках) возвращаемое значение будет в нижнем регистре, а в HTML - в верхнем.
event.target.classList.contains('remove-button')
// или
event.target.matches('.remove-button')
$('.show').click(function() {
$(this).hide().next('.var').slideDown().find('.hide').show();
});
$('.hide').click(function() {
$(this).hide().closest('.var').slideUp().prev('.show').show();
});
rating = Math.max(1, Math.ceil((e.clientX - горизонтальнаяКоординатаЭлемента) / ширинаЭлемента * 5))