如何使用 javascript 展开和折叠 <div>?

IT技术 javascript jquery
2021-02-14 22:54:38

我在我的网站上创建了一个列表。此列表由使用我的数据库中的信息构建的 foreach 循环创建。每个项目都是具有不同部分的容器,因此这不是像 1、2、3... 等的列表。我列出了包含信息的重复部分。在每个部分中,都有一个小节。一般构建如下:

<div>
    <fieldset class="majorpoints" onclick="majorpointsexpand($(this).find('legend').innerHTML)">
    <legend class="majorpointslegend">Expand</legend>
    <div style="display:none" >
        <ul>
            <li></li>
            <li></li>
        </ul>
    </div>
</div>

所以,我试图用 onclick="majorpointsexpand($(this).find('legend').innerHTML)" 调用一个函数

默认情况下,我尝试操作的 div 是 style="display:none",我想使用 javascript 使其在单击时可见。

"$(this).find('legend').innerHTML" 试图传递,在这种情况下, "Expand" 作为函数中的参数。

这是javascript:

function majorpointsexpand(expand)
    {
        if (expand == "Expand")
            {
                document.write.$(this).find('div').style = "display:inherit";
                document.write.$(this).find('legend').innerHTML = "Collapse";
            }
        else
            {
                document.write.$(this).find('div').style = "display:none";
                document.write.$(this).find('legend').innerHTML = "Expand";
            }
    }

我几乎 100% 确定我的问题是语法,而且我对 javascript 的工作原理不太了解。

我确实有 jQuery 链接到文档:

<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>

<head></head>部分。

6个回答

好的,所以你在这里有两个选择:

  1. 使用 jQuery UI 的手风琴 - 它很好,简单且快速。在此处查看更多信息
  2. 或者,如果你仍然想自己做这件事,你可以删除fieldset(无论如何在语义上使用它是不正确的)并自己创建一个结构。

这是你如何做到的。创建一个像这样的 HTML 结构:

<div class="container">
    <div class="header"><span>Expand</span>

    </div>
    <div class="content">
        <ul>
            <li>This is just some random content.</li>
            <li>This is just some random content.</li>
            <li>This is just some random content.</li>
            <li>This is just some random content.</li>
        </ul>
    </div>
</div>

使用此 CSS:(这是.content在页面加载时隐藏内容。

.container .content {
    display: none;
    padding : 5px;
}

然后,使用 jQuery,click为标题编写一个事件。

$(".header").click(function () {

    $header = $(this);
    //getting the next element
    $content = $header.next();
    //open up the content needed - toggle the slide- if visible, slide up, if not slidedown.
    $content.slideToggle(500, function () {
        //execute this after slideToggle is done
        //change text of header based on visibility of content div
        $header.text(function () {
            //change text based on condition
            return $content.is(":visible") ? "Collapse" : "Expand";
        });
    });

});

这是一个演示:http : //jsfiddle.net/hungerpain/eK8X5/7/

字段集不是必需的。我会摆脱它,只使用边框。这非常好,因为它选择相对于我单击的标题展开的 div,这很重要,因为根据用户设置和其他因素,我可能有几个不同数量的列出项目。
2021-04-23 22:54:38
太棒了,谢谢。节省了很多时间!
2021-04-29 22:54:38
我真的很感谢你的帮助。毫无疑问,站点的其他部分需要使用手风琴,即使这个特定的东西更像是一个全有或全无的显示示例。我仍然有问题。我的 jQuery 已过时且无法加载。这是固定的,但我仍然没有让它工作。我已经搞砸了一个小时了,我会睡在它上面的。也许明天它会打击我。
2021-05-03 22:54:38
+1 因为如果页面上有多个 DIV 元素,这将解决问题。换句话说,由于您的目标是点击标题中的内容,因此可以很好地扩展。
2021-05-04 22:54:38
@Unipartisandev 看看这个:jsfiddle.net/hungerpain/476Nq完整的例子:)
2021-05-05 22:54:38

怎么样:

jQuery:

$('.majorpoints').click(function(){
    $(this).find('.hider').toggle();
});

HTML

