Table of Contents
ساخت یک سیستم اطلاع رسانی جاوا اسکریپت سفارشی برای Web Apps
بازخورد زمان واقعی یک سنگ بنای برنامه های وب مدرن است. کاربران انتظار دارند به روز رسانی های فوری و غیر مزاحم در مورد اقداماتی که انجام می دهند - چه آن را یک فرم موفق ارسال، یک خطای همگام، یا یک پیام جدید است، در حالی که بسیاری از کتابخانه های شخص ثالث ارائه می دهند آماده برای تست های HTML یا اجزای هشدار، ساخت سیستم اطلاع رسانی خود را در جاوا اسکریپت فراهم می کند کنترل کامل بر روی ظاهر رفتار، و ادغام، و اطمینان از سازگاری کاربر با استفاده از هر جنبه های زبان و سیستم اطلاع رسانی سفارشی، می کند.
درک معماری اصلی یک سیستم اطلاع رسانی
سیستم اعلانی به دنبال یک الگوی ساده مبتنی بر رویداد است که در قلب آن سه جزء است: رویدادهای بزرگتر (اقدامات کاربر، پاسخ های API، به روز رسانی سیستم)، منطق [FLT3] (تولید و موقعیت عناصر اطلاع رسانی)، و مدیریت فعل و انفعال
در برنامه های بزرگتر، شما ممکن است با یک الگوی مدیریت یک یا یک کتابخانه مدیریت دولتی ادغام کنید، اما برای اکثر برنامه های وب یک رویکرد تابع ساده همراه با دستکاری DOM به طور کامل کار می کند. جاوا اسکریپت (FLT:0) API و روش مدیریت (FLT:1) برای ایجاد صف کافی است.
راهنمای گام به گام برای ساخت سیستم شما
۱- آماده سازی Container اعلان
این ظرف یک عنصر ثابت است که در آن تمام اعلان ها زنده می مانند، باید خارج از جریان اصلی محتوا قرار داده شود تا از تداخل در طرح جلوگیری شود. اضافه کردن آن به صورت پویا از طریق جاوا اسکریپت HTML شما را تمیز نگه می دارد.
از این اسکریپت برای ایجاد ظرف و اتصال آن به بدن استفاده کنید:
const container = document.createElement('div');
container.id = 'notification-container';
Object.assign(container.style, {
position: 'fixed',
top: '20px',
right: '20px',
zIndex: '9999',
display: 'flex',
flexDirection: 'column',
gap: '10px',
pointerEvents: 'none'
});
document.body.appendChild(container);
توجه کنید - اجازه می دهد کلیک ها از طریق ظرف عبور کنند. عناصر اطلاع رسانی فردی این ملک را زمانی که نیاز به تعاملی دارند، باطل می کنند (به عنوان مثال، برای دکمه های نزدیک).
۲- نوشتن تابع اعلان نسل
تابع اصلی یک ایجاد می کند، کلاس ها و محتوا را اعمال می کند، آن را به ظرف می دهد و پس از مدت مشخص، آن را به صورت اختیاری حرکت می دهد.
function showNotification({
message,
type = 'info',
duration = 3000,
closable = false,
icon = ''
} = {}) {
const notification = document.createElement('div');
notification.className = `notification ${type}`;
notification.setAttribute('role', 'alert');
notification.setAttribute('aria-live', 'assertive');
const messageSpan = document.createElement('span');
messageSpan.textContent = icon + ' ' + message;
notification.appendChild(messageSpan);
if (closable) {
const closeBtn = document.createElement('button');
closeBtn.textContent = '×';
closeBtn.className = 'notification-close';
closeBtn.addEventListener('click', () => notification.remove());
notification.appendChild(closeBtn);
notification.style.pointerEvents = 'auto';
}
container.appendChild(notification);
// Remove after duration, unless the user already dismissed it
const timeoutId = setTimeout(() => {
if (notification.parentNode) notification.remove();
}, duration);
// Clear timeout if user closes manually
notification.addEventListener('remove', () => clearTimeout(timeoutId));
// Animate in
requestAnimationFrame(() => notification.classList.add('show'));
}
این نسخه یک شیء گزینه را می پذیرد و آن را غیر قابل استفاده می کند. و ویژگی های اطمینان از پشتیبانی صفحه نمایش - یک جزء دسترسی حیاتی.
ویژگی های پیشرفته: Queuing و Grouping
هنگامی که بسیاری از اعلان ها در موفقیت سریع آتش می زنند، ممکن است بخواهید آنها را صف کنید یا گروه کنید تا از یک صف ساده جلوگیری کنید:
const notificationQueue = [];
let isProcessing = false;
function processQueue() {
if (isProcessing || notificationQueue.length === 0) return;
isProcessing = true;
const next = notificationQueue.shift();
showNotification(next);
// Wait for the current notification to disappear before processing next
setTimeout(() => {
isProcessing = false;
processQueue();
}, next.duration || 3000);
}
function enqueueNotification(options) {
notificationQueue.push(options);
processQueue();
}
برای گروه بندی، به روز رسانی اعلان های تکراری به جای ایجاد پیام های جدید، اگر دو پیام "موفقیت" در 500m ظاهر شوند، محتوای موجود را به روز کرده و تایمر آن را تنظیم کنید.
۴- روشنگری و اطلاع رسانی
CSS سیستم را به صورت بصری جذاب می کند.استفاده از برای اثرات اسلاید و محو شدن انواع مختلف (info، موفقیت، خطا، هشدار) باید رنگ ها و آیکون های پس زمینه ای متمایز داشته باشد.
.notification {
padding: 12px 20px;
border-radius: 6px;
color: #fff;
font-family: system-ui, sans-serif;
box-shadow: 0 4px 12px rgba(0,0,0,0.15);
transform: translateX(120%);
transition: transform 0.4s ease, opacity 0.4s ease;
min-width: 280px;
max-width: 450px;
}
.notification.show {
transform: translateX(0);
}
.notification.info { background: #2196F3; }
.notification.success { background: #4CAF50; }
.notification.error { background: #f44336; }
.notification.warning { background: #FF9800; }
.notification-close {
background: none;
border: none;
color: inherit;
font-size: 1.4rem;
cursor: pointer;
margin-left: 16px;
line-height: 1;
}
/* Fade out before removal (triggered by class removal) */
.notification.hiding {
transform: translateX(120%);
opacity: 0;
}
شما می توانید یک کلاس “haging” را قبل از حذف عنصر برای ایجاد یک انیمیشن خروجی صاف اضافه کنید:
// In the showNotification function, replace the direct removal:
notification.addEventListener('animationend', () => notification.remove());
notification.classList.add('hiding'); // after timeout triggers fade‑out
۵- یکپارچه سازی با برنامه وب شما
در این هنگام از هر گونه استفاده از این موارد استفاده کنید:
- [در این میان] [در این صورت] [از این رو]، [و] [از این رو]، [و] [و] [و [از این رو]،] [و [از این رو]،] [و [از این رو]، [و] [و] [و] [و] [و] [از گمراهی] بهره مند می شوند.
- [در این باره] [[[۱]]] [۱] [۱]] [۱]] [۱]] [۱]] [۱] [۱]] [۱]] [۱] [۱]] [۱]] [۱]] [۱] [۱]] [۱] [۱] [۱]] [۱] [۱] [۱] [۱] [۱] [۱] [۳] [۱] [۲] [۵] [۲] [۵] [۱] [۱] [۱] [۲] [۱] [۱] [۵] [۵] [۲] [۲] [۱] [۵]]] [۱]]] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۳] [۱] [۱] [۱]]] [۲] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۳] [۲] [۲] [۲] [۱] [۲] [۲] [۲] [۱] [۱
- (FLT:0) اقدامات کاربر تأیید یک حذف یا همگام سازی داده ها.
- رویدادهای زمان واقعی - پیام های چت ورودی یا اعلان های سرور (از طریق WebSockets)
// Example: Handling a fetch response
fetch('/api/save', { method: 'POST', body: formData })
.then(response => {
if (!response.ok) throw new Error('Save failed');
showNotification({ message: 'Data saved!', type: 'success' });
})
.catch(err => {
showNotification({ message: err.message, type: 'error', duration: 5000 });
});
نظرات دسترسی
اعلان ها باید توسط همه کاربران قابل قبول باشند، از جمله کسانی که از تکنولوژی کمکی استفاده می کنند، این دستورالعمل ها را دنبال کنند:
- از [FLT14] استفاده کنید و در هر اعلان استفاده کنید تا خوانندگان صفحه نمایش بلافاصله محتوای جدید را اعلام کنند.
- یک دکمه نزدیک را ارائه دهید یا از طریق کلید را رها کنید.
- اطمینان حاصل کنید که نسبت کنتراست رنگ با استانداردهای WCAG AA مطابقت دارد (به عنوان مثال، متن سفید در رنگ پس زمینه).
- هرگز تنها به رنگ تکیه نکنید – شامل آیکون ها یا متن هایی مانند “موفقیت”، “غیردهنده” است.
تست با خوانندگان صفحه نمایش واقعی (NVDA، VoiceOver) و بررسی ARIA] اسناد زنده برای بهترین شیوه ها.
ویژگی های Performance and Edge Cases
برای سناریوهای اطلاع رسانی با فرکانس بالا (مانند یک جریان WebSocket)، به بررسی ترتلینگ یا دسته بندی برای جلوگیری از اضافه بار DOM توجه کنید، رویکرد صف توضیح داده شده در اوایل کمک می کند، اما همچنین می توانید حداکثر تعداد اعلان های قابل مشاهده را محدود کنید (به عنوان مثال، تنها پنج و بقیه را نشان دهید).
مورد دیگر لبه: هنگامی که کاربر چندین زبانه باز دارد، اعلان در برگه های غیر فعال نباید تمرکز را سرقت کند.استفاده از API قابلیت مشاهده صفحه ( برای دفع نمایش تا زمانی که زبانه دوباره فعال شود.
document.addEventListener('visibilitychange', () => {
if (document.hidden) {
// optionally store pending notifications and show them when user returns
}
});
وقتی کتابخانه را در نظر بگیریم
ساخت یک سیستم سفارشی ایده آل است زمانی که شما نیاز به کنترل طراحی تنگ یا حداقل وابستگی دارید [با این حال، اگر برنامه شما از یک چارچوب UI مانند React، Vue یا Angular استفاده می کند، شما ممکن است یک کتابخانه مانند React Toastify [FLT 1] را ترجیح دهید و یا Vue Son] که مرورگرهای بومی را به طور کامل تجزیه و تحلیل می کند؛ و تحلیل و ساز وان وان وان وان وان وان وان وان می تواند به طور کامل قابل تنظیم کننده باشد.
نتیجه گیری
یک سیستم اطلاع رسانی جاوا اسکریپت سفارشی به شما آزادی می دهد تا دقیقا بازخورد کاربر نیازهای برنامه وب شما را تجربه کند.با ساخت دستکاری DOM، انیمیشن های CSS و ملاحظات دسترسی دقیق، شما یک راه حل ایجاد می کنید که احساس یکپارچه، اجرا کننده و فراگیر می کند.با اصول شروع کنید - نگهداری، عملکرد نسل، و طراحی - لایه در صف ها، گروه بندی و تعاملات پیشرفته به عنوان یک برنامه انتقال می یابد که بدون اطلاع رسانی سیستم های سیستم های توسعه خارجی شما سازگار است.
برای مطالعه بیشتر، اسناد MDN را در AppendChild و Almanac برای راهنمایی های انیمیشن، شما آماده به پیاده سازی یک سیستم اطلاع رسانی سفارشی است که افزایش تعامل کاربر و راحتی.