首先,如果此内容易于搜索,我要道歉;我对JavaScript相当陌生,我也不知道要搜索什么(因此我为什么要在这里问!)
基本上,我有一些代码可以根据用户单击的导航按钮显示/隐藏div,从而无需使用多个HTML页面。我在JS中有一个可行的解决方案,但是我的问题是,它似乎太块状且不必要地复杂。
我知道他们是某个地方更优雅的解决方案。但是,当您按下一个按钮时,我查看的所有内容仅能显示隐藏/显示div,而导航栏则不会显示多个。
因此,如果您能指出几种不同的研究途径,我将不胜感激!
JS:
function hideContent1(){
var a = document.getElementById("zero");
var b = document.getElementById("one");
var c = document.getElementById("two");
var d = document.getElementById("threeA");
var e = document.getElementById("threeB");
if(a.style.display = "none"){
document.getElementById('zero').style.display = "block";
}
if(b.style.display = "none"){
document.getElementById('one').style.display = "block";
}
if(c.style.display = "block"){
document.getElementById('two').style.display = "none";
}
if(d.style.display = "block"){
document.getElementById('threeA').style.display = "none";
}
if(e.style.display = "block"){
document.getElementById('threeB').style.display = "none";
}
}
对于可以按下的三个不同的导航按钮,此操作重复3次,但IF语句略有不同。
就像我之前说过的那样,这段代码可以正常工作,只是不必要的庞大。什么是完成此任务的更好方法?
答案 0 :(得分:0)
使用组合的id选择器,然后使用querySelectorAll
获取所有元素,最后进行迭代并执行相同的操作。尽管if
语句不是必需的,因为您只是在它们已经可见的情况下切换它们,并且设置block
不会进行任何更改。在您当前的代码中,由于它是一个赋值(=
),并且值是一个非空字符串,该字符串将为truthy,因此它将始终为真。
要获取基于CSS选择器的元素,可以使用querySelectorAll
方法,并使用NodeList方法(NodeList#forEach
)对返回的polyfill for older browser集合进行迭代。
function hideContent1() {
// get elements to show
var show = document.querySelectorAll('#zero,#one')
// get elements to hide
var hide = document.querySelectorAll('#two,#threeA,#threeB');
// iterate and update
show.forEach(ele => ele.style.display = 'block')
hide.forEach(ele => ele.style.display = 'none')
}
FYI:要对多个元素进行分组,可以使用一个公共类,该类总是比组合多个选择器更好。
答案 1 :(得分:0)
假设if
内的分配只是拼写错误,并且假定样式在none
和block
之间切换,则可以简单地分配block
或{ {1}}样式-无论是否更改现有样式,都不会发生。
您可以考虑改用类,以减少重复性,例如,给none
和a
一个b
类,给其余的{{1 }}。然后,在content2
上,隐藏每个content1
,同时显示所有hideContent1()
:
content1
请注意,content2
是一种较新的方法,因此,如果要支持较旧的浏览器,请在调用function hideContent1(){
document.querySelectorAll('.content2')
.forEach(elm => elm.style.display = 'block');
document.querySelectorAll('.content1')
.forEach(elm => elm.style.display = 'none');
}
之前使用polyfill或将NodeList转换为数组。
答案 2 :(得分:-1)
如何使其成为功能?
例如:
void f(int x)
{
if (x > x + 1)
// executed only in case of overflow,
// which is undefined behavior,
// and hence likely optimized out.
overflow_error();
...
假设功能是您真正想要的功能,除了注释中提到的错字。