Открыть меню
Переключить меню настроек
Открыть персональное меню
Вы не представились системе
Ваш IP-адрес будет виден всем, если вы внесёте какие-либо изменения.

MediaWiki:Common.js

Страница интерфейса MediaWiki
Дополнительные действия

Замечание: Возможно, после публикации вам придётся очистить кэш своего браузера, чтобы увидеть изменения.

  • Firefox / Safari: Удерживая клавишу Shift, нажмите на панели инструментов Обновить либо нажмите Ctrl+F5 или Ctrl+R (⌘+R на Mac)
  • Google Chrome: Нажмите Ctrl+Shift+R (⌘+Shift+R на Mac)
  • Edge: Удерживая Ctrl, нажмите Обновить либо нажмите Ctrl+F5
  • Opera: Нажмите Ctrl+F5.
/* Размещённый здесь код JavaScript будет загружаться пользователям при обращении к каждой странице */

mw.loader.using('mediawiki.util').then(function() {
    var isMobile = mw.config.get('skin') === 'minerva';

    if (isMobile) {
        // Мобильная версия
        $('.mobile-hide').hide();
    } else {
        // Десктопная версия
        $('.desktop-hide').hide();
    }
});

mw.hook('wikipage.content').add(function($content) {
    $content.find('.dropbtn').on('click', function(event) {
        event.preventDefault();
        var dropdown = $(this).closest('.dropdown');
        var content = dropdown.find('.dropdown-content');

        // Закрываем все открытые списки
        $('.dropdown').not(dropdown).removeClass('active').find('.dropdown-content').css('max-height', '0px');

        // Открываем/закрываем текущий список
        if (dropdown.hasClass('active')) {
            dropdown.removeClass('active');
            content.css('max-height', '0px');
        } else {
            dropdown.addClass('active');
            content.css('max-height', content[0].scrollHeight + 'px'); // Автоматическая высота
        }
    });
});


// Универсальный фикс для dropdown, переводим раскрытые меню в поток документа
( function () {
    function fixDropdown(el) {
        if (!el) return;
        try {
            el.style.position = '';
            el.style.top = '';
            el.style.left = '';
            el.style.right = '';
            el.style.transform = '';
            el.style.zIndex = '';
            el.style.maxHeight = '';
            el.style.overflow = '';
        } catch (e) { /* ignore */ }
    }

    // На клики по кнопке открывающей меню — удаляем inline-стили у .dropdown-content
    document.addEventListener('click', function (e) {
        // попытка поймать ближайший .dropdown
        var but = e.target.closest && e.target.closest('.dropbtn, .dropdown, .dropdown-toggle, [data-dropdown]');
        if (but) {
            // небольшая задержка, чтобы скрипт, открывающий меню, выполнил своё и мы могли почистить
            setTimeout(function () {
                var dropdowns = document.querySelectorAll('.dropdown, .dropdown.active, .dropdown.open, .menu-column');
                dropdowns.forEach(function (d) {
                    // исправляем сам контейнер
                    fixDropdown(d);
                    // исправляем контент
                    var c = d.querySelector('.dropdown-content, .menu, .dropdown-menu, .citizen-dropdown__content');
                    if (c) fixDropdown(c);
                });
            }, 20);
        }
    }, false);

    // При любом модифицировании DOM (на случай, если меню открывает сторонний скрипт)
    var observer = new MutationObserver(function (mutations) {
        mutations.forEach(function (m) {
            if (m.addedNodes && m.addedNodes.length) {
                m.addedNodes.forEach(function (node) {
                    if (!(node instanceof HTMLElement)) return;
                    if (node.matches('.dropdown, .dropdown-content, .dropdown.active, .dropdown.open, .dropdown-menu')) {
                        fixDropdown(node);
                    }
                    var inner = node.querySelector && (node.querySelector('.dropdown, .dropdown-content, .dropdown.active, .dropdown.open, .dropdown-menu'));
                    if (inner) fixDropdown(inner);
                });
            }
            // также пробуем почистить целевые элементы, если у них появились атрибуты стиля
            if (m.target && m.target instanceof HTMLElement) {
                if (m.target.matches && (m.target.matches('.dropdown, .dropdown-content, .dropdown.active, .dropdown.open, .dropdown-menu'))) {
                    fixDropdown(m.target);
                }
            }
        });
    });

    observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });

    // Очистка для уже открытых при загрузке
    window.addEventListener('load', function () {
        document.querySelectorAll('.dropdown, .dropdown-content, .dropdown.active, .dropdown.open, .dropdown-menu').forEach(function (el) {
            fixDropdown(el);
        });
    });

}() );