Jquery 在点击获取路径时合并来自父 li 元素的文本
Jquery combining text from parent li elements on click to get path
我有点挣扎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
当我单击任何带有“文件”class 的 li 时,我想回顾并通过找到具有 class 的父 li 来计算出路径结构是什么“文件夹”。
我尝试了各种组合,但无法得到它
这就是我目前正在使用的
$(document.body).on('click',"li.file",function (e) {
console.log("clicked");
$(this).parents("li.folder").each(function() {
console.log($(this).text());
});
});
最终我想找回一个完整的路径,其中包含父文件夹和变量中的文件名。
例如文件路径 = /Test/Archive/HelloWorld.docx
这是一个 jsfiddle https://jsfiddle.net/e5d7bcyz/
谢谢
好吧,您正在寻找的 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 元素实际上是父元素。
在处理您的问题之前,您首先需要更正 HTML。 ul
元素不能是其他 ul
元素的子元素。您需要将 ul
包装在其关联的 li
.
中
您还需要将文件夹名称包装在另一个元素中,例如 span
,以便可以轻松检索文本。这对于您当前的 HTML 通过拖网文本节点是可能的,但是这是编写混乱的代码并且非常脆弱。一个简单的 HTML 更改是最好的方法。
最后,您可以遍历所单击 .file
的父 li
元素并反转它们的顺序以获得正确格式的路径。从那里您可以附加所选文件的文件名。试试这个:
$.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>
我有点挣扎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
- HelloWorld.docx
- 文件夹:存档
当我单击任何带有“文件”class 的 li 时,我想回顾并通过找到具有 class 的父 li 来计算出路径结构是什么“文件夹”。
我尝试了各种组合,但无法得到它
这就是我目前正在使用的
$(document.body).on('click',"li.file",function (e) {
console.log("clicked");
$(this).parents("li.folder").each(function() {
console.log($(this).text());
});
});
最终我想找回一个完整的路径,其中包含父文件夹和变量中的文件名。
例如文件路径 = /Test/Archive/HelloWorld.docx
这是一个 jsfiddle https://jsfiddle.net/e5d7bcyz/ 谢谢
好吧,您正在寻找的 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 元素实际上是父元素。
在处理您的问题之前,您首先需要更正 HTML。 ul
元素不能是其他 ul
元素的子元素。您需要将 ul
包装在其关联的 li
.
您还需要将文件夹名称包装在另一个元素中,例如 span
,以便可以轻松检索文本。这对于您当前的 HTML 通过拖网文本节点是可能的,但是这是编写混乱的代码并且非常脆弱。一个简单的 HTML 更改是最好的方法。
最后,您可以遍历所单击 .file
的父 li
元素并反转它们的顺序以获得正确格式的路径。从那里您可以附加所选文件的文件名。试试这个:
$.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>