async function fetchRecursive(arr) {
const result = [];
if (Array.isArray(arr)) {
for (const n of arr) {
try {
result.push({ status: true, result: await fetch(n.url).then(r => r.json()) });
} catch(error) {
result.push({ status: false, error });
}
result.push(...await fetchRecursive(n.children));
}
}
return result;
}
const flat = arr => (arr || []).flatMap(n => [ n.url, ...flat(n.children) ]);
const fetchRecursive = arr => Promise.allSettled(flat(arr).map(n => fetch(n).then(r => r.json())));
<div class="comment" data-id="187">
<a class="comment-edit">Редактировать</a>
<span class="comment-panel"></span>
</div>
.comment .comment-panel {
display: none;
}
.comment.editing .comment-panel {
display: inline;
}
.comment.editing .comment-edit {
color: red;
}
const containerSelector = '.comment';
const buttonSelector = '.comment-edit';
const activeClass = 'editing';
// вот вам ваш jquery
$(containerSelector).on('click', buttonSelector, e => {
const id = $(e.delegateTarget).toggleClass(activeClass).data('id');
console.log(id);
});
// или, к чёрту jquery
document
.querySelectorAll(`${containerSelector} ${buttonSelector}`)
.forEach(n => n.addEventListener('click', onClick));
function onClick() {
const container = this.closest(containerSelector);
container.classList.toggle(activeClass);
const { id } = container.dataset;
console.log(id);
}
document.querySelectorAll('.class-1').forEach(n => {
n.insertAdjacentHTML('afterbegin', `<div>${n.querySelector('span').dataset.name}</div>`);
});
$('.class-1').prepend(function() {
return $('<div>').text($('span', this).data('name'));
});
const onPlacemarkClick = e => {
const placemarkData = e.get('target').properties.get('placemarkData');
...
};
<Placemark
onClick={onPlacemarkClick}
properties={{
placemarkData: {
city: point.City,
address: point.Address,
...
},
...
}}
...
/>
<div class="icon"></div>
.icon {
font-size: 60px;
display: inline-block;
border: 0.1em solid black;
border-radius: 0.5em;
width: 1em;
height: 2em;
position: relative;
}
.icon::before {
content: "";
display: inline-block;
position: absolute;
width: 0.2em;
height: 0.2em;
background: black;
left: 50%;
top: 30%;
transform: translateX(-50%);
box-shadow: 0 -0.4em black, 0 0.4em black;
}
.icon::after {
content: "";
display: inline-block;
border: 0.15em solid black;
border-left: 0;
border-top: 0;
width: 0.4em;
height: 0.4em;
position: absolute;
top: 60%;
left: 50%;
transform: translateX(-50%) rotate(45deg);
}
function codeAddress(address, geocoder, map) {
geocoder.geocode({ address }, function(results, status) {
if (status === 'OK') {
new google.maps.Marker({
map: map,
position: results[0].geometry.location,
});
} else {
alert('Geocode was not successful for the following reason: ' + status);
}
});
}
address.forEach(n => codeAddress(n, geocoder, map));
как установить страницу пагинации (к примеру 2-ую или 3-ю)
data: () => ({
page: 1,
...
}),
<v-data-table
:page.sync="page"
...
как установить обработчик на клик по стрелке вперед
watch: {
page(val) {
...
},
},
const elements = document.querySelectorAll('li > ul');
const tag = 'span';
const text = 'hello, world!!';
elements.forEach(n => {
n.before(document.createElement(tag));
n.previousSibling.textContent = text;
});
for (const n of elements) {
const el = document.createElement(tag);
el.innerText = text;
n.parentNode.insertBefore(el, n);
}
for (let i = 0; i < elements.length; i++) {
elements[i].insertAdjacentHTML('beforebegin', `<${tag}>${text}</${tag}>`);
}
(function insert(i, n = elements[i]) {
if (n) {
const el = document.createElement(tag);
el.appendChild(new Text(text));
n.insertAdjacentElement('beforebegin', el);
insert(-~i);
}
})(0);
$('.list-item').filter((i, n) => $(n).data('pagereview') !== $(n).data('pageslug')).hide();
$('[data-pageslug]').each(function() {
const $this = $(this);
$this.toggle($this.attr('data-pagereview') === $this.attr('data-pageslug'));
});
document.querySelectorAll('.list-item').forEach(n => {
n.hidden = n.getAttribute('data-pagereview') !== n.getAttribute('data-pageslug');
});
for (const { style, dataset } of document.getElementsByClassName('list-item')) {
if (dataset.pagereview !== dataset.pageslug) {
style.display = 'none';
}
}
.hidden {
display: none;
}
const items = document.querySelectorAll('[data-pageslug]');
for (let i = 0; i < items.length; i++) {
const { classList: c, attributes: a } = items[i];
c.toggle('hidden', a['data-pagereview'].value !== a['data-pageslug'].value);
}
:options="{ scrollWheelZoom: false }"
@update:zoom="zoom = $event"
@wheel.native="onWheel"
methods: {
onWheel(e) {
if (e.deltaY < 0) {
this.zoom++;
e.preventDefault();
}
},
},