|
Нужна помощь!
Нужна помощь в реализации выбора города.
Ситуация такая. Есть некая переменная Пхп $siti, в которой выбран город. Есть список городов .list-siti, который выводится из бд(имеет свойство css display: none;). Нужно чтобы при запуске/обновлении страницы проверялось условие : если $siti = 0, тогда .list-siti.active. Выбор города работает при клике на определенный элемент, но нужна проверка именно на пустое значение. Реализация по клику: $('#select-citi2, #select-citi').click(function(event){ $('.list-citis,#heder-top-menu').toggleClass('active'); $('body').toggleClass('lock'); }); |
Город - City
Почему не прокинуть в представление (view) значение вашей переменной и сразу же на сервере не добавить нужному блоку нужный класс? |
Нужно чтобы список открывался только тогда, когда переменная равна нулю. Я не понял ваш вариант.
|
Цитата:
параметр запроса определяющий выбор в списке приведенный к числу (пусть и $siti) определит и стиль списка, и выбор в нем: <select class="list-citis <?=$siti?null:active?>"> в цикле вывода опций <option value="значение из базы" <?=$siti==значению из базы?selected:null?>> Город в английском - city. |
Здравствуйте. Есть код меню который нужно чуть подкорректировать. Дело в том, что при нажатии на кнопку toggle справа выезжает меню. Если на компе или телефоне пытаться прокрутить сайт ниже или при нажатии/клике в любое место на экране, меню тут же исчезает (заезжает на свое место). Т.е. если в меню много пунктов, то нижние пункты невозможно просмотреть, меню просто исчезает.
Помогите пожалуйста изменить код так, чтобы меню заезжало на свое место только при клике на кнопку toggle. (function($) { $.fn.menu = function(opt) { var pos = $(this), set = $.extend({ position: 'right' }, opt); this.each(function() { pos.prepend('<div class="navbar"><strong><a href="'+$.url+'"><img src="/template/'+$.temp+'/images/logo-min.png" alt="'+$.site+'" /></a></strong><button class="toggle" title="Меню"><span></span><span></span><span></span></button></div>'); var m = $('.navbar').next('ul'); function isMenu() { if ($(window).width() <= 900) { m.css({'right':'-300px'}).removeClass('show').hide(); } if ($(window).width() > 900) { m.show(); } } $(document).ready(isMenu); $(window).resize(isMenu); m.css({'right':'-300px'}).removeClass('show').hide(); var n = $('.toggle'); $(this).find(".toggle").on('click', function() { if (m.hasClass('show')) { m.removeClass('show').stop().animate({'right':'-300px'}, 300, function() { m.hide(); }); } else { m.show().addClass('show').stop().animate({'right':'0px'}); } }); $(document).mouseup(function (e){ if ( ! m.is(e.target) && ! n.is(e.target) && m.has(e.target).length === 0 && $(window).width() <= 900) { m.removeClass('show').stop().animate({'right':'-300px'}, 300, function() { m.hide(); }); } }); pos.find('li ul').parent().addClass('ins'); pos.find(".ins").prepend('<span class="item"></span>'); function Res() { if ($(window).width() <= 900) { $('.item').siblings('ul').slideUp().removeClass('show'); } else { $('.item').siblings('ul').slideDown(); } } $(document).ready(Res); $(window).resize(Res); $(this).find('.item').on('click', function() { if ($(this).siblings('ul').hasClass('show')) { $(this).removeClass('open'); $(this).siblings('ul').slideUp(50).removeClass('show'); } else { $(this).addClass('open'); $(this).siblings('ul').slideDown(50).addClass('show'); } }); }); }; })(jQuery); Подозреваю, что менять нужно тут, но не знаю как. $(document).mouseup(function (e){ if ( ! m.is(e.target) && ! n.is(e.target) && m.has(e.target).length === 0 && $(window).width() <= 900) { m.removeClass('show').stop().animate({'right':'-300px'}, 300, function() { m.hide(); }); } }); вместо .mouseup писал .click , пробовал разные варианты, но все без толку. |
zulfukar, Попробуйте заменить строку:
if ( ! m.is(e.target) && ! n.is(e.target) && m.has(e.target).length === 0 && $(window).width() <= 900) { на var $target = $(e.target); if ($(window).width() <= 900 && !$target.is(m) && !$target.has(m).length) { |
без изменений
вот сайт, если захотите посмотреть на работу меню: _http://new.313news.net |
Строка 14. Здесь непонятно зачем скрывать меню, если оно и так позиционируется за пределы клиентской области. Должно быть:
m.css({[set.position]:'-300px'}).removeClass('show'); Кстати, все эти определения можно вынести в CSS. Как и не понятно зачем строка 21, ее можно и удалить, а строки 25-31 заменить одной: m.toggleClass('show').stop().animate({[set.position]:-300 + 300 * m.hasClass('show')}, 300); Что касаемо пропадания меню, вы хотите чтобы на моб. устройствах щелчок вне меню не скрывал его? |
Цитата:
Сделал как Вы написали. Меню по прежнему пропадает при прокрутке страницы или при клике в любое место (кроме меню конечно же). И еще меню появилось справа от сайта его видно при горизонтальной прокрутке (оно не исчезает, а просто расположилось на правой границе сайта и выезжает оттуда при клике на кнопку toggle). Цитата:
|
Цитата:
Если объекту (меню) определяется некий параметр (тут position), то нужно использовать его, какой же смыл явно его прописывать ('right', а надо [set.position]). Тоже самое касается и размера меню (ширины), ее также либо передавать как параметр, либо получать из определения в стилях. Вот этого достаточно чтобы работало и скрывалось на моб. устройствах только кнопкой. (function($) { $.fn.menu = function(opt) { var pos = $(this), set = $.extend({ position: 'right' }, opt); this.each(function() { var b = $('<div class="navbar"><strong><a href="'+$.url+'"><img src="/template/'+$.temp+ '/images/logo-min.png" alt="'+$.site+'" /></a></strong><button class="toggle" title="Меню"><span></span><span></span><span></span></button></div>') .prependTo(pos), //добавляем и находим кнопку, хотя все это может быть уже на странице, а в CSS описать условие когда она будет видима m = pos.children('ul'), //меню w = parseInt(m.css('width')); //ширина меню b.on('click', function() { m.toggleClass('show').stop().animate({[set.position]: -w + w * m.hasClass('show')}, 300); }); function Res() { if ($(window).width() <= 900) { $('.item').siblings('ul').slideUp().removeClass('show'); } else { $('.item').siblings('ul').slideDown(); } } $(document).ready(Res); $(window).resize(Res); $(this).find('.item').on('click', function() { if ($(this).siblings('ul').hasClass('show')) { $(this).removeClass('open'); $(this).siblings('ul').slideUp(50).removeClass('show'); } else { $(this).addClass('open'); $(this).siblings('ul').slideDown(50).addClass('show'); } }); }); }; })(jQuery); PS. Можно toggleClass('show') также убрать, если этот класс не определяет что-либо присущее меню, а скрывать/показывать определять по позиции, то есть: //вместо m.toggleClass('show').stop().animate({[set.position]: -w + w * m.hasClass('show')}, 300); //достаточно m.stop().animate({[set.position]: -w - parseInt(m.css(set.position))}, 300); Если управлять классом, то анимацию задать в CSS, а в JS только m.toggleClass('show') и все. Сказанное "но если удалить строки 12-21, то никакой проблемы это не вызовет" к тому, что с этим кодом либо путаница, либо ошибки (проверка производилась с сохраненной страницы), то есть, при смене ориентации устройства не производит никакого эффекта. Лучше бы это все, как было ранее сказано, определить через CSS, а js, только управление. |
Часовой пояс GMT +3, время: 07:44. |
|