前提
Jqueryで書かれている、多階層のハンバーガーメニューをJsに書き換える練習をしています。
途中までは、上手くいったのですがいくつかの点で躓きました。
1aタグから見た親要素の取得(荒業ですが、クラスを別にして回避しています)
2.toggleなどのclassを取得し、追加または削除する部分のやり方がイマイチ摘めません。
実現したいこと
Jsに書き換えられなかった箇所を、書き換えて正しく動作させたい。
該当のソースコード
HTML
1 <div class="hamburger__btn"><span></span><span></span><span></span></div> 2 <nav class="nav not--svh"> 3 <div class="nav__list--scroll"> 4 <ul class="nav__list"> 5 <li class="nav__item"><a href="index.html">HOME</a></li> 6 <li class="has-child nav__item js1"><a href="#">menu1</a> 7 <ul class="nav__item-child"> 8 <li class="nav__item-child--item"><a href="/Publish/tm/index.html">内容</a></li> 9 </ul> 10 </li> 11 <li class="has-child nav__item js2"><a href="#">menu2</a> 12 <ul class="nav__item-child"> 13 <li class="nav__item-child--item"><a href="/Publish/mm/index.html">介</a></li> 14 </ul> 15 </li> 16 <li class="has-child nav__item js3"><a href="#">menu3</a> 17 <ul class="nav__item-child"> 18 <li class="nav__item-child--item"><a href="/Publish/campus/index.html">キャンパス</a></li> 19 </ul> 20 </li> 21 <li class="nav__item"><a href="/Publish/question.html">よくある質問</a></li> 22 </ul> 23 </div> 24 </nav>
Jquery
1function mediaQueriesWin() { 2 var width = $(window).width(); 3 if (width <= 1025) { 4 $(".has-child>a").off('click'); 5 $(".has-child>a").on('click', function () { 6 var parentElem = $(this).parent(); 7 $(parentElem).toggleClass('active'); 8 $(parentElem).children('ul').stop().slideToggle(500); 9 return false; 10 }); 11 } else { 12 $(".has-child>a").off('click'); 13 $(".has-child>a").removeClass('active'); 14 $('.has-child').children('ul').css("display", ""); 15 16 } 17} 18
JavaScript
1window.addEventListener('load', function () { 2 const width = window.innerWidth; 3 if (width <= 900) { 4 document.querySelector(".has-child>a").onclick = function () { 5 funcList.forEach(function (pair) { 6 pair.el.removeEventListener('click', pair.clickFunc, false); 7 }); 8 } 9 10 // $(".has-child>a").off('click'); //has-childクラスがついたaタグのonイベントを複数登録を避ける為offにして一旦初期状態へ 11 document.querySelector('.js1>a').addEventListener('click', function () { 12 const parentElem1 = document.querySelectorAll('.js1'); 13 parentElem1.classList.toggle("active") 14 // $(parentElem1).toggleClass('active'); 15 $(parentElem1).children('ul').stop().slideToggle(500);//liの子要素のスライドを開閉させる※数字が大きくなるほどゆっくり開く 16 }, 17 false); 18 19 20 document.querySelector('.js2>a').addEventListener('click', function () { 21 const parentElem2 = document.querySelectorAll('.js2'); 22 // var parentElem = $(this).parent();// aタグから見た親要素の<li>を取得し 23 $(parentElem2).toggleClass('active');//矢印方向を変えるためのクラス名を付与して 24 $(parentElem2).children('ul').stop().slideToggle(500);//liの子要素のスライドを開閉させる※数字が大きくなるほどゆっくり開く 25 }, 26 false); 27 28 29 document.querySelector('.js3>a').addEventListener('click', function () { 30 const parentElem3 = document.querySelectorAll('.js3'); 31 // var parentElem = $(this).parent();// aタグから見た親要素の<li>を取得し 32 $(parentElem3).toggleClass('active');//矢印方向を変えるためのクラス名を付与して 33 $(parentElem3).children('ul').stop().slideToggle(500);//liの子要素のスライドを開閉させる※数字が大きくなるほどゆっくり開く 34 }, 35 false); 36 } else {//横幅が960px以上の場合 37 $(".has-child>a").off('click');//has-childクラスがついたaタグのonイベントをoff(無効)にし 38 $(".has-child>a").removeClass('active');//activeクラスを削除 39 $('.has-child').children('ul').css("display", "");//スライドトグルで動作したdisplayも無効化にする 40 } 41});

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。