javascript 页面上相同元素的JS

qlckcl4x  于 2023-02-11  发布在  Java
关注(0)|答案(3)|浏览(149)

我正在一个网站上与BE开发人员合作-他们已经在Umbraco中构建了它,每个内容部分都有动态块,可以添加到页面中。
我们的客户端试图在一个页面上添加相同的“选项卡式内容”块两次,但是第二个块不起作用,因为JS只是针对它在类中找到的第一个元素
有没有办法修改JS,让两个模块独立工作?下面是一个简化的演示:

$('section.tabs nav li').click(function(){
    var tabIndex = $(this).index();
    $(this).addClass('active').siblings().removeClass('active');

    $('section.tabs ul.tabs li.tab').eq(tabIndex).addClass('active').siblings().removeClass('active');
});
section.tabs main.tabsContainer ul.tabs li.tab{
    display:none;
}

section.tabs main.tabsContainer ul.tabs li.tab.active{
    display:flex;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<h1>
  First Tabbed Section
</h1>
<section class="tabs">
      <nav>
          <ul>
              <li class="active">
                  <button>
                      Click for Tab 1
                  </button>
              </li>
              <li>
                  <button>
                      Click for Tab 2
                  </button>
              </li>
              <li>
                  <button>
                      Click for Tab 3
                  </button>
              </li>
          </ul>
      </nav>
      <main class="tabsContainer">
          <ul class="tabs">
              <li class="tab active">
                  <h2>
                      Tab 1
                  </h2>
              </li>
              <li class="tab">
                  <h2>
                      Tab 2
                  </h2>
              </li>
              <li class="tab">
                  <h2>
                      Tab 3
                  </h2>
              </li>
          </ul>
      </main>
</section>

<hr />

<h1>
  Second Tabbed Section
</h1>
<section class="tabs">
      <nav>
          <ul>
              <li class="active">
                  <button>
                      Click for Tab 1
                  </button>
              </li>
              <li>
                  <button>
                      Click for Tab 2
                  </button>
              </li>
              <li>
                  <button>
                      Click for Tab 3
                  </button>
              </li>
          </ul>
      </nav>
      <main class="tabsContainer">
          <ul class="tabs">
              <li class="tab active">
                  <h2>
                      Tab 1
                  </h2>
              </li>
              <li class="tab">
                  <h2>
                      Tab 2
                  </h2>
              </li>
              <li class="tab">
                  <h2>
                      Tab 3
                  </h2>
              </li>
          </ul>
      </main>
</section>
xzabzqsa

xzabzqsa1#

这看起来像是一个DOM遍历非常方便的例子,看看它选择了什么:

$('section.tabs ul.tabs li.tab')

这来自整个DOM的上下文,因此将返回整个DOM中的任何匹配元素。或者,如果从this的上下文开始,则可以向上遍历到公共父代,然后仅在该父代的上下文中查找目标元素。例如:

$(this).closest('section.tabs').find('ul.tabs li.tab')
liwlm1x9

liwlm1x92#

选择器$('section.tabs ul.tabs li.tab')在两个选项卡之间工作 *-所以$('section.tabs ul.tabs li.tab').length(在你的小提琴上)将是6,而不是3
单击第二部分tab 2时,其索引为1(从0开始)。
这对应于$('section.tabs ul.tabs li.tab').eq(4)
要只应用于 current 部分,请使用相对DOM导航-即从当前元素向上导航,而不是从顶层文档向下导航:

$(this).closest("section.tabs").find("ul.tabs li.tab").eq(index)...

更新简化示例片段:
x一个一个一个一个x一个一个二个一个x一个一个三个一个

umuewwlo

umuewwlo3#

选择器$("section.tabs nav li")与它在页面中找到的每个对应元素一起工作,所以如果你有2个,它们都应该工作。如果没有,可能还有另一个问题。如果你在控制台上运行$('section.tabs nav li'),你只看到一个还是两个都看到?
另外,如何区分$('section.tabs ul.tabs li.tab').eq(tabIndex)中的clicked tab元素?

相关问题