【问题标题】:how to show the hidden <dl> elements one by one or all at the same time?如何同时显示隐藏的 <dl> 元素?
【发布时间】:2017-04-11 21:00:51
【问题描述】:

当您单击“查看更多”时,我试图显示隐藏的 &lt;dl&gt; 标签。在这个例子中,我有 3 个 &lt;dl&gt; 元素,但它可能或多或少。

HTML

<dl class="dl">
<dt><b>Name:</b></dt>
    <dd>My name</dd>   
<dt><b>Department</b></dt>
    <dd>My department</dd>  
<dt><b>Email</b></dt>
    <dd>My Email</dd>
</dl>

<br/>

<dl class="dl">
   <dt>Name:</dt>
    <dd>My name</dd>   
<dt>Department</dt>
    <dd>My department</dd>  
<dt>Email</dt>
    <dd>My Email</dd>
</dl>

<br/>
<dl class="dl">
<dt>Name:</dt>
    <dd>My name</dd>   
<dt>Department</dt>
    <dd>My department</dd>  
<dt>Email</dt>
    <dd>My Email</dd>
</dl>

jQuery

 $(function(){
 $("#dl").each(function(){
 var $dd = $(this).nextUntil("dt"), $this;
 $dd.filter(":gt(0)").hide();


 if($dd.length > 1){  
     $dd.last().after($("<a href='#'>View More</a>").click(function(e){
          e.preventDefault();
     $(this).text($(this).text() == "View More"?"Hide More":"View More")

  .prevAll("dt:first").nextUntil("dt").filter(":gt(2):not('a')").toggle()
     }));
 }
 });
   });

现在的问题是,当我点击“查看更多”时,什么也没有发生,换句话说,其他 2 个&lt;dl&gt; 元素没有出现。而我想要发生的是,当您点击 View More 时,另一个 &lt;dl&gt; 会出现,而当您点击 Hide More 时,在点击 Hide More 时将隐藏的那个隐藏起来strong>显示更多

我可以做到这一点:一个接一个地显示其余的 &lt;dl&gt; 元素或一次显示其余的 &lt;dl&gt; 元素。或/并同时隐藏元素一个或一个。

这是JSFiddle

【问题讨论】:

  • 如果必须选择,点击“查看更多”时您更喜欢哪种行为
  • 当您点击“查看更多”时,显示其余的 &lt;dl&gt; 元素,在这种情况下,显示其他 2 个 &lt;dl&gt;
  • 你不能为多个元素设置相同的id,id必须是唯一的
  • @JoshHarrison 一个一个地显示它们会很好地一个一个地显示直到显示全部,然后当所有的东西都显示出来时显示“隐藏更多”选项

标签: javascript jquery html toggle


【解决方案1】:

我不确定我是否完全理解您的问题,但我认为这可能对您有用。

注意:正如其他人所指出的,您不应多次使用相同的 id,因为它们应该是唯一的。

HTML

<dl class="always-show">
    <dt><b>Name:</b></dt>
        <dd>My name</dd>   
    <dt><b>Department</b></dt>
        <dd>My department</dd>  
    <dt><b>Email</b></dt>
        <dd>My Email</dd>
</dl>

<br/>

<dl class="hidden">
   <dt>Name:</dt>
        <dd>My name</dd>   
    <dt>Department</dt>
        <dd>My department</dd>  
    <dt>Email</dt>
        <dd>My Email</dd>
</dl>

<br/>
<dl class="hidden">
    <dt>Name:</dt>
        <dd>My name</dd>   
    <dt>Department</dt>
        <dd>My department</dd>  
    <dt>Email</dt>
        <dd>My Email</dd>
</dl>

<a href='#'>View More</a>

CSS

.hidden{
    display: none;
}

JS

$(function(){
    $('a').on('click', function(){
        var that = $(this);

        $.each($('dl').not('.always-show'), function(){
            if($(this).hasClass('hidden')){
                $(this).removeClass('hidden');
                that.text('Hide');
            } else {
                $(this).addClass('hidden');
                that.text('View More');
            }
        });
    });
});

Fiddle

【讨论】:

  • 这个答案的问题是影响了网站中的其他&lt;dl&gt;标签。例如,我有 2 列左右列。在左栏中我有&lt;dl&gt; 元素,在右栏中我可以有多个&lt;dl&gt; 元素,所以这个答案同时影响左右栏,它应该只在右栏有效=/
  • 嗯,你必须多做一些工作才能获得这种效果。例如添加一个 data 属性来声明它在哪一列。但这是你想要做的基础,对吧?
  • 除此之外...您的问题明确表示“同时”我的回答应该被接受。让我发疯,试图在这里获得代表。
  • 是的,我知道了,感谢您的回复。 &lt;dl&gt;1 不能使用两个不同的类,因为它们处于循环中。如果我使用两个不同的类,那么我将不得不使用 lf 和 else 语句以确保获得第一个 always-show 和其余的 hidden (这还不错,但更多代码)
  • 好的,那么在引用父元素时使用 .not(':first-child') 。这也将解决单独列的问题。
【解决方案2】:

请检查以下工作代码。我已经修改了您的代码而不是 id 我正在使用类(正如@Ricardo Pontual 所说,您不能在文档中多次使用相同的 id)。

HTML

<dl class="dl">
   <dt><b>Name:</b></dt>
   <dd>My name</dd>
   <dt><b>Department</b></dt>
   <dd>My department</dd>
   <dt><b>Email</b></dt>
   <dd>My Email</dd>
</dl>
<br/>
<dl class="dl">
 <dt>Name:</dt>
 <dd>My name</dd>
 <dt>Department</dt>
 <dd>My department</dd>
 <dt>Email</dt>
 <dd>My Email change1</dd>
</dl>
<br/>
<dl class="dl">
  <dt>Name:</dt>
  <dd>My name</dd>
  <dt>Department</dt>
  <dd>My department</dd>
  <dt>Email</dt>
  <dd>My Email change</dd>
</dl>

JS

$(function(){
      var select = $('.dl');
       select.filter(":gt(0)").hide();
       if(select.length > 1){  
       $('.dl:last').after($("<a href='#'>View      
       More</a>").click(function(e){
            e.preventDefault();
            $(this).text($(this).text() == "View More"?"Hide More":"View
  More").prevAll("dl").nextUntil("dt").filter(":gt(0):not('a')").toggle()
        }));
    }
});

【讨论】:

  • 这段代码和我的一样。我是一个更好的答案,因为我没有点击 DOM 来简单地添加一个标签。
【解决方案3】:

试试这个。我对您现有的代码做了一些更改,并删除了一些我认为不需要或矫枉过正的逻辑。此外,为了切换文本名称,我使用了 toggleClass() 表达式(不知何故,我认为进行文本比较不是最佳方式)。

 $("#dl").each(function(){
     var $dl = $(this);
     var $dd = $(this).nextUntil("dt"), $this;
     $dd.filter(":gt(0)").hide();

     if($dd.length > 1){  
         $dd.last().after($("<a href='#' class='visible'>View More</a>").click(function(e){             
              e.preventDefault();            
              $dl.siblings().toggle();
              $(this).text($(this).attr("class") == "visible"? "Hide More":"View More");
                $(this).toggleClass('visible invisible'); 
                $(this).show();
              })
         )           

     }
   });

https://jsfiddle.net/hc0mq4n9/8/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-12
    • 2011-06-30
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多