const result = Array.prototype.flatMap.call(
document.forms,
function(form) {
return form.className.match(this) ?? [];
},
/(?<=(^| )js-)[a-z-]*(?=-form( |$))/g
);
const result = [];
const reg = /^js-([a-z-]*)-form$/;
for (const form of document.querySelectorAll('form')) {
for (const cls of form.classList) {
const name = reg.exec(cls)?.[1];
if (name != null) {
result.push(name);
}
}
}
$('#cityFilter').on('input', function() {
const value = this.value.toLowerCase();
$('#city-list .city')
.hide()
.filter((i, n) => $(n).text().toLowerCase().includes(value))
.show();
$('#city-list .state')
.hide()
.filter((i, n) => $(n).nextUntil('.state').is(':visible'))
.show();
});
document.querySelector('#cityFilter').addEventListener('input', e => {
const value = e.target.value.toLowerCase();
document.querySelectorAll('#city-list li').forEach(function(n) {
if (n.matches('.state')) {
this.splice(0, 2, n, true);
} else {
const hide = n.textContent.toLowerCase().indexOf(value) === -1;
this[1] &&= hide;
n.classList.toggle('hidden', hide);
if (!n.nextElementSibling?.matches('.city')) {
this[0].classList.toggle('hidden', this[1]);
}
}
}, [ null, true ]);
});
document.querySelectorAll('.col').forEach(n => {
n.querySelectorAll('a').forEach((m, i) => m.classList.toggle('d-none', !!i));
});
document.querySelectorAll('.col a').forEach(n => {
n.classList.toggle('d-none', !!n.previousElementSibling);
});
methods: {
setDeleteTimeout(message) {
message.timeout = setTimeout(this.удалитьСообщение, 5000, message);
},
delDeleteTimeout(message) {
clearTimeout(message.timeout);
message.timeout = null;
},
...
<div
v-for="n in messages"
@mouseenter="delDeleteTimeout(n)"
@mouseleave="setDeleteTimeout(n)"
...
const filterSelector = '.js-filter';
const itemSelector = '.dfth__item';
const checkboxSelector = '.dfth__check:checked';
const labelSelector = '.dfth__label';
const resetSelector = '.dfth__reset';
const selectedSelector = '.js-type-result';
const defaultValue = 'ничего не выбрано';
const $filter = $(filterSelector).change(function() {
const selected = $(checkboxSelector, this)
.closest(itemSelector)
.find(labelSelector)
.get()
.map(n => $(n).text())
.join(', ');
$(selectedSelector, this).text(selected || defaultValue);
});
$filter.find(resetSelector).click(() => {
$filter.find(checkboxSelector).prop('checked', false);
$filter.trigger('change');
});
const filter = document.querySelector(filterSelector);
filter.addEventListener('change', ({ currentTarget: ct }) => {
const selected = Array
.from(
ct.querySelectorAll(checkboxSelector),
n => n.closest(itemSelector).querySelector(labelSelector).textContent)
.join(', ');
ct.querySelector(selectedSelector).textContent = selected || defaultValue;
});
filter.querySelector(resetSelector).addEventListener('click', () => {
filter.querySelectorAll(checkboxSelector).forEach(n => n.checked = false);
filter.dispatchEvent(new Event('change'));
});
const hasDuplicates = map.size > new Set(Array.from(map, n => n[1].id)).size;
const duplicates = Array
.from([...map].reduce((acc, [ , { id } ]) => acc.set(id, acc.has(id)), new Map))
.reduce((acc, n) => (n[1] && acc.push(n[0]), acc), []);
const count = Array
.from(map.values())
.reduce((acc, { id }) => acc.set(id, -~acc.get(id)), new Map);
если я ставлю параметр :interval="100", то у меня появляется черная полоса под слайдером и все начинает очень лагать
methods: {
marks: v => !(v % 20000),
...
<vue-slider
:marks="marks"
...
const containerSelector = '.block-btn';
const itemSelector = `${containerSelector} [data-cost]`;
const activeClass = 'active';
const onClick = ({ currentTarget: t }) => t
.closest(containerSelector)
.querySelectorAll(itemSelector)
.forEach(n => n.classList.toggle(activeClass, n === t));
document.querySelectorAll(itemSelector).forEach(n => {
n.addEventListener('click', onClick);
});
for (const n of document.querySelectorAll(containerSelector)) {
n.addEventListener('click', onClick);
}
function onClick(e) {
const item = e.target.closest(itemSelector);
if (item) {
this.querySelector(`.${activeClass}`)?.classList.remove(activeClass);
item.classList.add(activeClass);
}
}
document.addEventListener('click', ({ target: t }) => t
.closest(itemSelector)
?.closest(containerSelector)
.querySelectorAll(itemSelector)
.forEach(n => n.classList.toggle(activeClass, n.contains(t)))
);
const [ items, setItems ] = useState([
{ id: ..., text: '...', active: false },
{ id: ..., text: '...', active: false },
...
]);
const reset = () => setItems(items.map(n => ({ ...n, active: false })));
<button onClick={reset}>reset</button>
const toggle = id => setItems(items.map(n => n.id === id ? { ...n, active: !n.active } : n));
{items.map(n => <Text key={n.id} {...n} toggle={toggle} />)}
const Text = ({ id, text, active, toggle }) => (
<p
className={active ? 'active' : ''}
onClick={() => toggle(id)}
>
{text}
</p>
);
Понимаю, что это как-то связано с преждевременным размонтированием компонента перед завершением api запроса.
<apexchart
ref="chart"
...
mounted() {
this.$nextTick(() => {
this.$refs.chart.hideSeries('здесь имя набора данных, который не хотите показывать');
});
},