Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.06.2012, 18:20
Аспирант
Отправить личное сообщение для zevilz Посмотреть профиль Найти все сообщения от zevilz
 
Регистрация: 24.05.2012
Сообщений: 93

Проблема с автоскрытием элементов навигации
Имеется вот такая вот структура навигации (Это упрощенный вид):
<ul class='left_nav_menu' id='nav_menu_content'>
	<li><a class='nav_title_n' href='#0'>Категория_1</a>
		<ul class='left_nav_menu' id='sub_cat'>";
			<li><a href="#">Подкатегория_1</a></li>
				<ul id="material_cat">
					<li><a href="view_cat.php?cat=1&subcat=1&material=1">Подподкатегория_1</a></li>
					<li><a href="view_cat.php?cat=1&subcat=1&material=2">Подподкатегория_2</a></li>
					<li><a href="view_cat.php?cat=1&subcat=1&material=3">Подподкатегория_3</a></li>
				</ul>
			</li>
			<li><a href="#">Подкатегория_2</a></li>
				<ul id="material_cat">
					<li><a href="view_cat.php?cat=1&subcat=2&material=4">Подподкатегория_4</a></li>
					<li><a href="view_cat.php?cat=1&subcat=2&material=5">Подподкатегория_5</a></li>
					<li><a href="view_cat.php?cat=1&subcat=2&material=6">Подподкатегория_6</a></li>
				</ul>
			</li>
		</ul>
	</li>
	<li><a class='nav_title_n' href='#0'>Категория_2</a>
		<ul class='left_nav_menu' id='sub_cat'>";
			<li><a href="#">Подкатегория_3</a></li>
				<ul id="material_cat">
					<li><a href="view_cat.php?cat=2&subcat=3&material=7">Подподкатегория_7</a></li>
					<li><a href="view_cat.php?cat=2&subcat=3&material=8">Подподкатегория_8</a></li>
					<li><a href="view_cat.php?cat=2&subcat=3&material=9">Подподкатегория_9</a></li>
				</ul>
			</li>
			<li><a href="#">Подкатегория_4</a></li>
				<ul id="material_cat">
					<li><a href="view_cat.php?cat=2&subcat=4&material=10">Подподкатегория_10</a></li>
					<li><a href="view_cat.php?cat=2&subcat=4&material=11">Подподкатегория_11</a></li>
					<li><a href="view_cat.php?cat=2&subcat=4&material=12">Подподкатегория_12</a></li>
				</ul>
			</li>
		</ul>
	</li>
</ul>

При помощи скрипта (не моего):
$(document).ready(function() {
	$('ul#nav_menu_content ul').each(function(i) { // Check each submenu:
		if ($.cookie('submenuMark-' + i)) {  // If index of submenu is marked in cookies:
			$(this).show().prev().removeClass('collapsed').addClass('expanded'); // Show it (add apropriate classes)
		}else {
			$(this).hide().prev().removeClass('expanded').addClass('collapsed'); // Hide it
		}
		$(this).prev().addClass('collapsible').click(function() { // Attach an event listener
			var this_i = $('ul#nav_menu_content ul').index($(this).next()); // The index of the submenu of the clicked link
			if ($(this).next().css('display') == 'none') {
				
				// When opening one submenu, we hide all same level submenus:
				$(this).parent('li').parent('ul').find('ul').each(function(j) {
					if (j != this_i) {
						$(this).slideUp(200, function () {
							$(this).prev().removeClass('expanded').addClass('collapsed');
							cookieDel($('ul#nav_menu_content ul').index($(this)));
						});
					}
				});
				// :end
				
				$(this).next().slideDown(200, function () { // Show submenu:
					$(this).prev().removeClass('collapsed').addClass('expanded');
					cookieSet(this_i);
				});
			}else {
				$(this).next().slideUp(200, function () { // Hide submenu:
					$(this).prev().removeClass('expanded').addClass('collapsed');
					cookieDel(this_i);
					$(this).find('ul').each(function() {
						$(this).hide(0, cookieDel($('ul#nav_menu_content ul').index($(this)))).prev().removeClass('expanded').addClass('collapsed');
					});
				});
			}
		return false; // Prohibit the browser to follow the link address
		});
	});
});
function cookieSet(index) {
	$.cookie('submenuMark-' + index, 'opened', {expires: null, path: '/'}); // Set mark to cookie (submenu is shown):
}
function cookieDel(index) {
	$.cookie('submenuMark-' + index, null, {expires: null, path: '/'}); // Delete mark from cookie (submenu is hidden):
}

