【问题标题】:How to use a for each or iterate through divs?如何使用 for each 或遍历 div?
【发布时间】:2016-02-29 18:33:03
【问题描述】:

我构建了自己的 jquery 选项卡内容系统版本。基本标记如下。

<div class="row" id="toShow>
    <div> 
        content
    </div>
    <div> 
        content
    </div>
    <div> 
        content
    </div>
</div>

导航进入另一行

<div class="row" id="Links>
    <ul>
        <li>link</li><li>link</li><li>link</li><li>link</li>
    </ul>
</div>

这是运行标签的js

$('.toShow .dslc-modules-area:not(:first)').addClass("hide"); 

$( ".links li" ).click(function() {
    $( ".links li" ).siblings().removeClass('active');
    $(this).toggleClass('active');
    var identify=$(this).index();
    $(".toShow .dslc-modules-area:not(:eq(identify))").addClass("hide");
    $(".toShow .dslc-modules-area").eq([identify]).removeClass('hide').toggleClass("showme");
    $('html,body').animate({scrollTop: $(".toShow").offset().top + 0}, 800);

如果我在第一个作品上有两个手风琴,并且假设它是一个迭代/每个问题?我的问题是,无需执行链接 1、链接 2 等,有没有办法让代码适用于每组手风琴?也就是说,为每一组#toShow 和#Links 运行这段代码?

【问题讨论】:

  • $( ".links li" ).siblings().removeClass('active') 就像运行一个 while 循环,将 i1 增加到 10 20 次,然后将其值设置为 1。删除 siblings() 并使用 $( ".links li" ).removeClass('active')
  • @DanielBeck 您的编辑更正了作者帖子中可能导致问题不存在的错误,如果在这种情况下不存在,那么在将来。请避免对有问题的代码进行非空白更改。我回滚了编辑,如果您想重新应用语法更正,请继续。
  • @DJDavid98 鉴于提问者的说法,第一个有效,我认为拼写错误只是转录错误,但你的观点是完全正确的;今后我会牢记这一点。道歉。
  • @DanielBeck 这可能是真的,但一般来说,如果您认为标记可能已关闭,最好让 OP 自己修复他们的代码块,而不是做出有根据的猜测。或不基于上下文。
  • 感谢您的提示,它仍然有效。

标签: jquery


【解决方案1】:

这里的主要症结在于,您需要一种方法来区分用于选项卡集 1 和选项卡集 2 的选项卡和内容,以便单击其中一个不会影响另一组。例如,$('.links li') 将匹配两组中的所有链接,因此除非您限制选择器,否则您最终会在选项卡集之间产生串扰。

有很多方法可以解决这个问题。在这里,我将每个选项卡集的元素包装在一个包装器元素中,并修改您的代码以单独作用于每个包装器的内容:

/* Init each tabset separately, using '.find' to limit the subsequent
   selector to act only within that node: */
$('.tabset').find('.toShow div:not(:first)').addClass("hide");
$('.tabset').find('.links li:first').addClass("active");

/* Now attach the event handlers to the links, again separately 
   for each tabset: */
$('.tabset').each(function() {
  var tabset = $(this); // so we don't collide with the 'this' inside the click handler below
  tabset.find(".links li").click(function() {
    tabset.find(".links li").removeClass('active');
    $(this).addClass("active");
    var identify = $(this).index();
    tabset.find(".toShow div:not(:eq(identify))").addClass("hide");
    tabset.find(".toShow div").eq([identify]).removeClass('hide');
  });
});
.hide {
  display: none;
}
.active {
  font-weight: bold;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<span class="tabset">
     <div class="row links">
      <ul>
        <li>link 1</li><li>link 2</li><li>link 3</li>
      </ul>
    </div>
    <div class="row toShow">
      <div>content 1</div><div>content 2</div><div>content 3</div>
    </div>
</span>

<span class="tabset">
    <div class="row links">
      <ul>
        <li>link 1</li><li>link 2</li><li>link 3</li>
      </ul>
    </div>
    <div class="row toShow">
      <div>content 1</div><div>content 2</div><div>content 3</div>
    </div>
</span>

(这可以通过将委托的单击事件绑定到选项卡集节点本身来改进,即 $('.tabset').on('click','.links li', function() {...}); 而不是每个 li 的单个事件,但这不是您要问的问题。)

如果您的 DOM 结构由于某种原因不允许添加该包装器节点,则可以改为依赖文档顺序(例如,将每个 .links 行限制为仅作用于下一个兄弟 .toShow 行)或通过向每对添加数据属性(或类,或其他)(将每个.links[data-tabset="foo"] 限制为仅对也具有data-tabset="foo".toShow 项目起作用)。这是一个仅使用文档顺序的示例:

/* Init is basically the same as the previous snippet: */
$('.toShow').find('div:not(:first)').addClass("hide");
$('.links').find('li:first').addClass("active");

$('.links li').click(function() {
  /* But here we need to traverse the DOM to find the correct sets
     of links and content blocks to act on.  This looks simpler, but
     is more fragile to document order changes, so I'd really recommend 
     the other approach, or an explicit identifier: */
  var linkRow = $(this).closest('.links');
  var showRow = linkRow.next('.toShow');
  var identify = $(this).index();
  
  // The rest is basically as before:
  linkRow.find('li').removeClass('active');
  $(this).addClass('active');

  showRow.find("div:not(:eq(identify))").addClass("hide");
  showRow.find("div").eq([identify]).removeClass("hide");
});
.hide {
  display: none;
}
.active {
  font-weight: bold;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div class="row links">
  <ul>
    <li>link 1</li><li>link 2</li><li>link 3</li>
  </ul>
</div>
<div class="row toShow">
  <div>content 1</div><div>content 2</div><div>content 3</div>
</div>

<div class="row links">
  <ul>
    <li>link 1</li><li>link 2</li><li>link 3</li>
  </ul>
</div>
<div class="row toShow">
  <div>content 1</div><div>content 2</div><div>content 3</div>
</div>

【讨论】:

    【解决方案2】:

    是的,每个函数都有一个jQuery():

    请参阅文档中的条目: http://api.jquery.com/jquery.each/

    【讨论】:

    • 您可以循环遍历每个父标签,从而遍历多个手风琴。所以答案在文档页面上。所以你的问题不清楚,如果你不能用这个信息解决它
    • 第二组#links 与第一组#toShow 交互,而不是第二组。
    • 仅链接的答案对社区几乎没有价值。如果没有使用该方法的实际展示,它真的无法回答问题
    • 如果链接包含如何使用的显示怎么办?
    • meta.stackexchange.com/questions/8231/…meta.stackexchange.com/questions/92505/… 提供了一些(长期)历史,说明为什么不鼓励仅链接答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    • 2019-03-18
    • 1970-01-01
    相关资源
    最近更新 更多