我想要用ul+li实现多级动态菜单,可以灵活添加元素和删除元素。
预期的效果如下:(图中的线是我画的,帮助理解各元素关系的,实际页面中不需要。)
但是现实的效果惨不忍睹,添加元素功能实现了,但是排版是乱的,完全看不出来逻辑关系
截图如下:
代码如下:
nbsp;html>
-
工程名称:
-
项目名称:- 子项名称:
-
- 子项名称:
-
<script> <br /> <br /> function reduce(obj) <br /> { <br /> alert("reduce") <br /> } <br /> <br /> function add(obj){ <br /> var a=obj.parentNode.id.split("_"); <br /> var targetobj=obj.parentNode.previousSibling; <br /> while (targetobj.nodeType!=1) <br /> { <br /> targetobj=targetobj.previousSibling; <br /> } <br /> var parentinput=targetobj.firstChild <br /> while (parentinput.nodeType!=1) <br /> { <br /> parentinput=parentinput.nextSibling; <br /> } <br /> var lastelement=targetobj.lastChild <br /> while (lastelement.nodeType!=1) <br /> { <br /> lastelement=lastelement.previousSibling; <br /> } <br /> var b=lastelement.id.split("_"); <br /> if (b[0]="designul"){temp=parseInt(b[2])+1}else{temp=1} <br /> var c=obj.parentNode.parentNode.id.split("_"); <br /> var temp; <br /> var createul=document.createElement("ul"); <br /> createul.id=c[0]+"_"+(parseInt(c[1])+1)+"_"+temp; <br /> createul.name=targetobj.id; <br /> targetobj.appendChild(createul); <br /> lastelement=lastelement.nextSibling ; <br /> while (lastelement.nodeType!=1) <br /> { <br /> lastelement=lastelement.nextSibling; <br /> } <br /> var createli; <br /> var d=lastelement.id.split("_"); <br /> temp=(parseInt(d[2])-1)*2; <br /> for (var i=1;i<3;i++) <br /> { <br /> createli=document.createElement("li"); <br /> createli.id="li_"+d[1]+"_"+(parseInt(temp)+i) <br /> createli.name=lastelement.id; <br /> lastelement.appendChild(createli); <br /> switch (i) <br /> { <br /> case i=1: <br /> var createinput=document.createElement("input"); <br /> createinput.id="input_"+createul.id.split("_")[1]+"_"+createul.id.split("_")[2]; <br /> createinput.name =parentinput.id; <br /> createinput.type ="text" ; <br /> createinput.value=createinput.id+"+"+createinput.name; <br /> createli.innerHTML="子项名称:"; <br /> createli.appendChild(createinput); <br /> break; <br /> case i=2: <br /> var createbutton=document.createElement("input"); <br /> createbutton.id="add_"+createul.id.split("_")[1]+"_"+createli.id.split("_")[2]; <br /> createbutton.name=createli.id; <br /> createbutton.type="button"; <br /> createbutton.value="添加下级节点"; <br /> createbutton.onclick=function(){add(this);}; <br /> createli.appendChild(createbutton); <br /> createbutton=document.createElement("input"); <br /> createbutton.id="reduce_"+createul.id.split("_")[1]+"_"+createli.id.split("_")[2]; <br /> createbutton.name=createli.id <br /> createbutton.type="button" <br /> createbutton.value="删除下级节点" <br /> createbutton.onclick=function(){reduce(this);}; <br /> createli.appendChild(createbutton); <br /> break; <br /> } <br /> } <br /> } <br /> </script>
谁能告诉我如何实现?谢谢了。
回复讨论(解决方案)
<!doctype html><html lang="en"><head> <meta charset="UTF-8"> <title>页面名称</title><style type="text/css">ul {padding: 0;margin: 0;height: auto;position: relative;display: block;border:2px solid;border-radius:10px;-moz-border-radius:10px; /* Old Firefox */}li {display: block;padding: 10px;padding-left: 20px;margin: 0;border: 0px;height: auto;min-height: 25px;position: relative;width: auto;vertical-align: middle;white-space:nowrap;display:compact}</style><script type="text/javascript" src="http://code.jquery.com/jquery-1.11.2.min.js"></script></head><body><ul class="head"> <li><input type="text" /><input type="button" value="添加子节点" class="add" /></li></ul><script type="text/javascript">$(".head").on("click", ".add", function(event){ var ul = $(this).parent().children("ul"); if (ul.length==0) ul = $("<ul>").appendTo($(this).parent()); ul.append('<li><input type="text" /><input type="button" value="删除" class="del" /><input type="button" value="添加子节点" class="add" /></li>');}).on("click", ".del", function(event){ $(this).parent().remove();});</script></body></html>
[/code]
非常感谢,你的代码很简单呀,原来都不知道还可以这么写,不过我的代码中每一个新加入的input的id和name都是用来体现结构关系的,比如说,所有input的name都是上一级input的id,这样通过name就能找到下级的所有input,id也是,都是按“类型_层级_序号”这种关系命名的。
你的代码实现的效果跟我现在的差不多,多加入几个层级后,画面会看着很乱,逻辑关系就不清楚了,我想实现下图的效果,不知道有没有什么办法,如果你知道能说一下吗?我好像每个帖子只能回复3次,所以连话也不敢多说。
如图:
<!doctype html><html lang="en"><head> <meta charset="UTF-8"> <title>页面名称</title><style type="text/css">ul {padding: 0;margin: 0;height: auto;position: relative;display: block;border:2px solid;border-radius:10px;-moz-border-radius:10px; /* Old Firefox */float: left;}li {display: block;padding: 10px;padding-left: 20px;margin: 0;border: 0px;height: auto;min-height: 25px;position: relative;width: auto;vertical-align: middle;white-space:nowrap;clear: left;}li input { float: left; width: 60px;}li .add { width: 56px;}li .del { width: 40px;}</style><script type="text/javascript" src="http://code.jquery.com/jquery-1.11.2.min.js"></script></head><body><ul class="head"> <li><input type="text" name="a" value="a" class="txt" /><input type="button" value="添加子" class="add" data-n="0" /></li></ul><script type="text/javascript">$(".head").on("click", ".add", function(event){ var ul = $(this).parent().children("ul"); if (ul.length==0) ul = $("<ul>").appendTo($(this).parent()); var nn = parseInt($(this).data("n"), 10)+1; $(this).data("n",nn); var n = $(this).parent().children(".txt").attr("name")+"_"+nn; ul.append('<li><input type="text" name="'+n+'" value="'+n+'" class="txt" /><input type="button" value="删除" class="del" /><input type="button" value="添加子" class="add" data-n="0" /></li>');}).on("click", ".del", function(event){ if ($(this).parent().parent().children("li").length<=1) $(this).parent().parent().remove(); else $(this).parent().remove();});</script></body></html>

