MediaWiki:Common.js: различия между версиями
Pok (обсуждение | вклад) Удаления функции "TOC" |
Pok (обсуждение | вклад) Нет описания правки |
||
| Строка 462: | Строка 462: | ||
var currentCategoryIndex = 0; // Индекс текущей активной категории | var currentCategoryIndex = 0; // Индекс текущей активной категории | ||
// Генерация ID из текста | |||
function generateIdFromText(text) { | |||
return text.trim().toLowerCase().replace(/\s+/g, '-').replace(/[^a-zа-яё0-9\-]/g, ''); | |||
} | |||
// Присвоение ID категориям и пунктам меню | |||
function assignIds() { | |||
categories.forEach(function(category, index) { | |||
var categoryText = category.textContent || category.innerText; | |||
var categoryId = generateIdFromText(categoryText); | |||
category.setAttribute('id', categoryId); | |||
var menu = menus[index]; | |||
var menuItems = menu.querySelectorAll('div'); | |||
menuItems.forEach(function(menuItem) { | |||
var menuItemText = menuItem.textContent || menuItem.innerText; | |||
var menuItemId = generateIdFromText(menuItemText); | |||
menuItem.setAttribute('id', menuItemId); | |||
}); | |||
}); | |||
} | |||
assignIds(); // Вызов функции для присвоения ID | |||
// Удаление класса active у всех контентных элементов | |||
function clearActiveContent() { | function clearActiveContent() { | ||
for (var i = 0; i < contentDivs.length; i++) { | for (var i = 0; i < contentDivs.length; i++) { | ||
| Строка 468: | Строка 493: | ||
} | } | ||
// Удаление класса active у всех меню | |||
function clearActiveMenu() { | function clearActiveMenu() { | ||
for (var i = 0; i < menus.length; i++) { | for (var i = 0; i < menus.length; i++) { | ||
| Строка 474: | Строка 500: | ||
} | } | ||
// Удаление класса active у всех пунктов меню | |||
function clearActiveMenuItems() { | function clearActiveMenuItems() { | ||
for (var i = 0; i < menuItems.length; i++) { | for (var i = 0; i < menuItems.length; i++) { | ||
| Строка 480: | Строка 507: | ||
} | } | ||
// Переключение категорий | |||
function switchCategory(index) { | function switchCategory(index) { | ||
clearActiveMenu(); | clearActiveMenu(); | ||
clearActiveContent(); | clearActiveContent(); | ||
// | // Удаление класса active у всех категорий | ||
categories.forEach(function(category) { | categories.forEach(function(category) { | ||
category.classList.remove('active'); | category.classList.remove('active'); | ||
}); | }); | ||
// | // Установка новой активной категории | ||
var selectedCategory = categories[index]; | var selectedCategory = categories[index]; | ||
if (selectedCategory) { | if (selectedCategory) { | ||
selectedCategory.classList.add('active'); // | selectedCategory.classList.add('active'); // Добавление класса active | ||
var categoryClass = selectedCategory.classList[0]; // | var categoryClass = selectedCategory.classList[0]; // Получение класса категории | ||
var selectedMenu = document.querySelector('.' + categoryClass + '-menu'); | var selectedMenu = document.querySelector('.' + categoryClass + '-menu'); | ||
if (selectedMenu) { | if (selectedMenu) { | ||
selectedMenu.classList.add('active'); // | selectedMenu.classList.add('active'); // Активирование меню соответствующей категории | ||
var firstParagraph = selectedMenu.querySelector('div'); | var firstParagraph = selectedMenu.querySelector('div'); | ||
if (firstParagraph) { | if (firstParagraph) { | ||
switchContent(firstParagraph); // | switchContent(firstParagraph); // Открытие первого пункта меню | ||
} | } | ||
} | } | ||
| Строка 505: | Строка 533: | ||
currentCategoryIndex = index; | currentCategoryIndex = index; | ||
updateArrowStates(); // | updateArrowStates(); // Обновление состояния стрелок | ||
} | } | ||
// Переключение контента в меню | |||
function switchContent(menuItem) { | function switchContent(menuItem) { | ||
clearActiveMenuItems(); | clearActiveMenuItems(); | ||
| Строка 519: | Строка 548: | ||
} | } | ||
// | // Обновление состояния стрелок (активные/неактивные) | ||
function updateArrowStates() { | function updateArrowStates() { | ||
const prevArrow = document.getElementById('prev-category'); | const prevArrow = document.getElementById('prev-category'); | ||
const nextArrow = document.getElementById('next-category'); | const nextArrow = document.getElementById('next-category'); | ||
// | // Отключение стрелки назад, если это первая категория | ||
if (currentCategoryIndex === 0) { | if (currentCategoryIndex === 0) { | ||
prevArrow.classList.add('disabled'); | prevArrow.classList.add('disabled'); | ||
prevArrow.style.pointerEvents = 'none'; // Отключение кликов | |||
} else { | } else { | ||
prevArrow.classList.remove('disabled'); | prevArrow.classList.remove('disabled'); | ||
prevArrow.style.pointerEvents = 'auto'; // Включение кликов | |||
} | } | ||
// | // Отключение стрелки вперёд, если это последняя категория | ||
if (currentCategoryIndex === categories.length - 1) { | if (currentCategoryIndex === categories.length - 1) { | ||
nextArrow.classList.add('disabled'); | nextArrow.classList.add('disabled'); | ||
nextArrow.style.pointerEvents = 'none'; // Отключение кликов | |||
} else { | } else { | ||
nextArrow.classList.remove('disabled'); | nextArrow.classList.remove('disabled'); | ||
nextArrow.style.pointerEvents = 'auto'; // Включение кликов | |||
} | } | ||
} | } | ||
| Строка 543: | Строка 576: | ||
if (currentCategoryIndex > 0) { | if (currentCategoryIndex > 0) { | ||
currentCategoryIndex = currentCategoryIndex - 1; | currentCategoryIndex = currentCategoryIndex - 1; | ||
switchCategory(currentCategoryIndex); // | switchCategory(currentCategoryIndex); // Переключение на новую категорию | ||
} | } | ||
}); | }); | ||
| Строка 550: | Строка 583: | ||
if (currentCategoryIndex < categories.length - 1) { | if (currentCategoryIndex < categories.length - 1) { | ||
currentCategoryIndex = currentCategoryIndex + 1; | currentCategoryIndex = currentCategoryIndex + 1; | ||
switchCategory(currentCategoryIndex); // | switchCategory(currentCategoryIndex); // Переключение на новую категорию | ||
} | } | ||
}); | }); | ||
// Инициализация: | // Логика для обработки якоря | ||
function openCategoryFromAnchor() { | |||
var hash = window.location.hash.substring(1); // Получение якоря без # | |||
if (!hash) return; // Выход, если якорь пустой | |||
// Попытка найти пункт меню или категорию с соответствующим ID | |||
var targetMenuItem = document.getElementById(hash); | |||
if (targetMenuItem) { | |||
// Если это пункт меню, нужно сначала открыть его категорию | |||
var menu = targetMenuItem.closest('.menu'); | |||
var categoryIndex = Array.from(menus).indexOf(menu); | |||
if (categoryIndex !== -1) { | |||
switchCategory(categoryIndex); | |||
switchContent(targetMenuItem); // Открытие пункта меню | |||
targetMenuItem.scrollIntoView(); // Прокрутка к пункту | |||
} | |||
} else { | |||
// Поиск категории по ID | |||
var targetCategory = document.getElementById(hash); | |||
if (targetCategory) { | |||
var categoryIndex = Array.from(categories).indexOf(targetCategory); | |||
if (categoryIndex !== -1) { | |||
switchCategory(categoryIndex); // Открытие категории | |||
targetCategory.scrollIntoView(); // Прокрутка к категории | |||
} | |||
} | |||
} | |||
} | |||
// Инициализация: открытие первой категории и первого пункта | |||
if (categories.length > 0) { | if (categories.length > 0) { | ||
switchCategory(currentCategoryIndex); | switchCategory(currentCategoryIndex); | ||
updateArrowStates(); | updateArrowStates(); | ||
} | } | ||
// | // Обработка якоря при загрузке | ||
openCategoryFromAnchor(); | |||
// Обработка якоря при изменении URL | |||
window.addEventListener('hashchange', openCategoryFromAnchor); | |||
// Удаление обработчиков кликов на категории | |||
categories.forEach(function(category) { | categories.forEach(function(category) { | ||
category.addEventListener('click', function(event) { | category.addEventListener('click', function(event) { | ||
event.preventDefault(); // | event.preventDefault(); // Предотвращение любого действия при клике | ||
}); | }); | ||
}); | }); | ||
| Строка 570: | Строка 638: | ||
for (var i = 0; i < menuItems.length; i++) { | for (var i = 0; i < menuItems.length; i++) { | ||
menuItems[i].addEventListener('click', function() { | menuItems[i].addEventListener('click', function() { | ||
switchContent(this); | switchContent(this); // Переключение контента при клике на пункт меню | ||
}); | }); | ||
} | } | ||
| Строка 576: | Строка 644: | ||
document.querySelector('.menu-toggle').addEventListener('click', function() { | document.querySelector('.menu-toggle').addEventListener('click', function() { | ||
var menu = document.querySelector('.menu-container'); | var menu = document.querySelector('.menu-container'); | ||
menu.classList.toggle('active'); // | menu.classList.toggle('active'); // Переключение класса для показа/скрытия меню | ||
var toggleButton = document.querySelector('.menu-toggle'); | var toggleButton = document.querySelector('.menu-toggle'); | ||
toggleButton.classList.toggle('active'); // | toggleButton.classList.toggle('active'); // Переключение для перемещения кнопки | ||
}); | }); | ||
} | } | ||