nickolyashka
@nickolyashka

Как реализовать меню на js?

Мне нужно реализовать боковое меню (меню с категориями товаров) как на этом сайте (lust-ra.ru) но проблема у меня с JS. В моей CMS, выводится категории и подкатегории:
<ul class="menu-header">
     <li><a href="#link">Родительская категория 1</a>
           <ul>
                   <li><a href="#link">Подкатегория</a></li>
                   <li><a href="#link">Подкатегория</a></li>
                   <li><a href="#link">Подкатегория</a></li>
          </ul>
</li>
 <li><a href="#link">Родительская категория 2</a>
           <ul>
                   <li><a href="#link">Подкатегория</a></li>
                   <li><a href="#link">Подкатегория</a></li>
                   <li><a href="#link">Подкатегория</a></li>
          </ul>
</li>
 <li><a href="#link">Родительская категория 3</a>
           <ul>
                   <li><a href="#link">Подкатегория</a></li>
                   <li><a href="#link">Подкатегория</a></li>
                   <li><a href="#link">Подкатегория</a></li>
          </ul>
</li>
</ul>

Мне нужно сделать аккардеон, чтобы при нажатии на родительскую категория, открывалась родительская категория и раскрывался список с подкатегориями относящимися к данной категории и чтобы jquery.cookie.js запоминал выбор. Дописать дополнительные классы в структуру не используя js нельзя, да и обходимости я думаю нет (для субкатегорий). Помогите реализовать с меня чашка кофе.
  • Вопрос задан
  • 307 просмотров
Решения вопроса 1
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
Написал для Вас плагин, разбирайтесь, пользуйтесь:
;(function(fab) {
	//UMD definition
	if(define && define.amd) {
		//for AMD
		define(['jquery'], fab);
	} else if(module && module.exports && require) {
		//for CommonJS
		module.exports = fab(require('jquery'));
	} else {
		//no module system
		fab(jQuery);
	}
}(function($) {
	$.fn.menuAccordionCookie = function(cookieName) {
		//jQuery может найти по селектору несколько элементов, применяем ко всем
		$(this).each(function() {
			var $ul = $(this); //самый верхний ul
			var cookie = JSON.parse($.cookie(cookieName) || '{}'); //получаем куку и парсим
			//это хелпер для сохранения куки
			function saveCookie(id, value) {
				if(value) {
					cookie[id] = 1;
				} else {
					delete cookie[id];
				}
				$.cookie(cookieName, JSON.stringify(cookie));
			}
			//получаем все <li> которые являются прямыми потомками нашего <ul> и перебираем их
			$ul.children('li').each(function(id) {
				var $li = $(this);
				var $childUl = $li.children('ul'); //Дочерний <ul>
				var $a = $li.children('a'); // <a>
				if(!$childUl.length) {
					//если в li нет ul то ничего с ним не делаем
					return;
				}
				if(!cookie[id]) {
					//Прячем все для кого не запомнено, что они показаны
					$childUl.hide();
				}
				//click по ссылке
				$a.on('click', function() {
					if(cookie[id]) {
						saveCookie(id, false);
						$childUl.hide();
					} else {
						saveCookie(id, true);
						$childUl.show();
					}
				});
			});
		});
	};
}));

Использование:
$(function() {
    $('.menu-header').menuAccordionCookie('my_accorion_menu');
});
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы