Лекция
События (events) в JavaScript играют важную роль в создании динамических и интерактивных веб-страниц. Они позволяют выполнять определенные действия в ответ на пользовательские действия или другие события на веб-странице. Вот основные концепции и примеры работы с событиями в JavaScript:
Типы событий в JavaScript
Оптимизация событий (events) в JavaScript важна для повышения производительности приложений, особенно при работе с большим количеством событий и элементов DOM.
Вот несколько ключевых стратегий и подходов оптимизации:
Эти техники помогают снизить количество вызовов функций-обработчиков, которые могут выполняться слишком часто (например, при событиях scroll
, resize
или input
).
resize
окно браузера:
function debounce(func, delay)
{
let timer;
return function (...args) {
clearTimeout(timer); timer = setTimeout(() => func.apply(this, args), delay);
};
}
window.addEventListener('resize', debounce(() => { console.log('Window resized!'); }, 300));
function throttle(func, limit)
{ let lastCall = 0;
return function (...args) {
const now = Date.now();
if (now - lastCall >= limit) { lastCall = now; func.apply(this, args); }
};
}
window.addEventListener('scroll', throttle(() => { console.log('Scrolling...'); }, 200));
Вместо привязки событий к каждому элементу DOM, можно использовать делегирование через ближайшего общего родителя.
Пример: клик по элементам списка:
document.querySelector('#list').addEventListener('click', (event) =>
{
if (event.target && event.target.tagName === 'LI') { console.log('Clicked:', event.target.textContent); }
});
Удаляйте обработчики событий, когда они больше не нужны:
function handleClick()
{
console.log('Button clicked');
}
const button = document.querySelector('button');
button.addEventListener('click', handleClick);
// Позже удаляем обработчик
button.removeEventListener('click', handleClick);
passive: true
Для событий, таких как scroll
и touchstart
, включение флага passive
может улучшить производительность:
window.addEventListener('scroll', () => { console.log('Scrolling...'); }, { passive: true });
Это позволяет браузеру не блокировать прокрутку, улучшая отзывчивость.
Не изменяйте DOM внутри каждого вызова события. Вместо этого:
Пример:
const fragment = document.createDocumentFragment();
for (let i = 0; i < 100; i++)
{
const item = document.createElement('div');
item.textContent = `Item ${i}`;
fragment.appendChild(item);
}
document.querySelector('#container').appendChild(fragment);
Старайтесь избегать добавления нескольких обработчиков на одно событие. Например, вместо:
button.addEventListener('click', () => console.log('Handler 1'));
button.addEventListener('click', () => console.log('Handler 2'));
Лучше объединить логику:
button.addEventListener('click', () => { console.log('Handler 1'); console.log('Handler 2'); });
once: true
для одноразовых событийЕсли событие нужно обработать только один раз:
button.addEventListener('click', () => { console.log('Button clicked once!'); }, { once: true });
Для ресурсоемких вычислений перенесите обработку в Web Worker:
const worker = new Worker('worker.js');
worker.postMessage({ type: 'heavyTask' });
worker.onmessage = (event) => { console.log('Result from worker:', event.data); };
Применение этих подходов позволяет минимизировать нагрузку на браузер, улучшить отклик интерфейса и сделать приложение более плавным и удобным.
Комментарии
Оставить комментарий
Выполнение скриптов на стороне клиента JavaScript, jqvery, JS фреймворки (Frontend)
Термины: Выполнение скриптов на стороне клиента JavaScript, jqvery, JS фреймворки (Frontend)