利用原生JS自动生成文章标题树的实例
实现原理很简单,就是循环文章模块,并抽取其中的h2、h3标签,将其中的内容赋予给新建的title树。
代码如下:
HTML代码:
<divclass="contextBox"> <divid="article"> <h2>二级标题</h2> <h3>三级标题</h3> <p>hellohellohellohellohellohellohellohellohellohellohellohello</p> <h3>三级标题</h3> <h3>三级标题</h3> <h3>三级标题</h3> <h3>三级标题</h3> <p>hellohellohellohellohellohellohellohellohellohellohello</p> <h2>二级标题</h2> <h3>三级标题</h3> <h3>三级标题</h3> <p>worldworldworldworldworldworldworldworldworldworldworldworldworldworldworldworldworldworldworldworldworldworldworldworldworldworldworldworldworldworldworld</p> <h3>三级标题</h3> <h3>三级标题</h3> <h2>二级标题</h2> <h3>三级标题</h3> <h3>三级标题</h3> <h2>二级标题</h2> <h3>三级标题</h3> <h3>三级标题</h3> <h2>二级标题</h2> <h3>三级标题</h3> <h3>三级标题</h3> </div> <divclass="articleMenu-box"id="articleMenu_box"> <spanclass="articleMenu-open"id="articleMenu_open"></span> <ulclass="articleMenuhello"id="articleMenu"> <spanclass="articleMenu-close"id="articleMenu_close"></span> </ul> </div> </div>
CSS代码:
*{ margin:0; padding:0; border:0; } body{ font:16px/1.5; } ulli,olli{ list-style:none; } .contextBox{ position:relative; width:960px; margin:0auto; } #article{ margin-left:200px; border:1px#eeesolid; padding:15px; } .articleMenua{ text-decoration:none; color:#333; } .articleMenua:hover{ color:#f85455; } .articleMenu-box{ width:170px; position:absolute; left:10px; top:10px; } .articleMenu{ padding:10px; border:1pxsolid#ccc; box-shadow:2px2px2px#eee; } .titleH2,.titleH3{ line-height:1.5em; } .titleH2{ font-weight:bold; } .titleH3{ margin-left:20px; } .articleMenu.articleMenu-close,.articleMenu-open{ display:inline-block; position:absolute; right:0; top:0; height:44px; width:44px; cursor:pointer; } .articleMenu-open{ background:url("http://www.dengzhr.com/wp-content/themes/dengzhr/images/icon_articleMenu_open.png")no-repeat50%50%; display:none; } .articleMenu.articleMenu-close{ background:url("http://www.dengzhr.com/wp-content/themes/dengzhr/images/icon_articleMenu_close.png")no-repeat50%50%; }
JavaScript代码:
vararticle=document.getElementById("article"); vararticleHgroupMenu=document.getElementById("articleMenu"); //关闭和展开文档树 vararticleMenu_open=document.getElementById("articleMenu_open"); vararticleMenu_close=document.getElementById("articleMenu_close"); articleMenu_close.onclick=function(){ articleHgroupMenu.style.display="none"; articleMenu_open.style.display="block"; }; articleMenu_open.onclick=function(){ articleHgroupMenu.style.display="block"; articleMenu_open.style.display="none"; }; // titleHgroup(article,articleHgroupMenu,"titleH2","titleH3"); //获得obj下的直接子元素中为标题h2~h3的标题元素 //参数说明:hgroupParent为包含h2和h3的直接父元素;MenuList为承载新建文章列表的ul元素; //h2ClassName、h3ClassName分别为新建文章列表中对应h2、h3的li自列表的Class属性; functiontitleHgroup(hgroupParent,MenuList,h2ClassName,h3ClassName){ varhgroup=hgroupParent.children; //创建文档片段,来包裹自动生成的h2、h3对应生成的li列表 varfragment=document.createDocumentFragment(); for(i=0;i<hgroup.length&&hgroup[i].nodeType===1;i++){ //为对应类型的标题生成li列表 //参数说明:hType为标题的类型如h1~h6;className为标题对应的li列表的class属性值; functiontitleToList(hType,className){ varli=document.createElement("li"); li.className=className; //为li标签内部添加a标签,用锚点进行定位; hgroup[i].id=hType+i; li.innerHTML=("<ahref='#"+hType+i+"'>"+hgroup[i].innerHTML+"</a>"); fragment.appendChild(li); } //当遍历中标题元素为h2时,调用titleToList(hType,className)新增对应的li列表; if(hgroup[i].nodeName.toLowerCase()=="h2"){ titleToList("h2",h2ClassName); } //当遍历中标题元素为h3时,调用titleToList(hType,className)新增对应的li列表; if(hgroup[i].nodeName.toLowerCase()=="h3"){ titleToList("h3",h3ClassName); } } //将承载好对应li元素集合的文档片段fragment添加到DOM(即在DOM中包裹li列表的父元素)中去; MenuList.appendChild(fragment); }
完整实例代码
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <htmlxmlns="http://www.w3.org/1999/xhtml"> <head> <metahttp-equiv="Content-Type"content="text/html;charset=gb2312"/> <title>原生JS实现自动生成文章标题树</title> <styletype="text/css"> *{ margin:0; padding:0; border:0; } body{ font:16px/1.5; } ulli,olli{ list-style:none; } .contextBox{ position:relative; width:960px; margin:0auto; } #article{ margin-left:200px; border:1px#eeesolid; padding:15px; } .articleMenua{ text-decoration:none; color:#333; } .articleMenua:hover{ color:#f85455; } .articleMenu-box{ width:170px; position:absolute; left:10px; top:10px; } .articleMenu{ padding:10px; border:1pxsolid#ccc; box-shadow:2px2px2px#eee; } .titleH2,.titleH3{ line-height:1.5em; } .titleH2{ font-weight:bold; } .titleH3{ margin-left:20px; } .articleMenu.articleMenu-close,.articleMenu-open{ display:inline-block; position:absolute; right:0; top:0; height:44px; width:44px; cursor:pointer; } .articleMenu-open{ background:url("http://www.dengzhr.com/wp-content/themes/dengzhr/images/icon_articleMenu_open.png")no-repeat50%50%; display:none; } .articleMenu.articleMenu-close{ background:url("http://www.dengzhr.com/wp-content/themes/dengzhr/images/icon_articleMenu_close.png")no-repeat50%50%; } </style> </head> <body> <divclass="contextBox"> <divid="article"> <h2>二级标题</h2> <h3>三级标题</h3> <p>hello<br/>hello<br/>hello<br/>hello<br/>hello<br/>hello<br/><br/>hello<br/>hell<br/>ohel<br/>lohell<br/>ohe<br/>llohello</p> <h3>三级标题</h3> <h3>三级标题</h3> <h3>三级标题</h3> <h3>三级标题</h3> <p>hellohellohellohellohellohellohellohellohellohellohello</p> <h2>二级标题</h2> <h3>三级标题</h3> <h3>三级标题</h3> <p>worldw<br/>orld<br/>worldworldwo<br/>rldworldwo<br/>rldworldworldwor<br/>ldworldworld<br/>world<br/>worl<br/>dworld<br/>w<br/>orld<br/>worldwo<br/>rldwor<br/>ldworldwor<br/>ldworldworl<br/>dw<br/>or<br/>ld<br/><br/>world<br/>world<br/>world<br/><br/>wo<br/>rldwo<br/>rldw<br/>orldw<br/>orld</p> <h3>三级标题</h3> <h3>三级标题</h3> <h2>二级标题</h2> <h3>三级标题</h3> <h3>三级标题</h3> <h2>二级标题</h2> <h3>三级标题</h3> <h3>三级标题</h3> <h2>二级标题</h2> <h3>三级标题</h3> <h3>三级标题</h3> </div> <divclass="articleMenu-box"id="articleMenu_box"> <spanclass="articleMenu-open"id="articleMenu_open"></span> <ulclass="articleMenuhello"id="articleMenu"> <spanclass="articleMenu-close"id="articleMenu_close"></span> </ul> </div> </div> <scripttype="text/javascript"> vararticle=document.getElementById("article"); vararticleHgroupMenu=document.getElementById("articleMenu"); //关闭和展开文档树 vararticleMenu_open=document.getElementById("articleMenu_open"); vararticleMenu_close=document.getElementById("articleMenu_close"); articleMenu_close.onclick=function(){ articleHgroupMenu.style.display="none"; articleMenu_open.style.display="block"; }; articleMenu_open.onclick=function(){ articleHgroupMenu.style.display="block"; articleMenu_open.style.display="none"; }; // titleHgroup(article,articleHgroupMenu,"titleH2","titleH3"); //获得obj下的直接子元素中为标题h2~h3的标题元素 //参数说明:hgroupParent为包含h2和h3的直接父元素;MenuList为承载新建文章列表的ul元素; //h2ClassName、h3ClassName分别为新建文章列表中对应h2、h3的li自列表的Class属性; functiontitleHgroup(hgroupParent,MenuList,h2ClassName,h3ClassName){ varhgroup=hgroupParent.children; //创建文档片段,来包裹自动生成的h2、h3对应生成的li列表 varfragment=document.createDocumentFragment(); for(i=0;i<hgroup.length&&hgroup[i].nodeType===1;i++){ //为对应类型的标题生成li列表 //参数说明:hType为标题的类型如h1~h6;className为标题对应的li列表的class属性值; functiontitleToList(hType,className){ varli=document.createElement("li"); li.className=className; //为li标签内部添加a标签,用锚点进行定位; hgroup[i].id=hType+i; li.innerHTML=("<ahref='#"+hType+i+"'>"+hgroup[i].innerHTML+"</a>"); fragment.appendChild(li); } //当遍历中标题元素为h2时,调用titleToList(hType,className)新增对应的li列表; if(hgroup[i].nodeName.toLowerCase()=="h2"){ titleToList("h2",h2ClassName); } //当遍历中标题元素为h3时,调用titleToList(hType,className)新增对应的li列表; if(hgroup[i].nodeName.toLowerCase()=="h3"){ titleToList("h3",h3ClassName); } } //将承载好对应li元素集合的文档片段fragment添加到DOM(即在DOM中包裹li列表的父元素)中去; MenuList.appendChild(fragment); } </script> </body> </html>
总结
以上就是利用原生JS自动生成文章标题树的全部内容,希望本文的内容对大家能有所帮助,如果有疑问可以留言讨论。