javascript - 使用 jQuery 获取嵌套列表中的上一个直接 li 项目

标签 javascript html jquery list

get previous li item in nested list

如果我有一个嵌套列表,并且我想使用 jQuery 或 Javascript 从选择器获取列表中的前一项。问题是,这是一个嵌套列表,因此前一个项目可能是另一个 ol 的嵌套列表项目。

这就是我的意思。

  • 之前的 jQuery #('#topic_17') 是 Django #('#topic_2')
  • Django #('#topic_2') 之前的版本是 Bootstrap 4 #('#topic_11')
  • Bootstrap 4 之前的版本 #('#topic_11') 是框架 #('#topic_3')
  • 之前的框架 #('#topic_3') 是 CSS #('#topic_5')
  • CSS #('#topic_5') 之前是 HTML #('#topic_1')
  • HTML #('#topic_1') 之前是 Web 开发 #('#topic_13')
  • 在 Web 开发之前,#('#topic_13') 没什么意义。

我看到了一些可能的方法,但真的想要一种更智能、更通用的方法来选择是否可能。之前我能想到的元素情况:

  1. 前面的 li 没有嵌套,所以它只是 $(selector).prev('li')
  2. 前一个 li 是嵌套的,因此使用 $(selector).prev('li').find('li').last()
  3. 获取最后一个 li
  4. 前面的 li 是父级,因此 $(selector).closest('ol').parent()
  5. 没有前面的 li,因为它是列表中的顶部项目。

有什么通用的、简单的方法来完成这个任务吗?

HTML 示例

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"
                integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo="
                crossorigin="anonymous"></script>
    </head>
    <body>

        <ol class="list-group list-group-root sortable">

            <li id="topic_13">
                <div>
                    <div>
                        <span>Web Development</span>
                    </div>
                </div>

                <ol>
                    
                    <li id="topic_1">
                        <div>
                            <div>
                                <span>HTML</span>
                            </div>
                        </div>
                    </li>

                    <li id="topic_5">
                        <div>
                            <div>
                                <span>CSS</span>
                            </div>
                        </div>

                        <ol>

                            <li id="topic_3">
                                <div>
                                    <div>
                                        <span>Frameworks</span>
                                    </div>
                                </div>

                                <ol>

                                    <li id="topic_11">
                                        <div>
                                            <div>
                                                <span>Bootstrap 4</span>
                                            </div>
                                        </div>
                                    </li>

                                </ol>
                            </li>
                        </ol>
                    </li>
                </ol>
            </li>


            <li id="topic_2">
                <div>
                    <div>
                        <span>Django</span>
                    </div>
                </div>
            </li>


            <li id="topic_17">
                <div>
                    <div>
                        <span>jQuery</span>
                    </div>
                </div>
            </li>

        </ol>

    </body>
</html>

最佳答案

一种方法是使用 .slice 过滤 jQuery 返回的匹配元素。请参阅此示例:

// Get all li elements
const elements = jQuery("li");

// select the element we need
const el = jQuery("#topic_11");

// get index of the element
const idx = elements.index(el);

// get previous by slicing from the previous index (-1)
const prevElement = elements.slice(idx - 1, idx);

if (prevElement.length == 0)
  console.log("No Previous Element");

if (prevElement.length > 0)
  console.log(prevElement[0], prevElement.attr("id"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ol class="list-group list-group-root sortable">

  <li id="topic_13">
    <div>
      <div>
        <span>Web Development</span>
      </div>
    </div>

    <ol>

      <li id="topic_1">
        <div>
          <div>
            <span>HTML</span>
          </div>
        </div>
      </li>

      <li id="topic_5">
        <div>
          <div>
            <span>CSS</span>
          </div>
        </div>

        <ol>

          <li id="topic_3">
            <div>
              <div>
                <span>Frameworks</span>
              </div>
            </div>

            <ol>

              <li id="topic_11">
                <div>
                  <div>
                    <span>Bootstrap 4</span>
                  </div>
                </div>
              </li>

            </ol>
          </li>
        </ol>
      </li>
    </ol>
  </li>


  <li id="topic_2">
    <div>
      <div>
        <span>Django</span>
      </div>
    </div>
  </li>


  <li id="topic_17">
    <div>
      <div>
        <span>jQuery</span>
      </div>
    </div>
  </li>

</ol>

关于javascript - 使用 jQuery 获取嵌套列表中的上一个直接 li 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61834221/

相关文章:

html - 水平放置 DIV 元素(CSS 和 HTML)

javascript - Jquery val() 不带回文本框的值

javascript - 当输入字段名称位于 jquery 数组中时序列化表单

javascript - 将回调添加到 javascript while 循环

javascript - 使用 jquery.validate.js 插件进行条件表单验证

javascript - 在异步延迟问题上运行多个脚本

javascript - 选择附加到光标的 div 覆盖的节点

php - 传递给 foreach() 循环的参数无效?

javascript - 使用 .replaceWith() jQuery

javascript - 限制共享点中的某些搜索关键字