let target = document.querySelector('#search');
let timerId = null;
target.oninput = function () {
let inputValue = this.value.trim();
let lastTime = performance.now();
if (timerId) {
clearTimeout(timerId);
}
timerId = setTimeout(function() {
if (performance.now() - lastTime > 1500 && inputValue) {
console.log('Send', inputValue);
}
}, 1500);
}
<img src="https://media1.giphy.com/media/10FwycrnAkpshW/giphy.gif" alt="я джифка">
document.querySelector('.custom-select-wrapper').addEventListener('click', function() {
this.querySelector('.custom-select').classList.toggle('open');
})
for (const option of document.querySelectorAll(".custom-option")) {
option.addEventListener('click', function() {
if (!this.classList.contains('selected')) {
this.parentNode.querySelector('.custom-option.selected').classList.remove('selected');
this.classList.add('selected');
this.closest('.custom-select').querySelector('.custom-select__trigger span').textContent = this.textContent;
this.parentElement.previousElementSibling.style.backgroundImage = getComputedStyle(this).backgroundImage;
}
})
}
window.addEventListener('click', function(e) {
const select = document.querySelector('.custom-select');
if (!select.contains(e.target)) {
select.classList.remove('open');
}
});
const select = document.querySelector('.custom-select');
(function() {
let input = select.firstElementChild,
text = input.querySelector('span'),
options = select.lastElementChild;
select.addEventListener('click', function(ev) {
this.classList.toggle('open');
let el = ev.target;
if (el.classList.contains('custom-option')) {
options.querySelector('.selected').classList.remove('selected');
el.classList.toggle('selected');
text.textContent = el.textContent;
input.style.backgroundImage = getComputedStyle(el).backgroundImage;
}
});
})();
window.addEventListener('click', function(e) {
if (!select.contains(e.target)) {
select.classList.remove('open');
}
});
[
{
"Mercedes": {
"E-class": {
"тут уж": "на что фантазии хватит"
},
"C-class": {
"тут уж": "на что фантазии хватит"
},
"S-class": {
"тут уж": "на что фантазии хватит"
},
}
},
{
"Porsche": {
"911": {
"тут уж": "на что фантазии хватит"
},
"928": {
"тут уж": "на что фантазии хватит"
},
"944": {
"тут уж": "на что фантазии хватит"
},
}
}
]
setTimeout(initSliders(document.querySelectorAll('.slider')[0], document.querySelectorAll('.between')[0], document.querySelectorAll('.first')[0], document.querySelectorAll('.second')[0], document.querySelectorAll('.min')[0], document.querySelectorAll('.max')[0]), 0);
setTimeout(initSliders(document.querySelectorAll('.slider')[1], document.querySelectorAll('.between')[1], document.querySelectorAll('.first')[1], document.querySelectorAll('.second')[1], document.querySelectorAll('.min')[1], document.querySelectorAll('.max')[1]), 0);
function initSliders(argSlider, argBtw, argBtn1, argBtn2, argInp1, argInp2) {
const slider = argSlider;
const between = argBtw;
const button1 = argBtn1;
const button2 = argBtn2;
const inpt1 = argInp1;
const inpt2 = argInp2;
const min = inpt1.min;
const max = inpt1.max;
/* инициализация */
const sliderCoords = getCoords(slider);
button1.style.marginLeft = '0px';
button2.style.marginLeft = (slider.offsetWidth - button1.offsetWidth) + 'px';
between.style.width = slider.offsetWidth + 'px';
inpt1.value = min;
inpt2.value = max;
/* первый вывод */
inpt1.onchange = (evt) => {
if (parseInt(inpt1.value) < min) {
inpt1.value = min;
}
if (parseInt(inpt1.value) > max) {
inpt1.value = max;
}
if (parseInt(inpt1.value) > parseInt(inpt2.value)) {
const temp = inpt1.value;
inpt1.value = inpt2.value;
inpt2.value = temp;
}
const sliderCoords = getCoords(slider);
const per1 = parseInt(inpt1.value - min) * 100 / (max - min);
const per2 = parseInt(inpt2.value - min) * 100 / (max - min);
const left1 = per1 * (slider.offsetWidth - button1.offsetWidth) / 100;
const left2 = per2 * (slider.offsetWidth - button1.offsetWidth) / 100;
button1.style.marginLeft = left1 + 'px';
button2.style.marginLeft = left2 + 'px';
if (left1 > left2) {
between.style.width = (left1 - left2 + 18) + 'px';
between.style.marginLeft = left2 + 'px';
} else {
between.style.width = (left2 - left1 + 18) + 'px';
between.style.marginLeft = left1 + 'px';
}
}
/* второй вывод */
inpt2.onchange = (evt) => {
if (parseInt(inpt2.value) < min) inpt2.value = min;
if (parseInt(inpt2.value) > max) inpt2.value = max;
if (parseInt(inpt1.value) > parseInt(inpt2.value)) {
const temp = inpt1.value;
inpt1.value = inpt2.value;
inpt2.value = temp;
}
const sliderCoords = getCoords(slider);
const per1 = parseInt(inpt1.value - min) * 100 / (max - min);
const per2 = parseInt(inpt2.value - min) * 100 / (max - min);
const left1 = per1 * (slider.offsetWidth - button1.offsetWidth) / 100;
const left2 = per2 * (slider.offsetWidth - button1.offsetWidth) / 100;
button1.style.marginLeft = left1 + 'px';
button2.style.marginLeft = left2 + 'px';
if (left1 > left2) {
between.style.width = (left1 - left2 + 18) + 'px';
between.style.marginLeft = left2 + 'px';
} else {
between.style.width = (left2 - left1 + 18) + 'px';
between.style.marginLeft = left1 + 'px';
}
}
/* события мыши */
button1.onmousedown = (evt) => {
const sliderCoords = getCoords(slider);
const betweenCoords = getCoords(between);
const buttonCoords1 = getCoords(button1);
const buttonCoords2 = getCoords(button2);
let shiftX1 = evt.pageX - buttonCoords1.left;
let shiftX2 = evt.pageX - buttonCoords2.left;
document.onmousemove = (evt) => {
let left1 = evt.pageX - shiftX1 - sliderCoords.left;
let right1 = slider.offsetWidth - button1.offsetWidth;
if (left1 < 0) {
left1 = 0;
}
if (left1 > right1) {
left1 = right1;
}
button1.style.marginLeft = left1 + 'px';
shiftX2 = evt.pageX - buttonCoords2.left;
let left2 = evt.pageX - shiftX2 - sliderCoords.left;
let right2 = slider.offsetWidth - button2.offsetWidth;
if (left2 < 0) {
left2 = 0;
}
if (left2 > right2) {
left2 = right2;
}
let per_min = 0;
let per_max = 0;
if (left1 > left2) {
between.style.width = (left1 - left2 + 18) + 'px';
between.style.marginLeft = left2 + 'px';
per_min = left2 * 100 / (slider.offsetWidth - button1.offsetWidth);
per_max = left1 * 100 / (slider.offsetWidth - button1.offsetWidth);
} else {
between.style.width = (left2 - left1 + 18) + 'px';
between.style.marginLeft = left1 + 'px';
per_min = left1 * 100 / (slider.offsetWidth - button1.offsetWidth);
per_max = left2 * 100 / (slider.offsetWidth - button1.offsetWidth);
}
inpt1.value = (parseInt(min) + Math.round((max - min) * per_min / 100));
inpt2.value = (parseInt(min) + Math.round((max - min) * per_max / 100));
};
document.onmouseup = () => document.onmousemove = document.onmouseup = null;
return false;
};
button2.onmousedown = (evt) => {
const sliderCoords = getCoords(slider);
const betweenCoords = getCoords(between);
const buttonCoords1 = getCoords(button1);
const buttonCoords2 = getCoords(button2);
let shiftX1 = evt.pageX - buttonCoords1.left;
let shiftX2 = evt.pageX - buttonCoords2.left;
document.onmousemove = (evt) => {
let left2 = evt.pageX - shiftX2 - sliderCoords.left;
let right2 = slider.offsetWidth - button2.offsetWidth;
if (left2 < 0) {
left2 = 0;
}
if (left2 > right2) {
left2 = right2;
}
button2.style.marginLeft = left2 + 'px';
shiftX1 = evt.pageX - buttonCoords1.left;
let left1 = evt.pageX - shiftX1 - sliderCoords.left;
let right1 = slider.offsetWidth - button1.offsetWidth;
if (left1 < 0) {
left1 = 0;
}
if (left1 > right1) {
left1 = right1;
}
let per_min = 0;
let per_max = 0;
if (left1 > left2) {
between.style.width = (left1 - left2 + 18) + 'px';
between.style.marginLeft = left2 + 'px';
per_min = left2 * 100 / (slider.offsetWidth - button1.offsetWidth);
per_max = left1 * 100 / (slider.offsetWidth - button1.offsetWidth);
} else {
between.style.width = (left2 - left1 + 18) + 'px';
between.style.marginLeft = left1 + 'px';
per_min = left1 * 100 / (slider.offsetWidth - button1.offsetWidth);
per_max = left2 * 100 / (slider.offsetWidth - button1.offsetWidth);
}
inpt1.value = (parseInt(min) + Math.round((max - min) * per_min / 100));
inpt2.value = (parseInt(min) + Math.round((max - min) * per_max / 100));
};
document.onmouseup = () => document.onmousemove = document.onmouseup = null;
return false;
};
/* отключение Drag’n’Drop браузера, чтобы не было конфликта */
button1.ondragstart = () => {
return false;
};
button2.ondragstart = () => {
return false;
};
}
/* Получение координат элемента */
function getCoords(elem) {
const box = elem.getBoundingClientRect();
return {
top: box.top + pageYOffset,
left: box.left + pageXOffset
};
}
position: fixed
для месяцев удалось их проявить. При дебаге видно, что месяцы находятся на своих местах, просто их не видно. На решение это, конечно, не претендует. Я бы на вашем месте сделал это без использования svg вообще. Или пробуйте без foreignObject, используя svg'шные элементы вроде text. Сафари безнадёжен) $('.main-header__info').click(function() {
$(this).toggleClass('main-header__info__active');
if ($(this).hasClass('main-header__info__active')) {
$('.news__block').css({
'display': 'none'
});
$('.main-header__mobile').css({
'display': 'block'
});
} else {
$('.news__block').css({
'display': 'block'
});
$('.main-header__mobile').css({
'display': 'none'
});
}
});
document.querySelector('.main-header__info').onclick = function() {
this.classList.toggle('main-header__info__active'); // не знаю, действительно ли вам нужен этот класс. Если нет, то можно убрать эту строку вовсе
var blockNews = document.querySelector('.news__block'),
headerMobile = document.querySelector('.main-header__mobile'); // Можно достать из этого замыкания и выбирать разово, но тогда переменные будут глобальными
blockNews.style.display = getComputedStyle(blockNews).display === 'block' ? 'none' : 'block';
headerMobile.style.display = getComputedStyle(headerMobile).display === 'none' ? 'block' : 'none';
}