/* ============================================================ آذرخش بیمه — صفحه فرود قرعهکشی فایل اسکریپت اصلی (script.js) رویکرد: Progressive Enhancement با Vanilla JavaScript (ES6+) توجه: لینک لوگو از قبل در HTML با href, target, rel تعریف شده است و این فایل فقط لایهی تکمیلی رفتار است. ============================================================ */ 'use strict'; /* ------------------------------------------------------------ 1. IIFE — جلوگیری از آلوده شدن Scope سراسری (No Globals) ------------------------------------------------------------ */ (() => { /* -------------------------------------------------------- 2. ثابتهای پیکربندی (Config Constants) -------------------------------------------------------- */ const CONFIG = Object.freeze({ logoLinkSelector: '.header__logo-link', tableSelector: '.winners-table', rowSelector: '.winners-table__row', reducedMotionMedia: '(prefers-reduced-motion: reduce)' }); /* -------------------------------------------------------- 3. ابزارهای کمکی (Utilities) -------------------------------------------------------- */ /** * بررسی فعال بودن حالت Reduced Motion کاربر * برای احترام به تنظیمات دسترسپذیری سیستمعامل. * @returns {boolean} */ const prefersReducedMotion = () => window.matchMedia(CONFIG.reducedMotionMedia).matches; /** * ثبت امن یک Event Listener روی یک عنصر. * اگر عنصر وجود نداشت، هیچ خطایی رخ نمیدهد (Guard Clause). * * @param {Element|null} element - عنصر هدف * @param {string} event - نام رویداد (مثلاً 'click') * @param {Function} handler - تابع مدیریتکننده * @param {object} [options] - گزینههای addEventListener * @returns {boolean} آیا ثبت با موفقیت انجام شد؟ */ const on = (element, event, handler, options) => { if (!element || typeof element.addEventListener !== 'function') { return false; } element.addEventListener(event, handler, options); return true; }; /** * ثبت ایمن عناصر با کشش یکباره و جلوگیری از جستجوی تکراری DOM. * تمام Queryها یکبار اجرا و نتیجه ذخیره میشود. * * @returns {Object} نقشهای از عناصر کششده */ const cacheDom = () => ({ logoLink: document.querySelector(CONFIG.logoLinkSelector), table: document.querySelector(CONFIG.tableSelector), rows: document.querySelectorAll(CONFIG.rowSelector) }); /* -------------------------------------------------------- 4. ماژولهای قابلیت (Feature Modules) -------------------------------------------------------- */ /** * ماژول لوگو: * رفتار کلیک لوگو را بهصورت Progressive Enhancement مدیریت میکند. * لینک از قبل در HTML بهدرستی تعریف شده، این ماژول فقط تجربه را * غنیتر میکند (با هدف تقویت کنترل و دسترسپذیری). * * @param {HTMLAnchorElement|null} logoLink - عنصر لینک لوگو */ const initLogo = (logoLink) => { // Guard Clause: اگر لوگو در DOM نبود، بدون خطا خارج شو if (!logoLink) { return; } /** * مدیریت کلیک روی لوگو. * رفتار پیشفرض مرورگر (دنبالکردن href) متوقف میشود تا * بتوانیم window.open با گزینههای امنیتی دقیق را اجرا کنیم. * * @param {MouseEvent} event */ const handleLogoClick = (event) => { // اگر کلید modifier (Ctrl/Cmd/Shift) فشار داده شده، // اجازه بده مرورگر رفتار پیشفرض را انجام دهد. if (event.ctrlKey || event.metaKey || event.shiftKey || event.altKey) { return; } const href = logoLink.getAttribute('href'); // Guard: اگر href معتبر نبود، رفتار پیشفرض را رها نکن if (!href) { return; } event.preventDefault(); // باز کردن لینک در تب جدید با پارامترهای امنیتی استاندارد window.open(href, '_blank', 'noopener,noreferrer'); // تمرکز کیبورد را برای دسترسپذیری بازگردان logoLink.focus(); }; on(logoLink, 'click', handleLogoClick); // افزایش تجربه کیبورد: کلید Enter روی لینک با focus، همین رفتار را میدهد on(logoLink, 'keydown', (event) => { if (event.key !== 'Enter' && event.key !== ' ') { return; } // اجازه میدهیم رویداد طبیعی Enter روی اجرا شود؛ // جلوگیری از فشردهی دوم ایجاد شده توسط Space. if (event.key === ' ') { event.preventDefault(); logoLink.click(); } }); }; /** * ماژول جدول برندگان: * تعاملات جدول (نمایش، Hover تقویتی) را مدیریت میکند. * بخشهای بصری در CSS آماده است؛ اینجا فقط مکمل آن میشویم. * * @param {HTMLTableElement|null} table * @param {NodeList} rows */ const initTable = (table, rows) => { if (!table || !rows || rows.length === 0) { return; } // مدیریت Navigation کیبورد روی سطرها (دسترسپذیری) rows.forEach((row, index) => { // دادن قابلیت focus به سطرها برای پیمایش کیبورد اختیاری row.setAttribute('tabindex', '0'); on(row, 'keydown', (event) => { // حرکت با فلشها بین سطرها if (event.key === 'ArrowDown' && index < rows.length - 1) { event.preventDefault(); rows[index + 1].focus(); } else if (event.key === 'ArrowUp' && index > 0) { event.preventDefault(); rows[index - 1].focus(); } }); }); }; /** * مرکز ثبت تمام Event Listener ها. * همهی رویدادها از این تابع واحد میگذرند تا نگهداری و * پاکسازی آسان باشد. * * @param {Object} dom - نقشهی عناصر DOM */ const initEvents = (dom) => { initLogo(dom.logoLink); initTable(dom.table, dom.rows); }; /* -------------------------------------------------------- 5. نقطهی شروع (Bootstrap) -------------------------------------------------------- */ /** * مقداردهی اولیهی کل برنامه. * ترتیب اجرا: کش DOM → ثبت رویدادها. */ const init = () => { const dom = cacheDom(); // Guard: اگر جدول نبود، باز هم لوگو را مقداردهی کن initEvents(dom); // (جای توسعه آینده: میتوان گزارش اجرای موفق را لاگ گرفت) if (typeof console !== 'undefined' && console.debug) { console.debug('[AzarakhshBime] DOM ready — script initialized.'); } }; /* -------------------------------------------------------- 6. اجرا پس از آماده شدن DOM -------------------------------------------------------- */ if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init, { once: true }); } else { // اگر DOM از قبل لود شده (مثلاً اسکریپت با defer اجرا شده) init(); } })();
نتایج قرعه کشی جام جهانی | کارگزاری آذرخش بیمه
نتایج قرعه کشیلیست اسامی برندگان قرعه کشی
| ردیف | نام و نام خانوادگی | شماره موبایل |
|---|
| ۱ | علی رضایی | 091*****260 |
| ۲ | بهنام عبدلی | 090*****645 |
| ۳ | جلال اکبری | 091*****231 |
| ۴ | امیر کلیوند | 099*****027 |
| ۵ | نفیسه شفیعی | 091*****397 |
| ۶ | مصطفی محمدی | 091*****015 |
| ۷ | ایلیا قناعتگر | 093*****055 |
| ۸ | مهدی محمدیان | 092*****383 |
| ۹ | مریم فروزانفر | 099*****264 |
| ۱۰ | سید ولید اصل هاشمی | 090*****015 |