Jquery在单击时将父li元素中的文本组合在一起以获取路径

Jquery combining text from parent li elements on click to get path

提问人:l0ckm4 提问时间:1/12/2021 更新时间:1/12/2021 访问量:147

问:

我在jquery上有点挣扎。我有一个无序列表,看起来像这样。

<ul>
  <li class="folder">Folder: Test</li>
  <ul>
    <li class="folder">Folder: Archive</li>
    <ul>
      <li class="file">
        <div class="filename">HelloWorld.docx</div>
        <div class="size">11.79kiB</div>
        <div class="date">2021-01-12 09:31:34</div>
      </li>
      <li class="file">
        <div class="filename">HelloWorld1.docx</div>
        <div class="size">12.79kiB</div>
        <div class="date">2021-01-11 09:31:34</div>
      </li>
    </ul>
  </ul>
</ul>

看起来像这样

  • 文件夹:测试
    • 文件夹 : 存档
      • HelloWorld.docx
        11.79kiB
        2021-01-12 09:31:34
      • HelloWorld1.docx
        12.79kiB
        2021-01-11 09:31:34

当我单击任何具有“file”类的 li 时,我想回顾并通过查找具有类“folder”的父 li 来计算路径结构是什么。

我尝试了各种组合,但无法得到它

这就是我目前正在处理的内容

$(document.body).on('click',"li.file",function (e) {
    console.log("clicked");
    $(this).parents("li.folder").each(function() {
        console.log($(this).text());
    });
});

最终,我想找回一个包含父文件夹和变量文件名的完整路径。

例如 pathtofile = /test/archive/HelloWorld.docx

这是一个 jsfiddle https://jsfiddle.net/e5d7bcyz/ 谢谢

JavaScript jQuery HTML-列表 嵌套列表

评论


答:

2赞 Ofir Baruch 1/12/2021 #1

好吧,你要找的 LI 并不是真正的父级,因为它们没有包装当前的 li.file 元素。

  <ul>
    <li class="folder">Folder: Archive</li> // You close the LI tag. So it's not a parent of the rest of the code.
    <ul>
      <li class="file">

尝试用 LI 标记包装代码的其余部分:

<ul>
  <li class="folder">Folder: Test
    <ul>
      <li class="folder">Folder: Archive
      <ul>
        <li class="file">
          <div class="filename">HelloWorld.docx</div>
          <div class="size">11.79kiB</div>
          <div class="date">2021-01-12 09:31:34</div>
        </li>
        <li class="file">
          <div class="filename">HelloWorld1.docx</div>
          <div class="size">12.79kiB</div>
          <div class="date">2021-01-11 09:31:34</div>
        </li>
      </ul>
     </li> //closing the second parent: Folder: Archive
    </ul>
  </li> //closing the first parent: Folder: test
</ul>

据我所知,这是有效的HTML代码。 然后这些 li.folder 元素实际上是父元素。

评论

0赞 freedomn-m 1/12/2021
好地方,原始 HTML (ul > ul) 不是“有效”的 html - developer.mozilla.org/en-US/docs/Web/HTML/Element/ul - “允许的内容:li"
0赞 l0ckm4 1/12/2021
谢谢奥菲尔 - 我会更正我的清单。
2赞 Rory McCrossan 1/12/2021 #2

在回答您的问题之前,您首先需要更正 HTML。 元素不能是其他元素的子元素。您需要将 包装在它们关联的 .ulululli

您还需要将文件夹名称包装在另一个元素(如 ,)中,以便于检索文本。通过拖网浏览文本节点,这对于您当前的 HTML 是可能的,但是编写代码很混乱且非常脆弱。简单的 HTML 更改是最好的方法。span

最后,您可以遍历单击的父元素并颠倒它们的顺序,以获得正确格式的路径。从那里,您可以附加所选文件的文件名。试试这个:li.file

$.fn.reverse = [].reverse;

$(document).on('click', "li.file", function(e) {
  let $file = $(this);
  let $path = $file.parent().parents('li').reverse();
  let path = $path.map((i, el) => $(el).children('span').text().trim()).get();
  path.push($file.children('.filename').text().trim());
  console.log(path.join('/'));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul>
  <li class="folder">
    <span>Test</span>
    <ul>
      <li class="folder">
        <span>Archive</span>
        <ul>
          <li class="file">
            <div class="filename">HelloWorld.docs</div>
            <div class="size">11.79kiB</div>
            <div class="date">2021-01-12 09:31:34</div>
          </li>
          <li class="file">
            <div class="filename">HelloWorld1.docs</div>
            <div class="size">12.79kiB</div>
            <div class="date">2021-01-11 09:31:34</div>
          </li>
        </ul>
      </li>
    </ul>
  </li>
</ul>