При активном использовании уведомлений в интерфейсе возникает проблема перегрузки: большое количество всплывающих сообщений ухудшает восприятие, перекрывает контент и снижает удобство работы. Для решения этой задачи в библиотеке Toastify применяется контроль количества одновременно отображаемых уведомлений.
Основные факторы, требующие ограничения:
Toastify изначально не предоставляет встроенного механизма глобального ограничения количества уведомлений. Поэтому управление осуществляется вручную через дополнительную логику.
Основной принцип:
Простейший способ — использование переменной-счетчика:
let activeToasts = 0;
const MAX_TOASTS = 3;
function showToast(message) {
if (activeToasts >= MAX_TOASTS) return;
activeToasts++;
Toastify({
text: message,
duration: 3000,
close: true,
callback: function() {
activeToasts--;
}
}).showToast();
}
Особенности:
activeToasts увеличивается при созданииБолее гибкий подход — реализация очереди. В этом случае уведомления не теряются, а показываются по мере освобождения места.
const queue = [];
let activeToasts = 0;
const MAX_TOASTS = 3;
function processQueue() {
if (queue.length === 0 || activeToasts >= MAX_TOASTS) return;
const message = queue.shift();
activeToasts++;
Toastify({
text: message,
duration: 3000,
close: true,
callback: function() {
activeToasts--;
processQueue();
}
}).showToast();
}
function enqueueToast(message) {
queue.push(message);
processQueue();
}
Преимущества:
Альтернативный подход — удаление старых уведомлений при превышении лимита.
const toasts = [];
const MAX_TOASTS = 3;
function showToast(message) {
if (toasts.length >= MAX_TOASTS) {
const oldToast = toasts.shift();
oldToast.hideToast();
}
const toast = Toastify({
text: message,
duration: 3000,
close: true
});
toasts.push(toast);
toast.showToast();
}
Особенности:
Toastify добавляет уведомления в DOM, что позволяет отслеживать их напрямую:
function getActiveToasts() {
return document.querySelectorAll('.toastify').length;
}
function showToast(message) {
if (getActiveToasts() >= 3) return;
Toastify({
text: message,
duration: 3000
}).showToast();
}
Недостатки:
В сложных системах используется приоритетная система:
const queue = [];
function enqueueToast(message, priority = 0) {
queue.push({ message, priority });
queue.sort((a, b) => b.priority - a.priority);
processQueue();
}
Применение:
Разделение лимитов по категориям:
const limits = {
error: 2,
info: 3
};
const active = {
error: 0,
info: 0
};
function showToast(type, message) {
if (active[type] >= limits[type]) return;
active[type]++;
Toastify({
text: message,
duration: 3000,
callback: function() {
active[type]--;
}
}).showToast();
}
Иногда ограничение достигается за счет уменьшения времени отображения:
Toastify({
text: "Короткое уведомление",
duration: 1500
}).showToast();
Комбинация короткого времени и лимита снижает вероятность накопления.
При частых событиях (например, логировании):
let lastToastTime = 0;
const DELAY = 1000;
function showToast(message) {
const now = Date.now();
if (now - lastToastTime < DELAY) return;
lastToastTime = now;
Toastify({
text: message,
duration: 3000
}).showToast();
}
На практике используется комбинация:
Такой подход обеспечивает баланс между информативностью и удобством интерфейса.