2017-02-25 4 views
3

リンクをクリックするとメニューが閉じます。私のコードがうまくいかない理由がありますか? jsbinリンクをクリックするとメニューが閉じます

document.getElementById("menu").addEventListener("click",function(e) { 
 
    if(e.target && e.target.nodeName == "LI") { 
 
    console.log("ok"); 
 
    menu.style.display = "none"; 
 
    } 
 
});
<ul class="nav__right" id="menu"> 
 
    <li> 
 
    <h3><a href="#home">home</a></h3> 
 
    </li> 
 
    <li> 
 
    <h3><a href="#about">À propos</a></h3> 
 
    </li> 
 
    <li> 
 
    <h3><a href="#production">Réalisations</a></h3> 
 
    </li> 
 
    <li> 
 
    <h3><a href="#contact">Contact</a></h3> 
 
    </li> 
 
</ul>

+0

あなたはそれをクリックしたかどう 'li'要素を非表示にしたいですか? –

+0

'e.stopPropagation();を試してください – Fr33d0m

+0

@ Fr33d0m条件が満たされていないという問題があります。 –

答えて

1

e.target.nodeName戻りAあなたはLIとそれを比較しているのに対し。クリックされた要素の

document.getElementById("menu").addEventListener("click",function(e) { 
 
    console.log(e.target.nodeName); 
 
    if(e.target && e.target.nodeName == "A") { 
 
    console.log("ok"); 
 
    this.style.display = "none"; 
 
    } 
 
});
<ul class="nav__right" id="menu"> 
 
    <li> 
 
    <h3><a href="#home">home</a></h3> 
 
    </li> 
 
    <li> 
 
    <h3><a href="#about">À propos</a></h3> 
 
    </li> 
 
    <li> 
 
    <h3><a href="#production">Réalisations</a></h3> 
 
    </li> 
 
    <li> 
 
    <h3><a href="#contact">Contact</a></h3> 
 
    </li> 
 
</ul>

1

次の2つの愚かなミスを持っています。まず、menuは未定義の変数です。あなたは明らかにdocument.getElementById('menu')を意味しました。最後に、nodeNameメソッドは "LI"ではなく "A"を返します。

document.getElementById("menu").addEventListener("click",function(e) { 
 
    if(e.target && e.target.nodeName == "A") { 
 
    console.log("ok"); 
 
    this.style.display = "none"; 
 
    } 
 
});
<ul class="nav__right" id="menu"> 
 
    <li> 
 
    <h3><a href="#home">home</a></h3> 
 
    </li> 
 
    <li> 
 
    <h3><a href="#about">À propos</a></h3> 
 
    </li> 
 
    <li> 
 
    <h3><a href="#production">Réalisations</a></h3> 
 
    </li> 
 
    <li> 
 
    <h3><a href="#contact">Contact</a></h3> 
 
    </li> 
 
</ul>

+0

'document.getElementById(" menu ")'を2回実行する必要はありません。 'this.style.display = 'none''が行います。 – Fahmi

+0

あまりにもうまく動作します。コードを編集しました。ありがとうございました。 –

0

あなたがHTML

<li> 
     <h3><a href="#home">home</a></h3> 
</li> 

を見ればあなたの条件はactuallly間違っている:ここでは修正されたコードです。 LIをチェックするだけです。クリックがどこにあっても、リンク上(A)または行全体(H3)になることがあります。

document.getElementById("menu").addEventListener("click",function(e) { 

if((e.target) && (e.target.nodeName == "LI" || e.target.nodeName == "H3" ||e.target.nodeName == "A")){ 
    console.log("ok"); 
    this.style.display = "none"; 
} 
}); 

DEMO

+0

'document.getElementById(" menu ")'を2回行う必要はありません。 'this.style.display = 'none''が行います。 @Fahmi True。 – Fahmi

+0

ペーストされたOPコードをコピーするだけです。ありがとう。修正された、 –

0
<ul class="nav__right" id="menu"> 
    <li> 
    <h3><a href="#home">home</a></h3> 
    </li> 
    <li> 
    <h3><a href="#about">À propos</a></h3> 
    </li> 
    <li> 
    <h3><a href="#production">Réalisations</a></h3> 
    </li> 
    <li> 
    <h3><a href="#contact">Contact</a></h3> 
    </li> 
</ul> 

$(function() { 
    var sf_menu_sub = $('.nav__right'); 
    $('.nav__right').on('click', function (e) { 
     e.stopPropagation(); 
     sf_menu_sub.hide(); 
    }); 
    $(document).on('click', function (e) { 
     sf_menu_sub.hide(); 
    }); 
}); 
0

.nodeNameAあるLIの子供はあなたがこのようにそれを一致させることができますH3の子:

e.target.parentNode.parentNode.nodeName == "LI"

することができますまた、追加チェックを追加する場合は

  • e.target.parentNode.nodeName == "H3"
  • e.target.nodeName == "A"
関連する問題