在javascript中折叠和扩展列表

时间:2012-11-06 20:45:09

标签: javascript html

我正在使用教程制作HTML格式的可折叠列表。

我的HTML看起来像这样:

<li>
    <a href="#" onclick="test('node1')">hello</a>
    <ul id="node3" style="display:none">
        <li>Sub-item 1</li>
        <li>Sub-item 2</li>
    </ul>
</li>
<li>
    <a href="#" onclick="test('node2')">test</a>
    <ul id="node3" style="display:none">
        <li>Sub-item 1</li>
        <li>Sub-item 2</li>
    </ul>
</li> 

节点3,4,5等

我正在尝试使用以下JavaScript折叠所有这些表:

function test2(id, link) {
    var e = document.getElementById(id);
    if (e.style.display == '') {
        e.style.display = 'none';
        link.innerHTML = 'Expand';
    } else {
        e.style.display = '';
        link.innerHTML = 'Collapse';
    }
}

但是当我调用该函数时,我不太清楚要输入什么来选择所有节点。我仍然需要在每个节点上进行单独控制,因此我无法将所有名称更改为相同。

<a href="#" onclick="test2('node????', this)">Collapse</a>

1 个答案:

答案 0 :(得分:3)

您可以使用class属性。

<li>
 <a href="#" onclick="test('node1')">hello</a>
 <ul id="node1" class="node" style="display:none">
  <li>Sub-item 1</li>
  <li>Sub-item 2</li>
 </ul>
</li>
<li>
 <a href="#" onclick="test('node2')">test</a>
 <ul id="node2" class="node" style="display:none">
  <li>Sub-item 1</li>
  <li>Sub-item 2</li>
 </ul>
</li>

假设你真的想要崩溃所有这些而不是切换他们的可见性你可以写这样的东西......

function test2(className, link) {
 var e = document.getElementsByClassName(className);

 for (var i = 0, len = e.length; i < len; i++) {
  e[i].style.display = "none";
 }

 link.innerHTML = "Expand";
}

......并称之为......

<a href="#" onclick="test2('node', this)">Collapse</a>

请记住,getElementsByClassName在旧版浏览器中不起作用(&lt; IE9)。

<强>更新 实现此目的的另一种方法是使用CSS并更改共同父元素的类名。这是一个示例CSS代码:

#mutualParent.hide-nodes li.node {
 display: none;
}

然后改变你的功能......

function test2(className) {
 document.getElementById("mutualParent").className += className;
}

......并称之为:

<a href="#" onclick="test2('hide-nodes')">Collapse</a>

如果要使用test() - 函数切换可见性,则需要先删除className,否则它将保持隐藏状态。此代码也可以运行,您需要从<ul>标记中删除style-attribute,因为样式属性具有更高的优先级。