这是我的树结构代码。当我单击Tag 1时,class =“ active”,当我单击Asia时,class =“ open”,当我单击Southern-West时,class =“ open”,当我单击India时,class =“ selected” 。一切都显示在链接上的图片中:http://postimg.org/image/4216vmlpj/
<div class="container responsive-tabs-default">
<ul class="responsive-tabs">
<li><a href="#example-1-tab-1" target="_self">Tag 1</a></li>
<li><a href="#example-1-tab-2" target="_self">Tag 2 </a></li>
</ul>
<div class="responsive-tabs-content bm-larger">
<div id="example-1-tab-1" class="responsive-tabs-panel">
<!-- TREE BEGIN-->
<h1>Naslov</h1>
<!-- <input type="search" id="my-search" placeholder="search"> -->
<ul id="my-tree1">
<li>
<div>Asia</div>
<ul>
<li>
<div>Southern-West</div>
<ul>
<li><div>India</div></li>
<li><div>Pakistan</div></li>
<li><div>Butan</div></li>
</ul>
</li>
<li><div>Southern-East</div>
<ul>
<li><div>Indonesia</div></li>
<li><div >Vietnam</div></li>
<li><div >malaysia</div></li>
</ul>
</li>
<li><div>Far-east</div>
<ul>
<li><div>China</div></li>
<li><div>North Korea</div></li>
<li><div>South Korea</div></li>
<li><div>Japan</div></li>
</ul>
</li>
<li><div>Central</div>
<ul>
<li><div>Mongol</div></li>
<li><div>kazakhstan</div></li>
<li><div>kyrgyzstan</div></li>
</ul>
</li>
</ul>
</li>
<li><div>Antarctica</div></li>
<li>
<div>Africa</div>
<ul>
<li><div>Moroco</div></li>
<li><div>Egypt</div></li>
<li><div>Ghana</div></li>
</ul>
</li>
<li>
<div>Europe</div>
<ul>
<li><div>United Kingdom</div></li>
<li><div>Sweden</div></li>
<li><div>Germany</div></li>
<li><div>France</div></li>
<li><div>Spain</div></li>
<li><div>Italy</div></li>
<li><div>Austria</div></li>
<li><div>Turkey</div></li>
<li><div>Russia</div></li>
<li><div>Denmark</div></li>
<li><div>Finland</div></li>
<li><div>Iceland</div></li>
<li><div>Switzerland</div></li>
<li><div>Hungary</div></li>
</ul>
</li>
</ul>
<!-- TREE END-->
</div>
<div id="example-1-tab-2" class="responsive-tabs-panel">
<h1>Naslov</h1>
<!-- <input type="search" id="my-search" placeholder="search"> -->
<ul id="my-tree2">
<li>
<div>Asia</div>
<ul>
<li>
<div>Southern-West</div>
<ul>
<li><div>India</div></li>
<li><div>Pakistan</div></li>
<li><div>Butan</div></li>
</ul>
</li>
<li><div>Southern-East</div>
<ul>
<li><div>Indonesia</div></li>
<li><div>Vietnam</div></li>
<li><div>malaysia</div></li>
</ul>
</li>
<li><div>Far-east</div>
<ul>
<li><div>China</div></li>
<li><div>North Korea</div></li>
<li><div>South Korea</div></li>
<li><div>Japan</div></li>
</ul>
</li>
<li><div>Central</div>
<ul>
<li><div>Mongol</div></li>
<li><div>kazakhstan</div></li>
<li><div>kyrgyzstan</div></li>
</ul>
</li>
</ul>
</li>
<li><div>Antarctica</div></li>
<li>
<div>Africa</div>
<ul>
<li><div>Moroco</div></li>
<li><div>Egypt</div></li>
<li><div>Ghana</div></li>
</ul>
</li>
<li>
<div>Europe</div>
<ul>
<li><div>United Kingdom</div></li>
<li><div>Sweden</div></li>
<li><div>Germany</div></li>
<li><div>France</div></li>
<li><div>Spain</div></li>
<li><div>Italy</div></li>
<li><div>Austria</div></li>
<li><div>Turkey</div></li>
<li><div>Russia</div></li>
<li><div>Denmark</div></li>
<li><div>Finland</div></li>
<li><div>Iceland</div></li>
<li><div>Switzerland</div></li>
<li><div>Hungary</div></li>
</ul>
</li>
</ul>
</div>
</div>
</div>
我希望该文本显示在页面的右侧,就像在图片上显示的那样。因此,当我选择标签1时,将其写为标签1。当我单击亚洲时,便会写上亚洲...。我发现一种解决方案可以向我显示单击的文本,但不能正常工作。当我单击亚洲时,不仅写了亚洲,而且还写了亚洲西南印度巴基斯坦巴基斯坦但南东南亚越南...因此,当我单击亚洲时,会显示亚洲以下所有树木结构的元素,但只有亚洲必须显示。第二个问题是,并非我的所有选择都被写了。因此,如果我选择标签1和南极洲,则将显示标签1和南极洲,当我单击标签2时,标签1被标签2取代。我希望存储并显示先前的选择,并在我进行新的选择时显示选择内容写在第一个选择内容的下方。这也必须与国家合作。当我选择“标记1南极洲”,然后选择“欧洲-西班牙”时,必须同时显示两个选项,因此,选择“标记1南极洲”和“标记1欧洲西班牙”。
到目前为止,我已经找到了一个代码:
<script>
$("").click(function () {
<!-- $(this).addClass('tf-selected');
var str = "";
$("li.active").each(function () {
str += $(this).text() +" ";
});
$(".display_text_here").text(str);
});
</script>
<script>
$("").click(function () {
<!-- $(this).addClass('tf-selected');
var str = "";
$("li.tf-open").each(function () {
str += $(this).text() +" ";
});
$(".display_text_here2").text(str);
});
</script>
<script>
$("").click(function () {
<!-- $(this).addClass('tf-selected');
var str = "";
$("li.tf-selected").each(function () {
str += $(this).text() +" ";
});
$(".display_text_here3").text(str);
});
</script>
<div class="display_text_here"></div>
<div class="display_text_here2"></div>
<div class="display_text_here3"></div>
<!DOCTYPE html>
<!-- Responsive Tabs v1.4, Copyright 2014, Joe Mottershaw, https://github.com/joemottershaw/ -->
<html lang="en" class="no-js">
<head>
<!-- tree begin-->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0, target-densitydpi=medium-dpi">
<link type="text/css" rel="stylesheet" href="tree/jquery.treefilter.css">
<link href='http://fonts.googleapis.com/css?family=roboto:400,300,700' rel='stylesheet' type='text/css'>
<script src="jquery-1.3.2.min.js" type="text/javascript"></script> <!-- display selected -->
<style>
body {background:#fff; padding:0;}
.container {font-family:"roboto"; font-size:16px; background:#fff; border-radius:3px;
border:1px solid #ddd;}
h1 {color:#08f; font-weight:100; font-size:44px; margin-top:150px;}
input {background:transparent; font-size:16px; border:1px solid #ddd; border-width:0 0 1px 0; border-radius: 0; line-height:40px; height:40px; width:100%; outline:none;}
ul#my-tree {margin:0; padding:10px 5px; color:#666;}
ul#my-tree li{margin:8px 0;}
div.desc {margin:20px 0; color:#aaa; font-size:11px; text-align:left;}
</style>
<link href="http://www.jqueryscript.net/css/jquerysctipttop.css" rel="stylesheet" type="text/css">
<link href="tabs/css/normalize.css" rel="stylesheet" type="text/css" media="all" />
<link href="tabs/css/responsive-tabs.css" rel="stylesheet" type="text/css" media="all" />
<link href="tabs/css/style2.css" rel="stylesheet" type="text/css" media="all" />
</head>
<body itemscope itemtype="http://schema.org/WebPage">
<table style="width:100%">
<tr>
<td colspan="2" style="background: transparent url('images/top-ozadje2.bmp') repeat-x;">
<!-- Header -->
<h1 style="padding-left:45%"> SELECTION </h1>
</td>
</tr>
<tr>
<td valign="top">
<!-- Content -->
<div class="container responsive-tabs-default">
<ul class="responsive-tabs">
<li><a href="#example-1-tab-1" target="_self">Tag 1</a></li>
<li><a href="#example-1-tab-2" target="_self">Tag 2 </a></li>
</ul>
<div class="responsive-tabs-content bm-larger">
<div id="example-1-tab-1" class="responsive-tabs-panel">
<!-- TREE BEGIN-->
<h1>Naslov</h1>
<!-- <input type="search" id="my-search" placeholder="search"> -->
<ul id="my-tree1">
<li>
<div>Asia</div>
<ul>
<li>
<div>Southern-West</div>
<ul>
<li><div>India</div></li>
<li><div>Pakistan</div></li>
<li><div>Butan</div></li>
</ul>
</li>
<li><div>Southern-East</div>
<ul>
<li><div>Indonesia</div></li>
<li><div >Vietnam</div></li>
<li><div >malaysia</div></li>
</ul>
</li>
<li><div>Far-east</div>
<ul>
<li><div>China</div></li>
<li><div>North Korea</div></li>
<li><div>South Korea</div></li>
<li><div>Japan</div></li>
</ul>
</li>
<li><div>Central</div>
<ul>
<li><div>Mongol</div></li>
<li><div>kazakhstan</div></li>
<li><div>kyrgyzstan</div></li>
</ul>
</li>
</ul>
</li>
<li><div>Antarctica</div></li>
<li>
<div>Africa</div>
<ul>
<li><div>Moroco</div></li>
<li><div>Egypt</div></li>
<li><div>Ghana</div></li>
</ul>
</li>
<li>
<div>Europe</div>
<ul>
<li><div>United Kingdom</div></li>
<li><div>Sweden</div></li>
<li><div>Germany</div></li>
<li><div>France</div></li>
<li><div>Spain</div></li>
<li><div>Italy</div></li>
<li><div>Austria</div></li>
<li><div>Turkey</div></li>
<li><div>Russia</div></li>
<li><div>Denmark</div></li>
<li><div>Finland</div></li>
<li><div>Iceland</div></li>
<li><div>Switzerland</div></li>
<li><div>Hungary</div></li>
</ul>
</li>
</ul>
<!-- TREE END-->
</div>
<div id="example-1-tab-2" class="responsive-tabs-panel">
<h1>Naslov</h1>
<!-- <input type="search" id="my-search" placeholder="search"> -->
<ul id="my-tree2">
<li>
<div>Asia</div>
<ul>
<li>
<div>Southern-West</div>
<ul>
<li><div>India</div></li>
<li><div>Pakistan</div></li>
<li><div>Butan</div></li>
</ul>
</li>
<li><div>Southern-East</div>
<ul>
<li><div>Indonesia</div></li>
<li><div>Vietnam</div></li>
<li><div>malaysia</div></li>
</ul>
</li>
<li><div>Far-east</div>
<ul>
<li><div>China</div></li>
<li><div>North Korea</div></li>
<li><div>South Korea</div></li>
<li><div>Japan</div></li>
</ul>
</li>
<li><div>Central</div>
<ul>
<li><div>Mongol</div></li>
<li><div>kazakhstan</div></li>
<li><div>kyrgyzstan</div></li>
</ul>
</li>
</ul>
</li>
<li><div>Antarctica</div></li>
<li>
<div>Africa</div>
<ul>
<li><div>Moroco</div></li>
<li><div>Egypt</div></li>
<li><div>Ghana</div></li>
</ul>
</li>
<li>
<div>Europe</div>
<ul>
<li><div>United Kingdom</div></li>
<li><div>Sweden</div></li>
<li><div>Germany</div></li>
<li><div>France</div></li>
<li><div>Spain</div></li>
<li><div>Italy</div></li>
<li><div>Austria</div></li>
<li><div>Turkey</div></li>
<li><div>Russia</div></li>
<li><div>Denmark</div></li>
<li><div>Finland</div></li>
<li><div>Iceland</div></li>
<li><div>Switzerland</div></li>
<li><div>Hungary</div></li>
</ul>
</li>
</ul>
</div>
</div>
</div>
</td>
<td valign="top">
<div class="container2" >
<ul class="responsive-tabs">
<h3>You have choosen:</h3>
<button type="button" onClick="window.location.reload()">Delete choosen data</button>
<hr>
</ul>
<p>
<script>
$("").click(function () {
<!-- $(this).addClass('tf-selected');
var str = "";
$("li.active").each(function () {
str += $(this).text() +" ";
});
$(".display_text_here").text(str);
});
</script>
<script>
$("").click(function () {
<!-- $(this).addClass('tf-selected');
var str = "";
$("li.tf-open").each(function () {
str += $(this).text() +" ";
});
$(".display_text_here2").text(str);
});
</script>
<script>
$("").click(function () {
<!-- $(this).addClass('tf-selected');
var str = "";
$("li.tf-selected").each(function () {
str += $(this).text() +" ";
});
$(".display_text_here3").text(str);
});
</script>
<div class="display_text_here"></div>
<div class="display_text_here2"></div>
<div class="display_text_here3"></div>
</p>
</div>
</td>
</tr>
<!-- Footer -->
<!-- JavaScript -->
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js"></script>
<script src="tabs/js/smoothscroll.min.js" type="text/javascript"></script>
<script src="tabs/js/backbone.js" type="text/javascript"></script>
<script src="tabs/js/responsive-tabs.min.js" type="text/javascript"></script>
<!-- tree begin -->
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script src="tree/jquery.treefilter.js"></script>
<script>
$(function() {
var tree = new treefilter($("#my-tree1"), {
searcher : $("input#my-search"),
multiselect : false });
});
</script>
<script>
$(function() {
var tree = new treefilter($("#my-tree2"), {
searcher : $("input#my-search"),
multiselect : false });
});
</script>
<script>
$(function() {
var tree = new treefilter($("#my-tree3"), {
searcher : $("input#my-search"),
multiselect : false });
});
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-36251023-1']);
_gaq.push(['_setDomainName', 'jqueryscript.net']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.tree = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
<!-- tree end -->
</table>
</body>
</html>
不能正常运行,因为我的页面后面有manj js和css脚本。
任何人都可以提出建议,以改善我的解决方案,该解决方案可以满足我的期望。
谢谢大家的帮助
附言
下面的答案很好。非常感谢您所做的所有努力。我还有一个问题。当我重新加载(或第一次打开)页面时,已经选择(打开)了一个标签,并显示了该标签的树状结构。如果我从树形结构中选择一个国家,该自动选择的选项卡也自动写在右侧该怎么办?因为如果我从自动打开的标记中选择一个国家,则该标记的名称不会写在国家名称的前面。
还有,当我选择非洲-马洛科然后是欧洲-德国时,它的运转很棒。但是,如果我再从非洲(如埃及)中选择一个,则该名称写为belov德国(我叫欧洲-德国-埃及)。在这种情况下,我应如何更改埃及(而不是最后一次选举中的德国)?
这也是显示我的问题的图片:http://postimg.org/image/icnw0ves3/
另一个希望是,如果我选择欧洲,然后选择德国,则显示德国,如果然后选择西班牙,则删除德国并写西班牙。因此,仅写入最后选择。有时我需要同时写两个选择,有时只是最后一个。
我的老板使我的生活变得复杂,并希望某些国家写成这样:
标签1 |亚洲:东南偏东=>印度尼西亚;欧洲:德国,西班牙;非洲:Maroco,加纳Tag2 |欧洲:奥地利
我该怎么做?
此代码在Firefox中无效(当单击树形结构时未定义其名称而不是国家/地区名称时),即在Firefox中不起作用。镀铬效果很好。我应该添加什么?
编辑-还有一个问题
首先,感谢您所做的一切。我还有一个问题,我应该怎么做,如果我选择了欧洲,然后选择了德国,它会向我显示德国,如果我选择了西班牙,则删除德国并写上西班牙。因此,仅写入最后选择。有时我需要同时写两个选择,有时只是最后一个。图片:postimg.org/image/mfd4hmuqr我的老板让我的生活变得复杂,并希望选择的国家写成这样:Tag1 |亚洲:东南偏东=>印度尼西亚;欧洲:德国,西班牙;非洲:Maroco,加纳Tag2 |欧洲:奥地利我应该怎么做?
编辑结束
最佳答案
我不知道您的插件在做什么,并且您的JS代码有些难以理解,但是您的文档结构是一致的,而且您的要求也不太复杂,因此您实际上可以执行此操作而无需尝试将多个插件混在一起。
我使用了您的文档结构和样式规则,但没有一个JS代码(包括插件)来实现所需的功能。我只向您的两个根tree
元素(ID为ul
1和2的元素)添加了一个#my-tree
类-我将解释进一步的原因。
基本上,您要实现以下目标:
您的标签选择器(“标签1”和“标签2”)与.container .responsive-tabs li a
选择器匹配。单击它们后,要显示具有与.responsive-tabs-panel
元素的a
属性匹配的ID的相应选项卡面板(所有面板均与href
选择器匹配)。这意味着仅从单击的元素中获取href
属性,从中删除“#”,找到具有相同ID的选项卡面板,并向其中添加active
类,同时将其从所有其他选项卡面板中删除。所以:
CSS:
.responsive-tabs-panel{
display:none;
}
.responsive-tabs-panel.active{
display:block;
}
JS:
var tabs = document.querySelectorAll('.container .responsive-tabs li a'),
tabPanels = document.getElementsByClassName('responsive-tabs-panel');
for(var i=0;i<tabs.length;i++){
tabs[i].addEventListener('click', function(e){
e.preventDefault();
var id = this.getAttribute('href').replace("#","");
for(var j=0;j<tabPanels.length;j++){
if(tabPanels[j].id==id)
tabPanels[j].classList.add('active');
else tabPanels[j].classList.remove('active');
}
},false);
}
现在,在选项卡面板的根
ul
元素(我都给它们提供了tree
类)中,所有选项(无论是大洲,地区还是国家)都与.responsive-tabs-panel li
选择器匹配。当此选项具有更多嵌套选项时,在您的文档结构中,这意味着该选项具有带有ul
标记的子元素,该子元素包含更多选项。因此,如果单击的选项具有更多选项,则要给它一个open
类并显示这些选项,否则要给它一个selected
类。而且,如果再次单击一个已经打开的选项,则要关闭它。因此,在我们的CSS中,我们将希望隐藏所有具有ul
父级的li
元素,除非父级具有open
类。CSS:
.responsive-tabs-panel .tree{
display:block;
}
.responsive-tabs-panel li ul{
display:none;
}
.responsive-tabs-panel li.open > ul{
display:block;
}
JS:
var options = document.querySelectorAll('.responsive-tabs-panel li');
for(var k=0;k<options.length;k++){
options[k].addEventListener('click',function(e){
e.stopPropagation();
var optionText = '',
div = null,
hasMoreOptions = false;
if(this.classList.contains('open')){
this.classList.remove('open');
return;
}
for(var l=0;l<this.children.length;l++){
if(this.children[l].tagName.toLowerCase()=='div'){
div = this.children[l];
optionText = div.innerText;
}
else if(this.children[l].tagName.toLowerCase()=='ul'){
hasMoreOptions = true;
}
}
if(!hasMoreOptions){
this.classList.add('selected');
}
else this.classList.add('open');
},false);
}
(
e.stopPropagation
在这里很重要,因为如果我们不调用它,那么也会在每个被单击的li
的父元素的li
元素上调用eventListener函数。停止它意味着仅在实际单击的选项,而不是其所有与定义options
数组时提供的选择器匹配的父项。)如您在上面可能已经提到的,我们还通过找到
li
子元素并获取其innerText来从单击的div
元素中提取选项文本。这是因为您要记录用户单击的所有元素。随时单击选项卡或选项。最简单的方法是使用clicked选项的文本创建div元素,并将其附加到正确容器中的.container2 p
元素。如果您还想显示所选选项的嵌套级别,则根据文档结构,最简单的方法是计算它具有多少个父
ul
元素,直到到达ul.tree
元素为止(这就是为什么)我将该类添加到根ul
)。您可以将这个数字乘以4个空格,并通过几个简单函数将其附加到.container2 p
元素时,将其添加到选项文本之前。。
var selectedOptions = document.querySelector('.container2 p');
function getNestingLevel(li){
var level = 1,
parent = li.parentNode;
while(!parent.classList.contains('tree')){
if(parent.tagName.toLowerCase()=='ul')
level++;
parent = parent.parentNode;
}
return level;
}
function updateSelectedOptions(optionText,nestingLevel){
var div = document.createElement('div'),
indent = '';
for(var i=1;i<nestingLevel*4;i++)
indent = indent + ' ';
div.innerHTML = indent+optionText;
selectedOptions.appendChild(div);
}
现在,您只需调用
updateSelectedOptions
,即可在较早的eventListener函数中各插入一行(一行用于标记,另一种用于选项):对于标签:
updateSelectedOptions(this.innerText,0);
对于选项:
updateSelectedOptions(optionText,getNestingLevel(this));
这是一支结合了所有内容的笔:http://codepen.io/anon/pen/zxXZYZ
修改后回复:
IE和Firefox上的问题是我正在使用
.innerText
,而我应该使用受支持更多的.innerHTML
属性。因此,该问题已得到解决。至于您的其他问题,我也更改了代码以支持您的要求。现在,默认标记(默认为.responsive-tabs li a
打开)具有一个default
类,如果用户选择一个选项而不先选择一个选项卡,它将起作用。现在还有一个名为latestOpen
的全局变量,其中包含单击打开的最新元素。现在,我们将单击的li
元素直接传递给updateSelectedOptions
函数,该函数将计算lastOpen元素的距离,并使用介于两者之间的所有选项来更新.container2 p
。它还计算嵌套并更新latestOpen
变量。
关于javascript - 树状结构,显示结构中单击元素的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29367107/