<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);
});
}
Если выводить в консоль то коллекции не чем не отличаются.
HTMLCollection
, хранящая элементы DOM, является динамической. При изменении документа она моментально отражает все произведённые изменения.
foreach ($array as [ 'id' => $id, 'taste' => $taste ]) {
$result[$id][$taste] = 1 + ($result[$id][$taste] ?? 0);
}
$('.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 chunked = (arr, chunkSize) =>
Array.from(
{ length: Math.ceil(arr.length / chunkSize) },
(n, i) => arr.slice(i * chunkSize, (i + 1) * chunkSize)
);
const arr = chunked(Object.entries(obj), 10).map(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))