const scroll = new HorizontalScroll('#scrollContainer1', {
scrollStep: 400, // шаг в пикселях
scrollBehavior: 'smooth' // плавная прокрутка
});
class HorizontalScroll {
constructor(container, options = {}) {
this.container = typeof container === 'string'
? document.querySelector(container)
: container;
this.options = {
scrollStep: 300,
scrollBehavior: 'smooth',
...options
};
this.content = this.container.querySelector('.scroll-content'); // если нужно, чтобы вы передавали классы, можно сделать в виде опшинов и объект со значением.
this.leftArrow = this.container.querySelector('.scroll-arrow.left');
this.rightArrow = this.container.querySelector('.scroll-arrow.right');
this.isInViewport = false; //переменная, которая как раз смотрит и говорит, есть ли скроллы в зоне видимости или нет
this.observer = null; // обсервер, если вам нужен
this.init();
}
init() {
// Инициализация Intersection Observer
this.initObserver(); // метод, логику думаю можно описать
// Обновление состояния стрелок
this.updateArrows();
// Обработка изменения размера окна
window.addEventListener('resize', () => this.updateArrows());
// Обработка скролла контента
this.content.addEventListener('scroll', () => this.updateArrows());
}
}
} // В дочернем компоненте - передаем все файлы сразу
attachThumbnail: function (e, curObj) {
e.target.closest('.area-upload').classList.remove('drag-file');
e.target.closest('.area-upload').style.display = 'flex';
let files = e.target.files || e.dataTransfer.files;
let allowFiles = this.validateFiles(e, files, curObj);
this.$emit('attachThumbnail', curObj, Array.from(allowFiles));
},
// В родительском компоненте - обрабатываем последовательно
async attachThumbnail(curObj, files) {
let index = this.formData.materialFiles.findIndex(item => item.lang === curObj.lang);
for (let i = 0; i < files.length; i++) {
let file = files[i];
let filePosition = this.formData.materialFiles[index].files.restFiles.length;
console.log('Array length ' + filePosition);
try {
const response = await this.uploadFile(curObj, file, 'rest', filePosition);
const data = await response.json();
console.log('append file');
this.formData.materialFiles[index].files.restFiles.push({
name: data.fileName,
id: data.id
});
} catch (error) {
console.log(error);
}
}
}Пример определения
function getMousePosition(evt) {
const CTM = svg.getScreenCTM();
return {
x: (evt.clientX - CTM.e) / CTM.a,
y: (evt.clientY - CTM.f) / CTM.d
};
} $.ajax({
url: '/ajax.php', // URL для обработки клика
type: 'POST',
data: {
action: 'increment_click', // Действие для обработки
notification_id: notificationDetails[i]['id'] // ID уведомления
},
success: function(response) {
console.log('Click counter updated.');
},
error: function() {
// Обработка ошибок, если нужно
console.log('Error updating click counter.');
}
});if ($_POST['action'] == 'increment_click' && isset($_POST['notification_id'])) {
.....
логика обновления по инкрименту нотификатору
} states: {
active: {
filter: {
type: 'none' /* none, lighten, darken */
allowMultipleDataPointsSelection: false,
}
}
}async generateTokens(payload) {
const accessToken = await jwt.sign(payload, config.SECRET_KEY_ACCESS_TOKEN, {expiresIn: '15m'})
const refreshToken = await jwt.sign(payload, config.SECRET_KEY_REFRESH_TOKEN, {expiresIn: '30d'})
return {
accessToken,
refreshToken
}
}function addClass(){
ваш метод. не забудьте проверку, что элемент точно найден
}
addEventListener('DOMContentLoaded', addClass);function send(event) {
event.preventDefault();
const phone = document.getElementById('phone');
const email = document.getElementById('email');
let classPhone = phone.classList;
let classEmail = email.classList;
if (phone.value === "" && email.value === "") {
classPhone.add ("alert");
classEmail.add ("alert");
}
if (phone.value != "" || email.value != "") {
classPhone.remove ("alert");
classEmail.remove ("alert");
}
}