Javascript 有条件工作的按钮

Javascript 有条件工作的按钮,javascript,html,Javascript,Html,var coll=document.getElementsByClassName(“可折叠”); var-p; 对于(p=0;p

var coll=document.getElementsByClassName(“可折叠”);
var-p;
对于(p=0;p

卑微的开端(1908-1944)

内容
最简单的概念是,单击按钮后,始终检查目标是否已打开,如果已打开,则返回。由于上面有容易出错且不完整的代码,下面是一个解决问题的尝试

<html>
    <head>
        <script>
            function toggleContent(o) {
                var contents = document.querySelectorAll(".collapsible .content");
                for (var i=0; i<contents.length; i++) {
                    contents[i].style.display = 'none';
                }
                document.getElementById(o.dataset.target).style.display = 'block';
            }
        </script>
    </head>
    <body>
        <div class="collapsible">
            <button data-target="humble1" onclick="toggleContent(this)">1. The Humble Beginning (1908-1944)</button>
            <button data-target="humble2" onclick="toggleContent(this)">2. The Humble Middle (1908-1944)</button>
            <button data-target="humble3" onclick="toggleContent(this)">3. The Humble Ending (1908-1944)</button>
            <div class="content" id="humble1">content 1</div>
            <div class="content" id="humble2" style="display:none">content 2</div>
            <div class="content" id="humble3" style="display:none">content 3</div>
        </div>
    </body>
</html>

功能切换内容(o){
var contents=document.queryselectoral(“.collapsable.content”);

对于(var i=0;i我不知道问题是什么,但我认为这就是你想要的

函数a(){
var div=document.getElementById(“div”);
var button=document.getElementById(“按钮”);
如果(div.style.visibility==“可见”){
div.style.visibility=“隐藏”;
button.innerHTML=“打开”;
}
否则{
div.style.visibility=“可见”;
button.innerHTML=“关闭”;
}
}

一些内容

打开
这种方法更接近您现有的代码。也许它能让您更深入地了解代码中实际发生了什么

一切取决于你:)

1st: humble2 div在HTML中被破坏,因为它没有结束标记。 首先解决这个问题

第二个: 最好的做法不是通过JS更改内容高度,而是使用表示折叠或扩展状态的类

.collapsed {
    height:0;
}
现在您可以询问content div的状态

if (content.classList.contains('collapsed') == 1){
  content.classList.add('collapsed');
} else {
  content.classList.remove('collapsed');
}
注1: 我会选择
height
而不是
maxHeight
,以防止以后出现其他奇怪的行为。 只有在有充分理由的情况下才可以使用
maxHeight

注2: 为内容分区提供一个ID,以便于选择,而不是使用
this.nextelementsilling
。 目前,您永远无法在HTML DOM上更改某些内容,而不会导致代码失败,因为下一个错误已经更改

注3: 如果您想保持高度概念: 您的
if(content.style.maxHeight){}
将始终返回
true
,因为它返回一个从不为空的字符串。 即使
maxHeight
为0像素,它也会返回
'0px'
,这不是一个空字符串,并且
为true

但是您已经发现这不符合预期。因此您将
maxHeight
设置为
null
,这将导致
false

最好这样做:
(content.style.maxHeight='0px'){…}
以及:
content.style.maxHeight='0px';

通过这种方式,您可以始终使用字符串类型并防止意外行为

在这里,您可以找到更多关于javascript中真实和虚假概念的信息:

不要使用
。单击()
触发折叠。改为切换CSS类。使用按钮上的
disabled
属性启用/禁用它。