Javascript 外部设置显示样式会导致onclick()事件两次单击进行初始化
为什么我们必须设置Javascript 外部设置显示样式会导致onclick()事件两次单击进行初始化,javascript,html,css,Javascript,Html,Css,为什么我们必须设置display:none
display:none第一次单击时,onclick()
通过外部设置,代码可以工作,但需要两次单击才能初始化,一次单击设置事件处理程序,另一次单击触发事件处理程序。我的代码是这样的:
功能子菜单(){
Menu=document.getElementById('Menu');
sub=document.getElementById('sub');
函数显示(){
如果(sub.style.display=='none'){
sub.style.display=“内联块”;
}否则{
sub.style.display=“无”;
}
}
菜单.addEventListener(“单击”,显示);
}
函数pageLoad(){
子菜单();
}
nav{
位置:相对位置;
保证金:0自动;
前-60%;
左:24%;
显示:块;
宽度:33%;
身高:20%;
}
导航ul{
列表样式类型:无;
宽度:100%;
显示:块;
}
李国荣{
宽度:100%;
颜色:#888;
z指数:0;
显示:块;
字号:1.5em;
}
海军ulli a{
文字装饰:无;
颜色:#888;
}
#潜艇{
宽度:120%;
位置:绝对位置;
最高:230%;
z指数:1;
显示:无;
背景色:rgba(51,51,51,0.8);
保证金:0自动;
}
#子里{
利润上限:3倍;
填充:2px;
宽度:100%;
不透明度:2;
}
如果要在CSS中设置显示的样式,则从子样式开始。显示将是一个空字符串,但是如果使用style属性在元素上设置它,则它将具有您给定的值。您可以通过检查值是否为空字符串来解决这个问题,但接下来您必须了解这对应用程序意味着什么(基于CSS中的初始值)
我想在这里提出一个替代方案,该方案也适用于其他场景,并且不需要更改样式属性,而是依赖于更改元素的类
如果要添加一些CSS以隐藏默认子菜单,并添加一个可以切换菜单以使其可见的类:
nav ul ul {
display: none;
}
nav .active {
display: block;
}
使用下面的JS切换类
var menu = document.getElementById('menu');
var sub = document.getElementById('sub');
function toggleMenu(){
sub.classList.toggle('active');
}
menu.addEventListener('click', toggleMenu);
通过这种方式,您可以轻松地调整代码,以便对多个子菜单执行此操作,因此这里还有另一个更通用的示例,它允许您拥有多个菜单和子菜单
e、 g
HTML
JS
var menus=document.querySelectorAll('.menu');
功能切换菜单(e){
var目标=e.target;
//只关心单击父列表项。
if(target.className.indexOf('parent')=-1){
返回;
}
//使用querySelector查找此父级中的第一个
var子菜单=target.querySelector('ul');
如果(子菜单){
子菜单.classList.toggle('active');
}
}
//向每个菜单添加一个单击处理程序
菜单。forEach(功能(菜单){
menu.addEventListener(“单击”,切换菜单);
});
另请注意,您的html不正确。您已经终止了li
--菜单-
,然后再往下一步,您再次终止了它,谢谢@KScandrett我错过了:/
<nav class="menu">
<ul>
<li class="parent"> - Menu 1 -
<ul>
<li><a href="#sub">sub menu 1</a></li>
<li><a href="#sub">sub menu 1</a></li>
</ul>
</li>
<li class="parent"> - Menu 2 -
<ul>
<li><a href="#sub">sub menu 2</a></li>
<li><a href="#sub">sub menu 2</a></li>
</ul>
</li>
</ul>
</nav>
.menu ul ul { display: none; }
.menu .active {
display: block;
}
var menus = document.querySelectorAll('.menu');
function toggleMenu(e){
var target = e.target;
// only care about clicks on parent list items.
if (target.className.indexOf('parent') === -1) {
return;
}
// use querySelector to find the first <ul> inside this parent <li>
var submenu = target.querySelector('ul');
if (submenu) {
submenu.classList.toggle('active');
}
}
// add a click handler to each menu
menus.forEach(function(menu) {
menu.addEventListener('click', toggleMenu);
});