【问题标题】:jQuery toggleClass for multiple elements with loop and var带有循环和var的多个元素的jQuery toggleClass
【发布时间】:2014-09-26 12:45:56
【问题描述】:

我在 .list1 和 .list2 uls 上有多个元素,.list2 不可见,.list1 中的元素触发 .list2 中的元素。我不知道会有多少元素,所以我想对一些带有点击事件的 jQuery 代码使用循环。但是循环不起作用。我做错了什么?

JS Fiddile here

<ul class="list1">
<li class="opt1">option1</li>
<li class="opt2">option2</li>
<li class="opt3">option3</li>
<li class="opt4">option4</li>
<li class="opt5">option5</li>

<ul class="list2">
<li class="opt1">option1</li>
<li class="opt2">option2</li>
<li class="opt3">option3</li>
<li class="opt4">option4</li>
<li class="opt5">option5</li>

for (var x = 1; x <= 5; x++){
  $(".list1 li.opt" + x).click(function() {
      $(".list2 li").removeClass("selected");   
      $(".list2 li.opt" + x).addClass("selected");
  });
}

【问题讨论】:

标签: javascript jquery loops for-loop


【解决方案1】:

尝试为此编写single event,不要使用for 循环,并利用.index() 从list-2 中获取相关元素

$('.list1 li').click(function () {
    $('.list2 li').removeClass("selected").eq($(this).index()).addClass("selected");
});

DEMO

【讨论】:

  • 那么,就这么简单,不需要循环?谢谢你。但是为什么循环不起作用?
  • @Ecnelis,因为在 click 内部事件处理程序 x 等于 6,而不是当前值。
  • @Ecnelis 那是因为范围错误。我们需要为每个迭代创建一个范围来解决该问题。但这是一种高级概念,您可能需要浏览一些与范围界定和关闭相关的在线主题才能很好地掌握它。
  • 顺便提一下:即使index() 解决了这样的问题,使用data 属性将元素从一个列表映射到另一个列表会更好。
  • @RajaprabhuAravindasamy 好吧,如果这些li 是动态生成的,并且不知何故.list2 将以另一种顺序形成(或者列表中的一个元素将丢失),这将使整个解决方案崩溃。是的,它可能永远不会发生,但是基于元素的属性,而不是元素的位置,对我来说听起来更可靠。但是,当然,我投票赞成这个答案是正确的,没有 HTML 重组。
猜你喜欢
  • 2014-08-05
  • 1970-01-01
  • 2014-10-20
  • 1970-01-01
  • 2019-12-04
  • 2017-10-07
  • 1970-01-01
  • 2013-06-02
  • 2014-06-18
相关资源
最近更新 更多