$('form').on('input', function() {
$('.button').prop('disabled', $('input', this).get().some(n => !n.value));
}).trigger('input');
// или
const form = document.querySelector('form');
const button = document.querySelector('.button');
const inputs = [...form.querySelectorAll('input')];
form.addEventListener('input', () => button.disabled = !inputs.every(n => n.value));
form.dispatchEvent(new Event('input'));
methods: {
marked: (text, search) => search
? text.replace(RegExp(search.replace(/[\\^$|.*?+{}()[\]]/g, '\\$&'), 'gi'), '<mark>$&</mark>')
: text,
},
<div v-html="marked(text, search)"></div>
:asNavFor="$refs.miniPreview"
$refs
заполняются только после того, как компонент был отрисован, и они не реактивны. Это подразумевается только как обходной путь для прямого манипулирования потомками — вам следует избегать доступа к$refs
из шаблонов или вычисляемых свойств.
mounted() {
this.$nextTick(this.$forceUpdate);
},
пытаюсь пройти по списку объекта, но он почему то пустой
print(prime_number_iterator.prime_numbers)
после цикла - увидите, что значения на месте. Вы их из __next__
должны возвращать - добавьте return number
после self.prime_numbers.append(number)
. function makeRandomizer([ min, max ]) {
const numbers = [...Array(max - min + 1).keys()];
return () => numbers.length
? min + numbers.splice(Math.random() * numbers.length | 0, 1)[0]
: null;
}
function makeRandomizer([ min, max ]) {
const numbers = Array.from({ length: max - min + 1 }, (n, i) => min + i);
for (let i = numbers.length; --i > 0;) {
const j = Math.random() * (i + 1) | 0;
[ numbers[i], numbers[j] ] = [ numbers[j], numbers[i] ];
}
return () => numbers.pop() ?? null;
}
// Вот так не работает почему-то: // this.GET_HERITAGEOBJECTS_FROM_DB()
this.dispatch('GET_HERITAGEOBJECTS_FROM_DB');
// Vue ругается: error Unreachable code no-unreachable
$('#sel1').change(function() {
const min = +$(this).val();
$('#sel2')
.val((i, v) => Math.max(v, min))
.children()
.show()
.filter((i, n) => +n.value < min)
.hide();
}).change();
const select1 = document.querySelector('#sel1');
const select2 = document.querySelector('#sel2');
select1.addEventListener('change', e => {
const min = +e.target.value;
select2.value = Math.max(select2.value, min);
for (const n of select2.children) {
n.hidden = +n.value < min;
}
});
select1.dispatchEvent(new Event('change'));
filterInput.addEventListener('keyup',...
пусть будетfilterInput.addEventListener('input', function() {
const value = this.value.toLowerCase();
filterResult.innerHTML = resultArr
.filter(n => n.toLowerCase().includes(value))
.map(n => `<li>${n}</li>`)
.join('');
});
filterInput.addEventListener('input', e => {
const value = e.target.value.toLowerCase();
filterResult.replaceChildren(...resultArr.reduce((acc, n) => {
if (n.toLowerCase().indexOf(value) !== -1) {
(acc[acc.length] = document.createElement('li')).textContent = n;
}
return acc;
}, []));
});
<v-treeview>
<template #label>
<v-text-field />
</template>
</v-treeview>
arr1.filter(n => arr2.includes(n)).length !== 0
// или
arr1.some(Set.prototype.has.bind(new Set(arr2)))
// или
new Set(arr1).size + new Set(arr2).size > new Set([ ...arr1, ...arr2 ]).size
function intersection(data1, data2, key = n => n) {
const getKey = key instanceof Function ? key : n => n[key];
const keys = new Set(Array.from(data2, getKey));
const result = [];
for (const n of data1) {
if (keys.has(getKey(n))) {
result.push(n);
}
}
return result;
}
// как применять в вашем случае
!!intersection(arr1, arr2).length
// другие примеры использования
intersection(Array(5).keys(), Array(3).keys()) // [0, 1, 2]
intersection('abcDe', 'cd', n => n.toLowerCase()) // ['c', 'D']
intersection([{id: 1}, {id: 2}, {id: 3}], [{id: 2}, {id: 4}], 'id') // [{id: 2}]
methods: {
selectDaysRange(days) {
this.selected = [
moment(this.now).subtract(days, 'days').format('YYYY-MM-DD'),
this.startDate,
];
},
},
value=""
. Соответственно, проверять надо будет value на пустоту, а не равенство тексту. Это и проще, и код не придётся переписывать, если вдруг завтра вам потребуется изменить текст по умолчанию..element
), а не каждому элементу индивидуально. Не придётся вписывать новый обработчик или удалять существующий, если изменится количество элементов в форме.button.disabled = ![
inputMail.value,
inputPhone.value,
select.value,
checkbox.checked,
].every(Boolean);
str.match(/(?<=\{{2}).*?(?=\}{2})/g) ?? []
// или
Array.from(str.matchAll(/\{\{(.*?)\}\}/g), n => n[1])
Читаю документацию, не могу найти
<vue-slick ref="slider">
...
</vue-slick>
<button @click="$refs.slider.goTo(4)">перейти к четвёртому слайду</button>
<button @click="$refs.slider.goTo(7, true)">перейти к седьмому слайду, без анимации</button>