PageSourceSearch

https://www.thehubnews.net/wp-content/plugins/thn-tvbs-mobile-menu/assets/mobile-menu.js

js thehubnews.net collected 2026-10-03 19:26:05 UTC 3,972 bytes, 118 lines download raw bytes

1(function () {
2    'use strict';
3
4    function init() {
5        var menu = document.getElementById('thn-mobile-menu');
6        var overlay = document.getElementById('thn-mobile-menu-overlay');
7        var closeButton = document.querySelector('.thn-mobile-menu-close');
8
9        if (!menu || !overlay || !closeButton) {
10            return;
11        }
12
13        var openSelectors = [
14            '#td-header-menu-button',
15            '.td-mobile-menu-button',
16            '.tdb-mobile-menu-button',
17            '.td-header-menu-button',
18            '.tdb-mobile-menu',
19            '.td-mobile-menu-icon',
20            '.td-icon-menu-up',
21            '.td-icon-menu-down',
22            '[data-td-block-uid] .tdb-mobile-menu-button'
23        ].join(',');
24
25        var lastFocused = null;
26
27        function openMenu(trigger) {
28            lastFocused = trigger || document.activeElement;
29            overlay.hidden = false;
30            window.requestAnimationFrame(function () {
31                overlay.classList.add('is-visible');
32                menu.classList.add('is-open');
33            });
34            menu.setAttribute('aria-hidden', 'false');
35            document.body.classList.add('thn-mobile-menu-open');
36            closeButton.focus({ preventScroll: true });
37        }
38
39        function closeMenu() {
40            menu.classList.remove('is-open');
41            overlay.classList.remove('is-visible');
42            menu.setAttribute('aria-hidden', 'true');
43            document.body.classList.remove('thn-mobile-menu-open');
44
45            window.setTimeout(function () {
46                overlay.hidden = true;
47            }, 230);
48
49            if (lastFocused && typeof lastFocused.focus === 'function') {
50                lastFocused.focus({ preventScroll: true });
51            }
52        }
53
54        function toggleItem(item) {
55            if (!item) {
56                return;
57            }
58
59            var expanded = item.classList.toggle('is-expanded');
60            var directToggle = item.querySelector(':scope > .thn-mobile-submenu-toggle');
61
62            if (directToggle) {
63                directToggle.setAttribute('aria-expanded', expanded ? 'true' : 'false');
64            }
65        }
66
67        document.addEventListener('click', function (event) {
68            if (window.innerWidth > 767) {
69                return;
70            }
71
72            var openButton = event.target.closest(openSelectors);
73            if (openButton && !openButton.closest('#thn-mobile-menu')) {
74                event.preventDefault();
75                event.stopPropagation();
76                if (typeof event.stopImmediatePropagation === 'function') {
77                    event.stopImmediatePropagation();
78                }
79                openMenu(openButton);
80                return;
81            }
82
83            var submenuToggle = event.target.closest('.thn-mobile-submenu-toggle');
84            if (submenuToggle) {
85                event.preventDefault();
86                toggleItem(submenuToggle.closest('.thn-mobile-menu-item'));
87                return;
88            }
89
90            var parentToggle = event.target.closest('.thn-mobile-parent-toggle');
91            if (parentToggle) {
92                event.preventDefault();
93                toggleItem(parentToggle.closest('.thn-mobile-menu-item'));
94            }
95        }, true);
96
97        closeButton.addEventListener('click', closeMenu);
98        overlay.addEventListener('click', closeMenu);
99
100        document.addEventListener('keydown', function (event) {
101            if (event.key === 'Escape' && menu.classList.contains('is-open')) {
102                closeMenu();
103            }
104        });
105
106        window.addEventListener('resize', function () {
107            if (window.innerWidth > 767 && menu.classList.contains('is-open')) {
108                closeMenu();
109            }
110        });
111    }
112
113    if (document.readyState === 'loading') {
114        document.addEventListener('DOMContentLoaded', init);
115    } else {
116        init();
117    }
118}());

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.