Подсветка пункта меню - ч.3
Как правильно перенести функционал скрипта №2 в скрипт №1 ? :blink:
Есть скрипт №1
function openLevel(e) {
$('.originalmenu span.ttnavigation').addClass('e');
alert('Скрипт сработал');
e.preventDefault();}
};
Вызывается по клику <a onclick="openLevel(event); href="#">Пункт меню 1 уровня</a> Еcть доп скрипт #2
$('.originalmenu span.ttnavigation').click(function(){
if ($(this).hasClass('ttopen')) {varche = true} else {varche = false};
if(varche == false){
$(this).addClass("ttopen");
$(this).parent().addClass('active_m');
$(this).removeClass("ttclose");
$(this).parent().children('ul').slideDown();
varche = true;
} else {
$(this).removeClass("ttopen");
$(this).parent().removeClass('active_m');
$(this).addClass("ttclose");
$(this).parent().children('ul').slideUp();
varche = false;
}
});
Вызывается из <span class="ttnavigation ttopen"><a href="javascript:void(0)"></a></span> Как правильно перенести функционал скрипта №2 в скрипт №1 ? :blink: <ul id="ma-mobilemenu" class="mobilemenu originalmenu nav-collapse collapse expand_menu"> -----------Блок меню 1---------------------- <li class="had_child"> <a href="#">Пункт меню 1 уровня</a> <ul style="display: block;"> <li><a href="#"><span>Пункт меню 2 уровня</span></a></li> <li><a href="#"><span>Пункт меню 2 уровня</span></a></li> <li><a href="#"><span>Пункт меню 2 уровня</span></a></li> <li><a href="#"><span>Иван-чай</span></a></li> <li><a href="#"><span>Пункт меню 2 уровня</span></a></li> </ul> <span class="ttnavigation ttopen"><a href="javascript:void(0)"></a></span> </li> -----------Блок меню 2---------------------- <li class="had_child"> <a href="#">Пункт меню 1 уровня</a> <ul style="display: none;"> <li><a href="#"><span>Пункт меню 2 уровня</span></a></li> <li><a href="#"><span>Пункт меню 2 уровня</span></a></li> <li><a href="#"><span>Пункт меню 2 уровня</span></a></li> <li><a href="#"><span>Пункт меню 2 уровня</span></a></li> <li><a href="#"><span>Пункт меню 2 уровня</span></a></li> </ul> <span class="ttnavigation ttclose"><a href="javascript:void(0)"></a></span> </li> И так далее </ul> |
Подозреваю что всё просто.. а как не знаю :(
|
|
Ничего не понял :( можно на моём примере разжевать?
|
Цитата:
|
Исходные данные
<ul style="display: none;"> ..... <span class="ttnavigation ttclose"><a href="javascript:void(0)"></a></span> Кликаем сюда <a onclick="openLevel(event); href="#">Пункт меню 1 уровня</a> Значения меняются вот здесь на <ul style="display:[B] block[/B];"> ..... <span class="ttnavigation [B]ttopen[/B]"><a href="javascript:void(0)"></a></span> Кликаем в другой блок с меню имеющий исходные данные то в предыдущем меняются на <ul style="display:[B] none[/B];"> ..... <span class="ttnavigation [B]ttclose[/B]"><a href="javascript:void(0)"></a></span> а в текущем <ul style="display:[B] block[/B];"> ..... <span class="ttnavigation [B]ttopen[/B]"><a href="javascript:void(0)"></a></span> |
oslayer,
<!DOCTYPE html>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<style type="text/css">
.ttclose{
background-color: #FF0000;
}
.ttopen{
background-color: #228B22;
}
.ttnavigation:after{
content: "span";
color: #FFFFFF;
}
.had_child > ul{
display: none;
}
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script>
$(function() {
var had_child = $(".had_child");
had_child.on("click", ">a", function(event) {
event.preventDefault();
var parent = $(this).parent()
parent.find("ul").toggle();
parent.find(".ttnavigation").toggleClass("ttopen ttclose")
var other_block = had_child.not(parent)
other_block.find("ul").hide();
other_block.find(".ttnavigation").removeClass("ttopen").addClass("ttclose");
})
});
</script>
</head>
<body>
<ul id="ma-mobilemenu" class="mobilemenu originalmenu nav-collapse collapse expand_menu">
-----------Блок меню 1----------------------
<li class="had_child">
<a href="#">Пункт меню 1 уровня</a>
<ul>
<li><a href="#"><span>Пункт меню 2 уровня</span></a></li>
<li><a href="#"><span>Пункт меню 2 уровня</span></a></li>
<li><a href="#"><span>Пункт меню 2 уровня</span></a></li>
<li><a href="#"><span>Иван-чай</span></a></li>
<li><a href="#"><span>Пункт меню 2 уровня</span></a></li>
</ul>
<span class="ttnavigation ttclose"><a href="javascript:void(0)"></a></span>
</li>
-----------Блок меню 2----------------------
<li class="had_child">
<a href="#">Пункт меню 1 уровня</a>
<ul>
<li><a href="#"><span>Пункт меню 2 уровня</span></a></li>
<li><a href="#"><span>Пункт меню 2 уровня</span></a></li>
<li><a href="#"><span>Пункт меню 2 уровня</span></a></li>
<li><a href="#"><span>Пункт меню 2 уровня</span></a></li>
<li><a href="#"><span>Пункт меню 2 уровня</span></a></li>
</ul>
<span class="ttnavigation ttclose"><a href="javascript:void(0)"></a></span>
</li>
</ul>
</body>
</html>
|
Скрипт работает, ура!
Можно пояснить как и почему? Здесь по классу .Had_child ловим 1 потомка? с тэгом <a > и обрабатываем событие - клик А если тэгов <a> будет больше? то как это будет отрабатывать? или это любой тэг <a> в классе Had_child?
var had_child = $(".had_child");
had_child.on("click", ">a", function(event)
event.preventDefault();Предотвращаем переход по ссылке Можно описание(логику) работы вот этого блока подробнее?
var parent = $(this).parent()
parent.find("ul").toggle();
parent.find(".ttnavigation").toggleClass("ttopen ttclose")
$(function() {
var had_child = $(".had_child");
had_child.on("click", ">a", function(event) {
event.preventDefault();
var parent = $(this).parent()
parent.find("ul").toggle();
parent.find(".ttnavigation").toggleClass("ttopen ttclose")
var other_block = had_child.not(parent)
other_block.find("ul").hide();
other_block.find(".ttnavigation").removeClass("ttopen").addClass("ttclose");
|
Цитата:
Цитата:
Цитата:
var had_child = $(".had_child"); //все блоки
had_child.on("click", ">a", function(event) { //клик на конкретном блоке по ссылке первого уровня
event.preventDefault();// отмена перехода по ссылке
var parent = $(this).parent()// нашли блок в котором был клик
parent.find("ul").toggle();// нашли ul в блоке и открыли или закрыли
parent.find(".ttnavigation").toggleClass("ttopen ttclose")//нашли span и добавили или удалили классы
var other_block = had_child.not(parent) // нашли все блоки кроме этого
other_block.find("ul").hide();// в других блоках нашли ul и закрыли
other_block.find(".ttnavigation").removeClass("ttopen").addClass("ttclose");//нашли span в других блоках и удалии класс ttopen добавили ttclose
})
|
Цитата:
Цитата:
А ещё можно использовать :focus-within, хотя смысл немного другой
<style type="text/css">
.had_child:not(:focus-within) .ttnavigation{
background-color: #FF0000;
}
.had_child:focus-within .ttnavigation{
background-color: #228B22;
}
.ttnavigation::after {
content: "span";
color: #FFFFFF;
}
.had_child:not(:focus-within) > ul {
display: none;
}
.had_child > a { pointer-events: none; }
</style>
<ul id="ma-mobilemenu" class="mobilemenu originalmenu nav-collapse collapse expand_menu">
-----------Блок меню 1----------------------
<li class="had_child" tabindex="0">
<a role="button">Пункт меню 1 уровня</a>
<ul>
<li><a href="#"><span>Пункт меню 2 уровня</span></a></li>
<li><a href="#"><span>Пункт меню 2 уровня</span></a></li>
<li><a href="#"><span>Пункт меню 2 уровня</span></a></li>
<li><a href="#"><span>Иван-чай</span></a></li>
<li><a href="#"><span>Пункт меню 2 уровня</span></a></li>
</ul>
<span class="ttnavigation"><a role="button"></a></span>
</li>
-----------Блок меню 2----------------------
<li class="had_child" tabindex="0">
<a role="button">Пункт меню 1 уровня</a>
<ul>
<li><a href="#"><span>Пункт меню 2 уровня</span></a></li>
<li><a href="#"><span>Пункт меню 2 уровня</span></a></li>
<li><a href="#"><span>Пункт меню 2 уровня</span></a></li>
<li><a href="#"><span>Пункт меню 2 уровня</span></a></li>
<li><a href="#"><span>Пункт меню 2 уровня</span></a></li>
</ul>
<span class="ttnavigation"><a role="button"></a></span>
</li>
</ul>
|
| Часовой пояс GMT +3, время: 16:16. |