скрываются все пункты навигации. В кукисах сохраняется, какие пункты навигации были открыты в последний раз. Также в скрипте прописано что при открытии категории все подкатегории других категорий автоматически скрываются. Проблема состоит в том, что я добавил в навигацию подподкатегории, и скрипт для них не работает. Что необходимо прописать, чтобы при открытии одной подкатегории подподкатегории других подкатегорий автоматически скрывались. А также чтобы при открытии категории скрывались все элементы другой категории, а не только подкатегории.

Последний раз редактировалось zevilz, 18.06.2012 в 18:23.
Ответить с цитированием
  #2 (permalink)  
Старый 18.06.2012, 19:26
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

zevilz,
Создайте работоспособный кусок кода (скрипты и HTML, подключите библиотеку , к примеру так
Цитата:
<script type="text/javascript" src="http://yandex.st/jquery/1.4.4/jquery.min.js"></script>
Все вместе заключите в теги
[HTML run][/HTML]
Если код хоть как то будет работать здесь в топике - поправлю
Ответить с цитированием
  #3 (permalink)  
Старый 18.06.2012, 20:31
Аспирант
Отправить личное сообщение для zevilz Посмотреть профиль Найти все сообщения от zevilz
 
Регистрация: 24.05.2012
Сообщений: 93

<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript">
jQuery.cookie = function(name, value, options) {
    if (typeof value != 'undefined') { // name and value given, set cookie
        options = options || {};
        if (value === null) {
            value = '';
            options.expires = -1;
        }
        var expires = '';
        if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
            var date;
            if (typeof options.expires == 'number') {
                date = new Date();
                date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
            } else {
                date = options.expires;
            }
            expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
        }
        // CAUTION: Needed to parenthesize options.path and options.domain
        // in the following expressions, otherwise they evaluate to undefined
        // in the packed version for some reason...
        var path = options.path ? '; path=' + (options.path) : '';
        var domain = options.domain ? '; domain=' + (options.domain) : '';
        var secure = options.secure ? '; secure' : '';
        document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
    } else { // only name given, get cookie
        var cookieValue = null;
        if (document.cookie && document.cookie != '') {
            var cookies = document.cookie.split(';');
            for (var i = 0; i < cookies.length; i++) {
                var cookie = jQuery.trim(cookies[i]);
                // Does this cookie string begin with the name we want?
                if (cookie.substring(0, name.length + 1) == (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    }
};
</script>
<script type="text/javascript">
$(document).ready(function() {
	$('ul#nav_menu_content ul').each(function(i) { // Check each submenu:
		if ($.cookie('submenuMark-' + i)) {  // If index of submenu is marked in cookies:
			$(this).show().prev().removeClass('collapsed').addClass('expanded'); // Show it (add apropriate classes)
		}else {
			$(this).hide().prev().removeClass('expanded').addClass('collapsed'); // Hide it
		}
		$(this).prev().addClass('collapsible').click(function() { // Attach an event listener
			var this_i = $('ul#nav_menu_content ul').index($(this).next()); // The index of the submenu of the clicked link
			if ($(this).next().css('display') == 'none') {
				
				// When opening one submenu, we hide all same level submenus:
				$(this).parent('li').parent('ul').find('ul').each(function(j) {
					if (j != this_i) {
						$(this).slideUp(200, function () {
							$(this).prev().removeClass('expanded').addClass('collapsed');
							cookieDel($('ul#nav_menu_content ul').index($(this)));
						});
					}
				});
				// :end
				
				$(this).next().slideDown(200, function () { // Show submenu:
					$(this).prev().removeClass('collapsed').addClass('expanded');
					cookieSet(this_i);
				});
			}else {
				$(this).next().slideUp(200, function () { // Hide submenu:
					$(this).prev().removeClass('expanded').addClass('collapsed');
					cookieDel(this_i);
					$(this).find('ul').each(function() {
						$(this).hide(0, cookieDel($('ul#nav_menu_content ul').index($(this)))).prev().removeClass('expanded').addClass('collapsed');
					});
				});
			}
		return false; // Prohibit the browser to follow the link address
		});
	});
});
function cookieSet(index) {
	$.cookie('submenuMark-' + index, 'opened', {expires: null, path: '/'}); // Set mark to cookie (submenu is shown):
}
function cookieDel(index) {
	$.cookie('submenuMark-' + index, null, {expires: null, path: '/'}); // Delete mark from cookie (submenu is hidden):
}
</script>
</head>
<body>


<ul class='left_nav_menu' id='nav_menu_content'>
	<li><a href='#0'>Категория_1</a>
		<ul>
			<li><a href="#">Подкатегория_1</a>
				<ul>
					<li><a href="view_cat.php?...">Подподкатегория_1</a></li>
				</ul>
			</li>
			<li><a href="#">Подкатегория_2</a>
				<ul>
					<li><a href="view_cat.php?...">Подподкатегория_2</a></li>
					<li><a href="view_cat.php?...">Подподкатегория_3</a></li>
				</ul>
			</li>
			<li><a href="#">Подкатегория_3</a>
				<ul>
					<li><a href="view_cat.php?...">Подподкатегория_4</a></li>
					<li><a href="view_cat.php?...">Подподкатегория_5</a></li>
				</ul>
			</li>
		</ul>
	</li>
	<li><a href='#0'>Категория_2</a>
		<ul>
			<li><a href="#">Подкатегория_4</a>
				<ul class="material_cat">
					<li><a href="view_cat.php?...">Подподкатегория_6</a></li>
				</ul>
			</li>
		</ul>
	</li>
</ul>
</body>
</html>

Последний раз редактировалось zevilz, 18.06.2012 в 20:40.
Ответить с цитированием
  #4 (permalink)  
Старый 18.06.2012, 20:45
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

zevilz,
У меня в Опере всё работает - какой браузер ?
Ответить с цитированием
  #5 (permalink)  
Старый 18.06.2012, 20:57
Аспирант
Отправить личное сообщение для zevilz Посмотреть профиль Найти все сообщения от zevilz
 
Регистрация: 24.05.2012
Сообщений: 93

Немного подкорректировал код. Сейчас при открытии категории скрываются все элементы другой категории. Проблема только с подкатегориями. Если, например, открыть сначала Подкатегория_3 и потом Подкатегория_2, то Подкатегория_3 не закроется. Так же если открыть сначала Подкатегория_2 и потом Подкатегория_1, то Подкатегория_2 не закроется. А если в обратном порядке, то все нормально. А если открыть Подкатегория_3, а затем Подкатегория_1, то Подкатегория_3 закроется. И наоборот. Короче не закрывается подкатегория, которая находится ниже открываемой подкатегории. Во всех остальных случаях все нормально. Где косяк?

Последний раз редактировалось zevilz, 18.06.2012 в 21:01.
Ответить с цитированием
  #6 (permalink)  
Старый 18.06.2012, 21:02
Аспирант
Отправить личное сообщение для zevilz Посмотреть профиль Найти все сообщения от zevilz
 
Регистрация: 24.05.2012
Сообщений: 93

Хром, Опера, ФФ - везде одинаково
Ответить с цитированием
  #7 (permalink)  
Старый 18.06.2012, 21:53
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

zevilz,
Вы чот делаете - Сложно сочиненное
При скрытой категории - добавляете ей(тегу li) класс - Hiden
При открытой - удаляете данный класс
Далее сss
li.Hiden ul{
display:none;
}
Ответить с цитированием
  #8 (permalink)  
Старый 18.06.2012, 22:20
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

<!doctype html>
<html>
<head>
<meta charset="UTF-8">

<style>
    #nav_menu_content ul {
        display: none;
    }
</style>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript">

    $(function(){

        var nav = $("#nav_menu_content"),
            uls = nav.find("ul");

        nav.find("a").click(function() {

            var self = $(this).next();

            if ( self.length  > 0 ) {

                uls.each(function(){

                    if ( this === self[0] ) {
                        $( this ).slideToggle( 200 );
                    } else if ( jQuery.inArray( this, self.parents( "ul" ) ) == -1 ) {
                        $( this ).slideUp( 200 );
                    }
                });

                return false;

            }

        });

    });

</script>
</head>
<body>
<ul class='left_nav_menu' id='nav_menu_content'>
    <li><a href='#0'>Категория_1</a>
        <ul>
            <li><a href="#">Подкатегория_1</a>
                <ul>
                    <li><a href="view_cat.php?...">Подподкатегория_1</a></li>
                </ul>
            </li>
            <li><a href="#">Подкатегория_2</a>
                <ul>
                    <li><a href="view_cat.php?...">Подподкатегория_2</a></li>
                    <li><a href="view_cat.php?...">Подподкатегория_3</a></li>
                </ul>
            </li>
            <li><a href="#">Подкатегория_3</a>
                <ul>
                    <li><a href="view_cat.php?...">Подподкатегория_4</a></li>
                    <li><a href="view_cat.php?...">Подподкатегория_5</a></li>
                </ul>
            </li>
        </ul>
    </li>
    <li><a href='#0'>Категория_2</a>
        <ul>
            <li><a href="#">Подкатегория_4</a>
                <ul class="material_cat">
                    <li><a href="view_cat.php?...">Подподкатегория_6</a></li>
                </ul>
            </li>
        </ul>
    </li>
</ul>
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine

Последний раз редактировалось devote, 19.06.2012 в 22:09.
Ответить с цитированием
  #9 (permalink)  
Старый 18.06.2012, 22:33
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

devote, + Ток куки забыл , чел вряд ли подсунет

Воть есть коротенькие
Цитата:
function setcookie(a,b,c) {if(c){var d = new Date();d.setTime(d.getTime()+c);}if(a && b) document.cookie = a+'='+b+(c ? '; expires='+d.toUTCString() : '');else return false;}
function getcookie(a) {var b = new RegExp(a+'=([^;]){1,}');var c = b.exec(document.cookie);if(c) c = c[0].split('=');else return false;return c[1] ? c[1] : false;}
==========
setcookie(Name,val,3600*24*1000); //Пример с Таймом на один день
Стереть
setcookie(Name,val,-1000);

Последний раз редактировалось Deff, 18.06.2012 в 22:42.
Ответить с цитированием
  #10 (permalink)  
Старый 18.06.2012, 22:36
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от Deff Посмотреть сообщение
devote, + Ток куки забыл , чел вряд ли подсунет
я ему подал идею, дальше думаю сам разберется.
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с добавлением элементов в DIV (appendChild) Metallic Events/DOM/Window 6 01.02.2014 21:44
Проблема с отрисовкой элементов Alt jQuery 0 30.01.2012 18:36
Как выводить часть элементов страницы через javascript Victim Events/DOM/Window 9 28.12.2011 22:51
Проблема с получением атрибутов элементов из набора Nightwalker_nsk jQuery 2 17.05.2011 08:32
Проблема с Dialog. Блокировка элементов формы Vitus jQuery 1 28.02.2011 10:17