隐藏嵌套列表的非活动同级
Hide inactive siblings of nested list
我的工具只是纯粹的JavaScript。我有一个从 JSON 构建的嵌套列表:
function buildList(data, isSub){
var html = (isSub)?'<div class="nested">':''; // Wrap with div if true
html += '<ul id="mainnav">';
for(item in data){
html += '<li>';
if(typeof(data[item].sub) === 'object'){ // An array will return 'object'
if(isSub){
html += '<a href="' + data[item].link + '">' + data[item].name + '</a>';
} else {
html += data[item].id; // Submenu found, but top level list item.
}
html += buildList(data[item].sub, true); // Submenu found. Calling recursively same method (and wrapping it in a div)
} else {
html += data[item].id // No submenu
}
html += '</li>';
}
html += '</ul>';
html += (isSub)?'</div>':'';
return html;
}
(function(){
// Json config for menu
var JSON = {
menu: [
{id: 'First',sub: [
{name: 'lorem ipsum 0-0',link: '0-0', sub: null},
{name: 'lorem ipsum 0-1',link: '0-1', sub: null},
{name: 'lorem ipsum 0-2',link: '0-2', sub: null}
]
},
{id: 'Second',sub: null},
{id: 'Third',sub: [
{name: 'lorem ipsum 2-0',link: '2-0', sub: null},
{name: 'lorem ipsum 2-1',link: '2-1', sub: null},
{name: 'lorem ipsum 2-2',link: '2-2', sub: [
{name: 'lorem ipsum 2-2-0',link: '2-2-0', sub: null},
{name: 'lorem ipsum 2-2-1',link: '2-2-1', sub: null},
{name: 'lorem ipsum 2-2-2',link: '2-2-2', sub: null},
{name: 'lorem ipsum 2-2-3',link: '2-2-3', sub: null},
{name: 'lorem ipsum 2-2-4',link: '2-2-4', sub: null},
{name: 'lorem ipsum 2-2-5',link: '2-2-5', sub: null},
{name: 'lorem ipsum 2-2-6',link: '2-2-6', sub: null}
]},
{name: 'lorem ipsum 2-3',link: '2-3', sub: null},
{name: 'lorem ipsum 2-4',link: '2-4', sub: null},
{name: 'lorem ipsum 2-5',link: '2-5', sub: null}
]
},
{id: 'Fourth',sub: null},
{id: 'Five',sub: [
{name: 'lorem ipsum 0-5',link: '0-5', sub: null},
{name: 'lorem ipsum 0-6',link: '0-6', sub: null},
{name: 'lorem ipsum 0-7',link: '0-7', sub: null}
]
}
]
}
document.write(buildList(JSON.menu,false));
})()
在这个嵌套列表的某些元素上,我也有一些事件侦听器:
function rollup()
{
// Check we're working with a DOM compliant browser
if (document.getElementById && document.createElement)
{
var objMenu = document.getElementById('mainnav');
var objNested = objMenu.getElementsByClassName('nested');
// Hide each of the nested unordered list
for (var i=0; i<objNested.length; i++){
objNested[i].style.display = 'none';
}
// Adding events on every child of mainMenu
var childrenOfMenu = objMenu.children;
// On click event
for (var i=0; i<childrenOfMenu.length; i++){
childrenOfMenu[i].addEventListener('click', function () {
var listChildren = this.children;
for (var i = 0; i < listChildren.length; i++) {
childrenOfMenu[i].style.display = 'none';
listChildren[i].style.display = 'block';
console.log(listChildren[i].parentNode.nextElementSibling);
listChildren[i].parentNode.nextElementSibling.style.display = 'none';
// this.parentNode.style.display = 'none';
}
});
// Mouse over event
childrenOfMenu[i].addEventListener('mouseover', function () {
var listChildren = this.children;
for (var i = 0; i < listChildren.length; i++) {
listChildren[i].style.display = 'block';
// this.children.nextElementSibling.style.display = 'none';
}
});
// When mouse out of list
// childrenOfMenu[i].addEventListener('mouseout', function () {
// var listChildren = this.children;
// for (var i = 0; i < listChildren.length; i++) {
// listChildren[i].style.display = 'none';
// }
// });
}
}
}
window.onload=rollup;
问题:当我单击列表外的某个地方时,所有嵌套元素都必须隐藏,该怎么办。
尝试在单击处理程序上添加文档,并在触发时检查事件的目标以确保它在您的列表之外,如果是这样,请隐藏元素
相关文章:
- 用嵌套函数和默认函数定义函数
- 如何在ReactJS JSX中执行嵌套的if-else语句
- 可以简化嵌套的延迟Q Promises解析吗
- 用于搜索的聚合物嵌套绑定
- 搜索具有特定属性集的非嵌套节点
- 隐藏嵌套列表的非活动同级
- 如何为性能执行多个异步函数(非嵌套),但等待它们完成再继续
- 如何使用jQuery简单地删除非嵌套文本的字符
- 正在删除嵌套列表元素类,该类基于外部列表元素上的非单击
- 在Jade中嵌套Mixin导致非法令牌错误
- 用Angular UI路由器高亮显示活动的嵌套状态
- ElasticSearch如何将非嵌套过滤器转换为查询
- 展开/折叠所有嵌套的手风琴和非手风琴项目:BOOTSTRAP
- 函数声明不能嵌套在非函数块中
- jQuery中的非嵌套动画序列
- Flux架构嵌套和非单例存储
- 引导嵌套旋转木马活动控件
- 从非嵌套对象数组创建嵌套对象数组
- jQuery 选择器来查找所有非嵌套的后代
- Spyon不能在非angularjs环境中使用嵌套函数