有没有比这更好的方法只用JavaScript创建一个切换函数(根本没有JQuery)
Is there a better way than this to create a toggle function just with JavaScript (no JQuery at all)?
我有一个 ul 形式的导航栏,其中包含多个 li 元素,最后一个 li(名为"more")以另一个 ul 的形式有自己的子菜单。 我正在尝试(并成功)使子菜单的原始状态为可见性:可见;然后当用户单击李名称"更多"时,它将在可见性之间切换:可见;和可见性:隐藏;我使用了JavaScript和一个带有if语句的计数器。 我之所以使用计数器,是因为当我尝试时:
if(document.querySelector('#subMenu').style.visibility == "hidden")...;
但它不会切换。
我的问题是:
这种创建切换功能的方法在专业的前端开发人员工作场所中是否被认为是可以接受的?
有没有更好的方法可以在使用 JavaScript 仅单击元素时在可见和隐藏之间切换(尝试在 JavaScript 方面做得更好)?
如下(我只包含相关代码):
.HTML
<ol id = "leftNav" class = "bothNavs">
<li class = "navs" id = "more">More<div class = "arrow"></div>
<ul class = "subMenu">
<li>One</li>
<li>Two</li>
<li>Three</li>
</ul>
</li>
</ol>
.CSS
.subMenu {
width: 160%;
padding: 5px 0px;
padding-left: 7px;
margin-left: 6px;
position: absolute;
top: 100%;
left:0px;
visibility: hidden;
box-shadow: 0px 2px 3px rgba(0,0,0,0.2);
background: #2D2D2D;
list-style: outside none none;
z-index: 1001;
}
JavaScript
var more = document.querySelector('#more');
var subMenu = document.querySelector('.subMenu');
var counter =0;
more.addEventListener("click", toggle);
function toggle () {
if(counter === 0){
subMenu.style.visibility = "visible";
counter += 1;
} else {
subMenu.style.visibility = "hidden";
counter -= 1;
}
};
提前感谢您的回答。
我觉得切换可见性(或任何样式)的更好方法是切换类。
在你的 CSS 中考虑这样的事情:
.subMenu.is-visible {
visibility: visible;
}
那么你的函数只需要看起来像这样:
var menu = document.querySelector('.subMenu');
document.getElementById('more').addEventListener('click', function () {
menu.classList.toggle('is-visible');
}, false);
对于切换,您应该使用布尔值而不是 int:
var more = document.querySelector('#more');
var subMenu = document.querySelector('.subMenu');
var clicked = false;
more.addEventListener("click", function(evt) {
// This is called a ternary operator, it's basically
// a really simple if/else statement
subMenu.style.visibility = (clicked) ? "visible " : "hidden";
// This will set clicked to the opposite (not) value of what
// it currently is. Being that we're using a boolean
// it will toggle true/false
clicked = !clicked;
});
您还应该阅读(并投票支持)此内容 - 可见性:隐藏和显示:无之间有什么区别?
不应在
<li>
元素中嵌入<ul>
。有各种各样的原因,但主要是它扰乱了层次结构并使HTML的意义降低。
同样,上次我必须解决这个问题时,它最终看起来像这样:
var subMenu = document.querySelector('.subMenu');
if (clicked) {
subMenu.style.visibility = "visible";
} else {
subMenu.style.visibility = "hidden";
}
考虑将其设为 id 而不是类,以防您有其他干扰的子菜单。
如果您真的不需要计数器,请使用布尔值:
var more = document.querySelector('#more');
var subMenu = document.querySelector('.subMenu');
more.addEventListener("click", toggle);
function toggle () {
subMenu.style.visibility = subMenu.style.visibility != "hidden" ? "hidden" : "visible";
};
.subMenu {
width: 60%;
background: #2D2D2D;
list-style: outside none none;
color: white
}
<ol id = "leftNav" class = "bothNavs">
<li class = "navs" id = "more">More<div class = "arrow"></div>
<ul class = "subMenu" style="visibility: hidden">
<li>One</li>
<li>Two</li>
<li>Three</li>
</ul>
</li>
</ol>
理想情况下,您可以修改此代码以切换类而不是内联 CSS 样式,正如 James 在他的答案中所建议的那样。
相关文章:
- 我可以在json对象中添加一个函数吗
- 如何在JQuery函数中定义一个值,然后调用另一个函数并使用该值
- 是否可以将一个函数输入连接到另一个函数调用的文本
- 在另一个函数中使用变量this
- 在另一个函数成功结束后调用该函数
- mongoose.connect undefined不是一个函数
- 监听器必须是一个函数
- 使用JS函数来使用另一个函数的语法?node.js
- 如何取消object.prototypes javascript的一个函数
- 从Chrome扩展名中的popup.html文件在background.js文件中运行一个函数
- 嵌套到另一个函数中的Fancybox函数;不起作用
- 如何在javascript中使用不止一个函数
- jQuery-在页面加载时执行一个函数
- jquery UI draggable:UI.children不是一个函数
- jQuery Mobile Undefined不是一个函数
- 如何在php中创建一个函数,该函数与文本区域一起工作,通过输入类似[color:red]的内容来打印具有等效颜色的文本
- javascript函数将数据添加到屏幕,但随后被另一个函数覆盖
- JS异常:animate不是一个函数
- 如何将一个函数附加到一个不存在的元素上
- JavaScript/jQuery-添加添加和删除类与下一个函数之间的延迟