javascript - 从 <ul>、<li> 树格式获取值

标签 javascript html jquery css

我有以下 TreeView :

ul {
  list-style-type: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.14.0/css/all.min.css" />

<ul id="myTreeSelector" onClick="getPath()">
  <li>
    <span class="caret folder-selector"><i class="fa fa-folder"></i> first_folder</span>
    <ul class="nested">
      <li class="file"><i class="fa fa-file"></i> app1.dat</li>
      <li class="file"><i class="fa fa-file"></i> app2.dat</li>
      <li>
        <span class="caret folder-selector"><i class="fa fa-folder"></i> second_folder</span>
        <ul class="nested">
          <li class="file"><i class="fa fa-file"></i> ret.dat</li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

这会生成一个像这样的文件夹树:

enter image description here

我正在寻找的是,当我单击任何文件或文件夹时,获取“完整文件/文件夹路径”。这意味着:

  • 如果我点击 app1.dat,我想要的输出是:first_folder/app1.dat
  • 如果我点击 second_folder,我想要的输出是:first_folder/second_folder
  • 如果我点击 ret.dat,我想要的输出是:first_folder/second_folder/ret.dat

我怎样才能实现这个目标?我尝试但没有运气获得该值:

function getPath() {
    var value = $("#myTreeSelector").val()
    console.log(value)
}

编辑:树可以有超过 2 个级别,这只是一个缩小的示例。

最佳答案

这里是通用代码,您所需要做的就是向 li 添加事件(使用事件委托(delegate))并使用作为所选 li 元素的父级的 li 元素的父级。

$(function() {
  $('#myTreeSelector').on('click', 'li', function() {
     var item = $(this);
     var path = [];
     if (item.is('.file')) {
        path.push(item.text().trim());
     } else {
        path.push(item.find('> .folder-selector').text().trim() + '/');
     }
     var parents = item.parents('#myTreeSelector li');
     path = parents.map(function() {
        return $(this).find('> .folder-selector').text().trim();
     }).get().reverse().concat(path);
     console.log(path.join('/'));
     return false;
  });
});
     
ul {
  list-style-type: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.14.0/css/all.min.css" />

<ul id="myTreeSelector">
  <li>
    <span class="caret folder-selector"><i class="fa fa-folder"></i> first_folder</span>
    <ul class="nested">
      <li class="file"><i class="fa fa-file"></i> app1.dat</li>
      <li class="file"><i class="fa fa-file"></i> app2.dat</li>
      <li>
        <span class="caret folder-selector"><i class="fa fa-folder"></i> second_folder</span>
        <ul class="nested">
          <li class="file"><i class="fa fa-file"></i> ret.dat</li>
          <li><span class="caret folder-selector"><i class="fa fa-folder"></i> third_folder</span></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

关于javascript - 从 <ul>、<li> 树格式获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64242378/

相关文章:

javascript - 如何禁用拉达按钮?

javascript - Karma 错误 - 没有捕获浏览器,打开 http ://localhost:9876/

javascript - jQuery 鼠标悬停淡入淡出效果

html - CSS - 绝对定位的全宽元素在缩放后被剪切

javascript - 对话框中的长度错误

javascript - 在 ajax 请求上启用 jQuery contextMenu 项

javascript - 运行 Selenium Webdriver 测试时没有出现警报

javascript - 可拖动的 <div> 在 Firefox 中发布后不会恢复到其原始大小

javascript - 展开和折叠多个缩略图

html - CSS 网格 - 图像上的文本框