【问题标题】:JsTree: Show more optionsJsTree:显示更多选项
【发布时间】:2019-05-16 09:52:30
【问题描述】:

有没有办法在jsTree 中有一个show more 选项/链接? 我只想显示部分孩子,并有一个链接可以展开以显示所有元素。 我尝试了一些谷歌搜索,但找不到解决方案。任何帮助/提示都会很有用。

假设 parent-1 有 10 个子节点,主根有 5 个父节点。

Main Parent
    - Parent - 1
        - child-1
        - child-2
        - child-3
        show 7 more parent-1 elements //LINK
    - Parent - 2
        - child-1
        - child-2
    - Parent - 3
        - child-1
        - child-2
    show 2 more Main Parent elements //LINK

我正在努力实现以下结果

这可能吗?有没有可用的插件? jsTree 是否有其他支持此功能的替代方案?

【问题讨论】:

  • 使用 jQuery file-explore.js 这是演示链接jqueryscript.net/demo/…
  • 你想显示所有剩余的元素编号吗?
  • 是的,我需要将所有剩余的节点(非匹配节点)显示为一个链接,显示更多的 N 个元素。像这样。并且匹配的项目应该被突出显示。通过 JsTree 已经可以突出显示匹配的项目。我正在寻找显示更多链接。感谢@V.Sambor 的回复
  • 能否请您出示您目前拥有的代码?

标签: javascript jquery html css jstree


【解决方案1】:

您可以使用类/childElement 计数来解决这个问题。根据您要显示的内容,您可以使用 ids/classes 让您想要保持可见或可选显示/隐藏的元素。相同的原则可以应用于子元素(比如列表中的列表项)和更高的父元素,所以一旦你有了第一个函数,它就可以很容易地适应。

我在这里包含了一个列表示例来给你一个想法(它是在普通的 javascript 中,你可以稍微调整一下..)Jquery 会使 js 更短,但了解我认为的香草总是很好的..

var x = document.getElementById("show");
//var root = document.getElementsByTagName('body')[0];
var count = x.childElementCount;
var btn1 = document.getElementById("ulmore");
btn1.innerHTML = "+ Show all " + count + " li children";
document.getElementById("ulmore").addEventListener("click", showmore);

function showmore() {
  //var d = document.getElementsByClassName("tg1").length;
  //use d if you want to show "show d more children" instead of the full amount of children
  var el = document.getElementsByTagName("li");

  var i;
  for (i = 0; i < el.length; i++) {
    if (el[i].classList.contains("tg1")) {
      //el[i].style.display = "block"; works
      el[i].classList.toggle('more');
      if (el[i].classList.contains("more")) {
        btn1.innerText = "Hide children";
      } else {
        btn1.innerText = "+ Show all " + count + " li children";
      }
    }
  }
}
body {
  padding: 1em;
  font-size: 10pt;
}

ul {
  list-style: none;
  width: 10em;
  padding: 0px;
}

li {
  text-align: left;
  line-height: 1.5;
  background: lightblue;
  border: 1px solid #444;
  margin: 1px 0px;
  padding: 2px;
}

span {
  display: inline-block;
}

div {
  display: inline-block;
  width: 100%;
  float: left;
  margin: 1em 2em 1em 0em;
}

.tg1 {
  background: lightsteelblue;
  display: none;
}

.more {
  background: lightsteelblue;
  display: block;
}

/*.tog2 {
  display: none;
}

.grow {
  background: yellow;
  display: inline-block;
}*/
<body>
  <div id="ulbit">
    <h4>Demo List</h4>
    <ul id="show">
      <li>One</li>
      <li>Two</li>
      <li class="tg1">Three</li>
      <li class="tg1">Four</li>
      <li class="tg1">Five</li>
      <li class="tg1">Six</li>
      <li class="tg1">Seven</li>
      <li class="tg1">Eight</li>
    </ul>
    <span id="ulmore"></span>
  </div>

<!--  <div class="tog2">
    Div 2 hello
  </div>
  <div class="tog2">
    Div 3
  </div>
  <span id="divmore"></span>-->
</body>

这是代码中的fiddle link (with body 'parent' elements) included。 (注意:即使是&lt;br&gt; 标签 [当在 div 之间使用时] 也将被视为顶级元素。我认为如果您想计算不同类型的'parent' 元素(而不是计算 body 的子元素)。小提琴中包含两者(body 的子元素和 getElementsByTagName)的示例)

希望对你有帮助

【讨论】:

    【解决方案2】:

    您是否尝试使用“before_open.jstree”事件以您需要的方式显示树? 查看示例(我使用了 jstree 站点的部分演示页面):

    <!DOCTYPE html>
    <html lang="en">
    <head>
    	<meta charset="UTF-8">
    	<title>jstree basic demos</title>
    	<style>
    	html { margin:0; padding:0; font-size:62.5%; }
    	body { max-width:800px; min-width:300px; margin:0 auto; padding:20px 10px; font-size:14px; font-size:1.4em; }
    	h1 { font-size:1.8em; }
    	.demo { overflow:auto; border:1px solid silver; min-height:100px; }
    	</style>
    	<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/themes/default/style.min.css" />
    </head>
    <body>
    	<h1>Interaction and events demo</h1>
    	<button id="evts_button">select node with id 1</button> <em>either click the button or a node in the tree</em>
    	<div id="evts" class="demo"></div>
    
    	<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    	<script src="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/jstree.min.js"></script>
    	
    	<script>
    	
    	// interaction and events
    	$('#evts_button').on("click", function () {
    		var instance = $('#evts').jstree(true);
    		instance.deselect_all();
    		instance.select_node('1');
    	});
    	$('#evts')
    		.on("changed.jstree", function (e, data) {
    			if(data.selected.length) {
    				alert('The selected node is: ' + data.instance.get_node(data.selected[0]).text);
    			}
    		})
    		.on("before_open.jstree", function (e, data,a,b,c,d) {
    			$('#' + data.node.id + ' ul li:nth-child(n + 2)').hide();
    			var str = '<li class="jstree-node  jstree-leaf jstree-last" role="treeitem">press to show ' + $('#' + data.node.id + ' ul li:nth-child(n + 2)').length + ' more items</li>';
    			var li = $(str).on('click', function(a,b,c,d) {$(a.target).parent().find('li').show(); $(a.target).hide()});
    			$('#' + data.node.id + ' ul').append(li);
    		})
    		.jstree({
    			'core' : {
    				'multiple' : false,
    				'data' : [
    					{ "text" : "Root node", "children" : [
    							{ "text" : "Child node 1", "id" : 1 },
    							{ "text" : "Child node 2" }
    					]}
    				]
    			}
    		});
    	</script>
    </body>
    </html>

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-03
      • 1970-01-01
      • 2020-01-19
      • 2012-03-27
      • 2021-07-26
      • 2017-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多