公众号网页更新缓存,这玩意儿,说简单也简单,说复杂也够你喝一壶的。你辛辛苦苦更新了公众号文章,结果用户打开还是老版本,这滋味,谁受得了?这篇文章,咱就来扒一扒这背后的弯弯绕绕,以及如何优雅地解决这个问题。读完之后,你就能轻松应对各种缓存难题,让你的用户始终体验到最新鲜的内容。先说点基础的。网页缓存,说白了就是浏览器或者服务器为了提高访问速度,把一些静态资源(比如图片、CSS、JS)或者页面内容存储起来。下次访问时,直接从缓存里取,不用再重新下载,速度自然快。但这玩意儿,也是个双刃剑。新版本上线,

本文讨论了使用HTML5表单验证属性,例如必需的,图案,最小,最大和长度限制,以直接在浏览器中验证用户输入。

本文展示了使用CSS为网页中添加有效的PNG边框。 它认为,与JavaScript或库相比,CSS提供了出色的性能,详细介绍了如何调整边界宽度,样式和颜色以获得微妙或突出的效果

本文讨论了html&lt; datalist&gt;元素,通过提供自动完整建议,改善用户体验并减少错误来增强表格。Character计数:159

本文讨论了HTML&lt; meter&gt;元素,用于在一个范围内显示标量或分数值及其在Web开发中的常见应用。它区分了&lt; meter&gt;从&lt; progress&gt;和前

本文解释了HTML5&lt; time&gt;语义日期/时间表示的元素。 它强调了DateTime属性对机器可读性(ISO 8601格式)的重要性,并在人类可读文本旁边,增强Accessibilit

本文讨论了HTML&lt; Progress&gt;元素,其目的,样式和与&lt; meter&gt;元素。主要重点是使用&lt; progress&gt;为了完成任务和LT;仪表&gt;对于stati


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

Atom编辑器mac版下载
最流行的的开源编辑器

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

Dreamweaver CS6
视觉化网页开发工具