1/** 2 * menuNotiDot.js 3 * ê´ë¦¬ì ì¢ì¸¡ ì¬ë¼ì´ë ë©ë´(#klubo-myclub-navigation-container)ì 미ì²ë¦¬ ì림 ë°°ì§ë¥¼ 4 * ì¤ìºíì¬, í¤ë "ë©ë´ ì´ê¸°" ë²í¼(#klubo-myclub-navigation-openBtn)ê³¼ ì¢ì¸¡ ë©ë´ ë´ë¶ì 5 * "ê´ë¦¬ì/ê°ì¸" í ë²í¼(.leftpanel-tab__btn[data-tab])ì ë ëë·(has-noti)ì íìíë¤. 6 * 7 * - ì§ê³ ëì(ì¤ì½í ë´ë¶): 8 * 1) .leftpanel-submenu__item.new (ê°ì ì ì² ì ì ë± "New" ë°°ì§) 9 * 2) .submenu-count[data-count] (data-count >= 1) (ì°¸ì ì¹ì¸ ë± ì¹´ì´í¸ ë°°ì§) 10 * - í¤ë ë²í¼ì 컨í ì´ë ì 체를 ì¤ì½íë¡, í ë²í¼ì ê° íì .leftpanel-tab__content 11 * (data-tab-content ë¡ ë§¤ì¹)ë§ ì¤ì½íë¡ ì¼ì ê·¸ í ìì ìë¦¼ì´ ìì ëë§ ì ì ì°ëë¤. 12 * - íëë¼ë ìì¼ë©´(total > 0) ë²í¼ì .has-noti ì¶ê° â CSS ìì¬ììë¡ ë ëë· ë ¸ì¶. 13 * - ë¹ì´ìì/ê²ìí íì´ì§ë í´ë¹ 컨í ì´ëë ë°°ì§ê° ìì¼ë¯ë¡ ìì°í ë·ì´ ë¨ì§ ìëë¤. 14 * (ê²ìí ì¢ì¸¡ ë©ë´ë #klubo_board_navigation_container ë¡ ë³ë id â ì¤ì½í ë°) 15 * - ì¢ì¸¡ ë©ë´ê° AJAX ë±ì¼ë¡ ì¬ë ëëë ê²½ì°ë¥¼ ëë¹í´ window.KluboMenuNotiDot.refresh() 를 ë ¸ì¶íë¤. 16 */ 17(function (window, document) { 18 'use strict'; 19 20 var MENU_CONTAINER_ID = 'klubo-myclub-navigation-container'; 21 var OPEN_BTN_ID = 'klubo-myclub-navigation-openBtn'; 22 var HAS_NOTI_CLASS = 'has-noti'; 23 24 /** 25 * 주ì´ì§ ì¤ì½í ìë¦¬ë¨¼í¸ ìì 미ì²ë¦¬ ì림 ì´í©ì ê³ì°íë¤. 26 * @returns {number} 0 ì´ë©´ ì림 ìì 27 */ 28 function countNotificationsWithin(scopeEl) { 29 var total = 0; 30 31 // 1) "New" ë°°ì§ (ê°ì ì ì² ì ì ë±) â ì¡´ì¬ ê°ì 32 total += scopeEl.querySelectorAll('.leftpanel-submenu__item.new').length; 33 34 // 2) ì¹´ì´í¸ ë°°ì§ (ì°¸ì ì¹ì¸ ë±) â data-count ê°ì´ 1 ì´ìì¸ ìì를 ì림ì¼ë¡ ì·¨ê¸ 35 var countEls = scopeEl.querySelectorAll('.submenu-count[data-count]'); 36 for (var i = 0; i < countEls.length; i++) { 37 var n = parseInt(countEls[i].getAttribute('data-count'), 10); 38 if (!isNaN(n) && n > 0) { 39 total += n; 40 } 41 } 42 43 return total; 44 } 45 46 /** 47 * ê´ë¦¬ì ì¢ì¸¡ ë©ë´ ì ì²´(í¤ë ë²í¼ ì¤ì½í)ì 미ì²ë¦¬ ì림 ì´í©ì ê³ì°íë¤. 48 * @returns {number} 0 ì´ë©´ ì림 ìì 49 */ 50 function countNotifications() { 51 var container = document.getElementById(MENU_CONTAINER_ID); 52 if (!container) { 53 return 0; 54 } 55 return countNotificationsWithin(container); 56 } 57 58 /** 59 * "ê´ë¦¬ì/ê°ì¸" í ë²í¼ ê°ê°ì, ê·¸ í ì½í ì¸ ìì ì림 ì 무ì ë°ë¼ ë ëë·ì í ê¸íë¤. 60 */ 61 function refreshTabDots(container) { 62 var tabBtns = container.querySelectorAll('.leftpanel-tab__btn[data-tab]'); 63 for (var i = 0; i < tabBtns.length; i++) { 64 var btn = tabBtns[i]; 65 var tabKey = btn.getAttribute('data-tab'); 66 var content = container.querySelector('.leftpanel-tab__content[data-tab-content="' + tabKey + '"]'); 67 var hasNoti = content ? (countNotificationsWithin(content) > 0) : false; 68 if (hasNoti) { 69 btn.classList.add(HAS_NOTI_CLASS); 70 } else { 71 btn.classList.remove(HAS_NOTI_CLASS); 72 } 73 } 74 } 75 76 /** 77 * ì림 ì 무ì ë°ë¼ ë©ë´ ë²í¼ì ë ëë· í´ëì¤ë¥¼ í ê¸íë¤. 78 * id ë ì ì¼íì§ë§ ë°©ì´ì ì¼ë¡ 모ë ë§¤ì¹ ììì ì ì©íë¤. 79 */ 80 function refresh() { 81 var hasNoti = countNotifications() > 0; 82 var btns = document.querySelectorAll('#' + OPEN_BTN_ID); 83 for (var i = 0; i < btns.length; i++) { 84 if (hasNoti) { 85 btns[i].classList.add(HAS_NOTI_CLASS); 86 } else { 87 btns[i].classList.remove(HAS_NOTI_CLASS); 88 } 89 } 90 91 var container = document.getElementById(MENU_CONTAINER_ID); 92 if (container) { 93 refreshTabDots(container); 94 } 95 } 96 97 // ì¸ë¶(ì¬ë ë ì) ì¬ì¤íì© ë ¸ì¶ 98 window.KluboMenuNotiDot = { refresh: refresh }; 99 100 if (document.readyState === 'loading') { 101 document.addEventListener('DOMContentLoaded', refresh); 102 } else { 103 // head ë¡ë í ì´ë¯¸ DOM ì¤ë¹ë ê²½ì° 104 refresh(); 105 } 106})(window, document);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.