【问题标题】:Change background list item on click in dynamic nested List在动态嵌套列表中单击更改背景列表项
【发布时间】:2017-12-19 20:42:30
【问题描述】:

我有嵌套列表在运行时动态地从数据库中提取,如下所示:

<div class="list"><ul>
<li>
    listA
    <ul>
        <li>Alist1</li>
        <li>Alist2</li>
        <li>Alist3</li>
    </ul>
</li>
<li>
    listB
    <ul>
        <li>BList1</li>
        <li>BList2</li>
        <li>BList3</li>
    </ul>
</li>

我想在单击时更改列表项的背景,但它通过以下方法更改所有嵌套列表的样式:

        var $li = $('#list li').click(function () {
        $li.removeClass('selected');
        $(this).addClass('selected');
    });

使用这种风格:

li.selected {
background-color: aqua;}

我知道我应该使用直接后代运算符 (>) 来强制更改为父级,但我的问题是列表是动态绘制的,我无法限制其级别和嵌套列表。

是否总是强制仅更改单击的项目?

【问题讨论】:

  • 到目前为止你尝试了什么??
  • 你想在哪个 li 上设置背景?你的第一个 ul 之后的第一个嵌套 li ?
  • @KolaCaine 我只想在单击时更改每个列表项的背景,但发生的情况是单击的列表项样式中的所有嵌套列表都发生了变化
  • 例如添加一个is-active 类 CSS 并在单击时放置此类,然后在 CSS 上放置背景,或者如果您想要动态背景,您可以在 JS 文件中更改背景属性明白吗?

标签: javascript jquery html css list


【解决方案1】:

1-你不能使用#list,而你的列表有一个list而不是id list的类,你需要使用点而不是#

2-你需要像$('.list &gt; ul &gt; li')一样使用&gt;

$(document).ready(function(){
  $('ul > li').on('click' , function(e){
    e.stopPropagation();
    //$('li > ul').hide();
    $(this).find(' > ul').slideDown();
    $(this).parent('ul').find('li').removeClass('selected');
    $(this).addClass('selected');
  });
});
ul{
  background : #fff;
}
li > ul{
  display : none;
}
li.selected{
  background : red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="list">
  <ul>
    <li>
        listA
        <ul>
            <li>Alist1
              <ul>
                  <li>Alist1-1</li>
                  <li>Alist1-2</li>
                  <li>Alist1-3</li>
              </ul>
            </li>
            <li>Alist2</li>
            <li>Alist3</li>
        </ul>
    </li>
    <li>
        listB
        <ul>
            <li>BList1</li>
            <li>BList2</li>
            <li>BList3</li>
        </ul>
    </li>
  </ul>
</div>

-- 使用&lt;a&gt; 会更好看下一个例子

$(document).ready(function(){
  $('a').on('click' , function(e){
    e.preventDefault();
    var GetLi = $(this).closest('li');
    var GetBigUL = $(this).closest('ul');
    var GetNextUL = $(this).next('ul');
    GetBigUL.find('a').next('ul').not(GetNextUL).slideUp();
    GetNextUL.slideDown();
    GetBigUL.find('li').removeClass('selected');
    GetLi.addClass('selected');
  });
});
ul{
  background : #fff;
}
li > ul{
  display : none;
}
li.selected{
  background : red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="list">
  <ul>
    <li>
        <a>listA</a>
        <ul>
            <li>
              <a>Alist1</a>
              <ul>
                  <li><a>Alist1-1</a></li>
                  <li><a>Alist1-2</a></li>
                  <li><a>Alist1-3</a></li>
              </ul>
            </li>
            <li><a>Alist2</a></li>
            <li><a>Alist3</a></li>
        </ul>
    </li>
    <li>
        <a>listB</a>
        <ul>
            <li><a>BList1</a></li>
            <li><a>BList2</a></li>
            <li><a>BList3</a></li>
        </ul>
    </li>
  </ul>
</div>

【讨论】:

  • 这是相同的行为.. 它改变了父项和子项我只想更改单击的项目而不是子项。虽然我的问题是当它绘制动态时我无法确定嵌套列表的数量。
  • @AhmedEmad 此代码不会更改子元素 .. 请记住,默认情况下 all 元素没有背景 .. 因此,虽然您没有为任何嵌套的 li 设置背景,但它会显示相同的背景其父母的
  • @AhmedEmad 我更新了我的答案..你可以在设置嵌套的 ul 背景后看到直接 li 背景发生了变化
  • 感谢 mohamed 的帮助,但它强制只为父级着色。我想在点击时为任何列表项着色,并且不仅为父母着色其他项目不着色
  • @AhmedEmad 这并不容易..我相信还有另一种简单的方法可以做到这一点,但我现在不在乎..所以检查更新的答案,我认为它接近你要找的东西。 . 希望如此
猜你喜欢
  • 2013-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-10
相关资源
最近更新 更多