使用javascript / Jquery

时间:2017-03-13 17:02:03

标签: javascript jquery

我正在尝试动态地将类添加到嵌套列表项,即使子项和孙项的计数发生了变化。

示例嵌套项目如下所示:

  • 父级: list1
    • 孩子: list11
      • 孙子: list111
      • 孙子: list1112
    • 孩子: list12
      • 孙子: list121
      • 孙子: list122

问题是,如果我使用ul li ul添加类,它适用于所有子项和孙项。有没有办法分别为孩子,孙子,曾孙等添加课程?



$('ul li ul a').addClass('child')

ul li a {
  color:red
}

.child {
  color:green;
}

a {
  text-decoration:none;
}

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div>Parent1
  <ul> 
    <li><a href="#">Grandparent</a>
      <div>
        <ul>
          <li>
            <a href="#">Child</a> 
            <div>
              <ul>
                <li> <a href="#">Child1</a> 
                  <ul><li><a href="#"> Grandchild11</a></li></ul>
                </li>
                
                <li> <a href="#">Child2</a>
                  <ul><li><a href="#">GrandChild21</a></li><li><a href="#">grandchild22</a></li></ul>
                </li>
              </ul>
            </div> 
          </li>
          
          <li>
            <a href="#"> Child2 </a>
            <ul><li><a href="#">GrandChild21</a></li><li><a href="#">grandchild22</a></li></ul>
          </li>
        </ul>
      </div> 
    </li>
  </ul>
</div> <!-- Parent1 -->

<div>Parent2
  <ul> 
    <li>
      <a href="#">Grandparent</a>
      <div>
        <ul>
          <li>
            <a href="#">Child</a> 
            <div>
              <ul>
                <li>
                  <a href="#">Child1</a> 
                  <ul><li><a href="#"> Grandchild11</a></li></ul>
                </li>
                
                <li>
                  <a href="#">Child2</a>
                  <ul><li><a href="#">GrandChild21</a></li><li><a href="#">grandchild22</a></li></ul>
                </li>
              </ul>
            </div> 
          </li>
          
          <li>
            <a href="#"> Child2 </a>
            <ul><li><a href="#">GrandChild21</a></li><li><a href="#">grandchild22</a></li></ul>
          </li>
        </ul>
      </div> 
    </li>
  </ul>
</div> <!-- Parent2 -->
&#13;
&#13;
&#13;

3 个答案:

答案 0 :(得分:0)

<强>更新

我更新了代码以使用您的codepen中给出的结构。

有关jQuery遍历的所有信息都可以通过查看jQuery docs或阅读w3Schools tutorial来找到。

以下代码递归搜索<li></li>标记及其第一个<a></a>标记,根据它们在树中的位置为每个标记提供一个类。

我还为您的&#34; Parent1&#34;添加了id个属性和#34; Parent2&#34; div启动循环。

旁注:确保您的HTML有效,因为您在codepen链接中发布的代码存在严重的格式问题,并且关键元素中缺少许多很多关闭标记会导致列表变形#39结构。

请参阅以下代码段以及this updated codepen

&#13;
&#13;
$(function() {

  CreateListHierarchy($('#Parent1'), 'list');
  //CreateListHierarchy($('#Parent2'), 'list'); //Add this to sort both lists
  
});

function CreateListHierarchy(parent, className) {
 
 let firstList = $(parent).find('li:first');
 
 	$(firstList).find('a:first').each(function() {
  
      $(this).addClass(className + '1');
      console.log($(this).text() + ', ' + $(this).attr('class'));
      CreateListHierarchy(firstList, className + '1');
  
  });
    
  $(firstList).siblings('li').each(function(sinblingIdx) {
  
  	let currentSibling = this;
    
    $(currentSibling).find('a:first').each(function(index) { 
    	$(this).addClass(className + (index + 2));
      console.log($(this).text() + ', ' + $(this).attr('class'));
      CreateListHierarchy(currentSibling, className + (index + 2));
    });
  
  });

}
&#13;
.list1 {
  color: red;
}

.list11 {
  color: green;
}