<div>
  <fieldset class="majorpoints">
    <legend class="majorpointslegend">Expand</legend>
    <div class="hider" style="display:none" >
        <ul>
            <li>cccc</li>
            <li></li>
        </ul>
    </div>
</div>

小提琴

这样您就可以将 click 事件绑定到.majorpoints类,而不必每次都在 HTML 中编写它。

嗨 raam86,我会更进一步,使用类而不是 id 在 div 上执行 .find。如果询问者在页面上有多个这样的字段集,他会希望将隐藏器定位为与单击的特定字段集相关的那个。希望这可以帮助!:) 例如,您可以使用 .closest 来获取对父 div 的引用,然后使用 .find 来定位带有 class="hider" 的 div。
2021-05-01 22:54:38
我知道现在是凌晨 3 点;),但我刚刚注意到您仍在 jsFiddle 中使用 id。这可能会导致未定义的行为,因为 W3C 规范规定每个 id 应该是唯一的。如果您将隐藏器更改为一个类,那么这将更不受其他浏览器中的错误或奇怪的、无法解释的行为的影响。希望这可以帮助!
2021-05-04 22:54:38
它实际上应该是 $('.majorpointslegend').click(function(){ $(this).parent().find('.hider').toggle(); }); 否则,当单击字段集中的任何地方时,它将崩溃。
2021-05-10 22:54:38

您可能想看看在单击链接以使面板/div 展开或折叠时要调用的这个简单的 Javascript 方法。

<script language="javascript"> 
function toggle(elementId) {
    var ele = document.getElementById(elementId);
    if(ele.style.display == "block") {
            ele.style.display = "none";
    }
    else {
        ele.style.display = "block";
    }
} 
</script>

您可以传递 div ID,它会在显示“无”或“阻止”之间切换。

snip2code上的原始来源-如何折叠 html 中的 div

所以,首先,您的 Javascript 甚至没有使用 jQuery。有几种方法可以做到这一点。例如:

第一种方式,使用jQuerytoggle方法:

<div class="expandContent">
        <a href="#">Click Here to Display More Content</a>
 </div>
<div class="showMe" style="display:none">
        This content was hidden, but now shows up
</div>

<script>  
    $('.expandContent').click(function(){
        $('.showMe').toggle();
    });
</script>

jsFiddle:http : //jsfiddle.net/pM3DF/

另一种方法是简单地使用 jQueryshow方法:

<div class="expandContent">
        <a href="#">Click Here to Display More Content</a>
 </div>
<div class="showMe" style="display:none">
        This content was hidden, but now shows up
</div>

<script>
    $('.expandContent').click(function(){
        $('.showMe').show();
    });
</script>

jsFiddle:http : //jsfiddle.net/Q2wfM/

还有第三种方法是使用slideTogglejQuery方法,它允许一些效果。比如$('#showMe').slideToggle('slow');里面会慢慢显示隐藏的div。

假设他在页面上有多个 showMe 元素?请记住,他正在使用 for 循环来构建这些列表,因此定位 class="showMe" 只会影响该元素的第一个实例。我的建议是引用与单击相关的 showMe 元素。那么这将是一个很好的解决方案。希望这可以帮助!:)
2021-04-24 22:54:38
是的,但他使用循环在一系列<li>元素中构建列表,而不是 div。无论哪种方式,他都可以使用元素 ID 然后隐藏它。
2021-05-04 22:54:38
您正在考虑小节而忘记了会有更多这些小节。每个部分都在部分中填充了 li 元素“这个列表是由一个 foreach 循环创建的,该循环使用我的数据库中的信息构建。每个项目都是一个具有不同部分的容器,所以这不是像 1、2、3 等那样的列表。我列出了包含信息的重复部分. 在每一节中,都有一个小节。” 简而言之,他只是向您展示了一个部分,尽管还会有更多。
2021-05-07 22:54:38

这里问题很多

我已经设置了一个适合你的小提琴:http : //jsfiddle.net/w9kSU/

$('.majorpointslegend').click(function(){
    if($(this).text()=='Expand'){
        $('#mylist').show();
        $(this).text('Colapse');
    }else{
        $('#mylist').hide();
        $(this).text('Expand');
    }
});