.list1121, .list1122 {
  color: lightblue;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<div id="Parent1">Parent1
    <ul>
        <li>
            <a href="#">Grandparent</a>
            <div>
                <ul>
                    <li>
                        <a href="#">Child</a>
                        <div>
                            <ul>
                                <li>
                                    <a href="#">Child1</a>
                                    <ul>
                                        <li>
                                            <a href="#"> Grandchild11</a>
                                        </li>
                                    </ul>
                                </li>
                                <li>
                                    <a href="#">Child2</a>
                                    <ul>
                                        <li>
                                            <a href="#">GrandChild21</a>
                                        </li>
                                        <li>
                                            <a href="#">grandchild22</a>
                                        </li>
                                    </ul>
                                </li>
                            </ul>
                        </div>
                    </li>
                    <li>
                        <a href="#"> Child2 </a>
                        <ul>
                            <li>
                                <a href="#">GrandChild21</a>
                            </li>
                            <li>
                                <a href="#">grandchild22</a>
                            </li>
                        </ul>
                    </li>
                </ul>
            </div>
        </li>
    </ul>
</div>
  
<div id="Parent2">Parent2
    <ul>
        <li>
            <a href="#">Grandparent</a>
            <div>
                <ul>
                    <li>
                        <a href="#">Child</a>
                        <div>
                            <ul>
                                <li>
                                    <a href="#">Child1</a>
                                    <ul>
                                        <li>
                                            <a href="#"> Grandchild11</a>
                                        </li>
                                    </ul>
                                </li>
                                <li>
                                    <a href="#">Child2</a>
                                    <ul>
                                        <li>
                                            <a href="#">GrandChild21</a>
                                        </li>
                                        <li>
                                            <a href="#">grandchild22</a>
                                        </li>
                                    </ul>
                                </li>
                            </ul>
                        </div>
                    </li>
                </ul>
            </div>
        </li>
    </ul>
</div>
&#13;
&#13;
&#13;

答案 1 :(得分:0)

您需要的是直接子项(>)的CSS选择器,以指定您要定位的元素级别。您可以将jQuery更改为以下内容:

// $('ul li ul a').addClass('child')

var parent = 'ul > li';
var child = ' > div > ul > li';

// to target the child
$(parent + child + ' > a').addClass('child');
// to target the grandchild
$(parent + child + child + ' > a').addClass('grandchild');
// to target the great grandchild
$(parent + child + child + child + ' > a').addClass('greatgrandchild');
a {
  text-decoration:none;
}
ul li a {
  color:red
}
.child {
  color:green;
}
.grandchild {
  color:orange;
}
.greatgrandchild {
  color:blue;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>Grandparent 1
  <ul> 
    <li>
      <a href="#">Parent</a>
      <div>
        <ul>
          <li>
            <a href="#">Child 1</a> 
            <div>
              <ul>
                <li>
                  <a href="#">Grandchild 1-1</a>
                  <div>
                    <ul><li><a href="#">Great Grandchild 1-1-1</a></li></ul>
                  </div>
                </li>
                
                <li>
                  <a href="#">Grandchild 1-2</a>
                  <div>
                    <ul>
                      <li><a href="#">Great Grandchild 1-2-1</a></li>
                      <li><a href="#">Great Grandchild 1-2-2</a></li>
                    </ul>
                  </div>
                </li>
              </ul>
            </div> 
          </li>
          
          <li>
            <a href="#">Child 2</a>
            <div>
              <ul>
                <li><a href="#">Grandchild 2-1</a></li>
                <li><a href="#">Grandchild 2-2</a></li>
              </ul>
            </div>
          </li>
        </ul>
      </div> 
    </li>
  </ul>
</div> <!-- Grandparent 1 -->

<div>Grandparent 2
  <ul> 
    <li>
      <a href="#">Parent</a>
      <div>
        <ul>
          <li>
            <a href="#">Child 1</a> 
            <div>
              <ul>
                <li>
                  <a href="#">Grandchild 1-1</a> 
                  <div>
                    <ul><li><a href="#"> Great Grandchild 1-1-1</a></li></ul>
                  </div>
                </li>
                
                <li>
                  <a href="#">Grandchild 1-2</a>
                  <div>
                    <ul>
                      <li><a href="#">Great Grandchild 1-2-1</a></li>
                      <li><a href="#">Great Grandchild 1-2-2</a></li>
                    </ul>
                  </div>
                </li>
              </ul>
            </div> 
          </li>
          
          <li>
            <a href="#"> Child 2</a>
            <div>
              <ul>
                <li><a href="#">Grandchild 2-1</a></li>
                <li><a href="#">Grandchild 2-2</a></li>
              </ul>
            </div>
          </li>
        </ul>
      </div> 
    </li>
  </ul>
</div> <!-- Parent2 -->

  

重要   只要您的嵌套元素具有统一的“模式”,上述代码就会起作用。如果在任何情况下它们都没有,您只需修改var child的值,或添加另一个具有不同值的值。例如:

var parent = 'ul > li';
var child = ' > div > ul > li'; /*ul enclosed in div*/
var grandchild = ' > ul > li'; /*ul not enclosed in div*/

// to target the grandchild
$(parent + child + grandchild + ' > a').addClass('grandchild');

Here's a working demo in JSFiddle, as well.

答案 2 :(得分:0)

将Id提供给您的父div

<div id="parent">
.
.
</div>

并使用以下代码

$('#parent ul li ul a').addClass('child');

所以课程只会附加到'父母'id

中的孩子和孙子