123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- /*
- 这段代码按H2、H3格式生成两级菜单
- 写博客按H2、H3格式写,不然生成不了
- Markdown写作按##、###两级目录写
- 当然你也可以改写代码成三级菜单
- 参考:孤傲苍狼 zhang_derek
- 洪卫 2018-5-18
- */
- let BlogDirectory = {
- /* 获取元素位置,距浏览器左边界的距离(left)和距浏览器上边界的距离(top)*/
- getElementPosition: function (ele) {
- let topPosition = 0;
- let leftPosition = 0;
- while (ele) {
- topPosition += ele.offsetTop;
- leftPosition += ele.offsetLeft;
- ele = ele.offsetParent;
- }
- return {top: topPosition, left: leftPosition};
- },
- /*获取滚动条当前位置 */
- getScrollBarPosition: function () {
- let scrollBarPosition = document.body.scrollTop || document.documentElement.scrollTop;
- return scrollBarPosition;
- },
- /* 移动滚动条,finalPos 为目的位置,internal 为移动速度 */
- moveScrollBar: function (finalpos, interval) {
- //若不支持此方法,则退出
- if (!window.scrollTo) {
- return false;
- }
- //窗体滚动时,禁用鼠标滚轮
- window.onmousewheel = function () {
- return false;
- };
- //清除计时
- if (document.body.movement) {
- clearTimeout(document.body.movement);
- }
- //获取滚动条当前位置
- let currentpos = BlogDirectory.getScrollBarPosition();
- let dist = 0;
- //到达预定位置,则解禁鼠标滚轮,并退出
- if (currentpos == finalpos) {
- window.onmousewheel = function () {
- return true;
- }
- return true;
- }
- //未到达,则计算下一步所要移动的距离
- if (currentpos < finalpos) {
- dist = Math.ceil((finalpos - currentpos) / 10);
- currentpos += dist;
- }
- if (currentpos > finalpos) {
- dist = Math.ceil((currentpos - finalpos) / 10);
- currentpos -= dist;
- }
- let scrTop = BlogDirectory.getScrollBarPosition();//获取滚动条当前位置
- window.scrollTo(0, currentpos);//移动窗口
- if (BlogDirectory.getScrollBarPosition() == scrTop)//若已到底部,则解禁鼠标滚轮,并退出
- {
- window.onmousewheel = function () {
- return true;
- }
- return true;
- }
- //进行下一步移动
- let repeat = "BlogDirectory.moveScrollBar(" + finalpos + "," + interval + ")";
- document.body.movement = setTimeout(repeat, interval);
- },
- htmlDecode: function (text) {
- let temp = document.createElement("div");
- temp.innerHTML = text;
- let output = temp.innerText || temp.textContent;
- temp = null;
- return output;
- },
- /*
- 创建博客目录,id表示包含博文正文的 div 容器的 id,
- mt 和 st 分别表示主标题和次级标题的标签名称(如 H2、H3,大写或小写都可以!),
- interval 表示移动的速度
- */
- createBlogDirectory: function (selector, mt, st, interval) {
- //获取博文正文div容器
- let elem = document.querySelector(selector);
- if (!elem) return false;
- //获取div中所有元素结点
- let nodes = elem.getElementsByTagName("*");
- //创建博客目录的div容器
- let divSideBar = document.createElement('DIV');
- divSideBar.className = 'uprightsideBar';
- divSideBar.setAttribute('id', 'uprightsideBar');
- let divSideBarTab = document.createElement('DIV');
- divSideBarTab.setAttribute('id', 'sideBarTab');
- divSideBar.appendChild(divSideBarTab);
- let h2 = document.createElement('DIV');
- divSideBarTab.appendChild(h2);
- let txt = document.createTextNode('目录导航');
- h2.appendChild(txt);
- let divSideBarContents = document.createElement('DIV');
- // divSideBarContents.style.display = 'none';
- divSideBarContents.setAttribute('id', 'sideBarContents');
- divSideBar.appendChild(divSideBarContents);
- //创建自定义列表
- let dlist = document.createElement("dl");
- divSideBarContents.appendChild(dlist);
- let num = 0;//统计找到的mt和st
- mt = mt.toUpperCase();//转化成大写
- st = st.toUpperCase();//转化成大写
- //遍历所有元素结点
- for (let i = 0; i < nodes.length; i++) {
- if (nodes[i].nodeName == mt || nodes[i].nodeName == st) {
- //获取标题文本
- let nodetext = nodes[i].innerHTML.replace(/<\/?[^>]+>/g, "");//innerHTML里面的内容可能有HTML标签,所以用正则表达式去除HTML的标签
- nodetext = nodetext.replace(/ /ig, "");//替换掉所有的
- nodetext = BlogDirectory.htmlDecode(nodetext);
- //插入锚
- nodes[i].setAttribute("id", "blogTitle" + num);
- let item;
- switch (nodes[i].nodeName) {
- case mt: //若为主标题
- item = document.createElement("dt");
- break;
- case st: //若为子标题
- item = document.createElement("dd");
- break;
- }
- //创建锚链接
- let itemtext = document.createTextNode(nodetext);
- item.appendChild(itemtext);
- item.setAttribute("name", num);
- //添加鼠标点击触发函数
- item.onclick = function () {
- let pos = BlogDirectory.getElementPosition(document.getElementById("blogTitle" + this.getAttribute("name")));
- if (!BlogDirectory.moveScrollBar(pos.top, interval)) return false;
- };
- //将自定义表项加入自定义列表中
- dlist.appendChild(item);
- num++;
- }
- }
- if (num == 0) return false;
- // /* 鼠标进入时的事件处理 */
- // divSideBarTab.onmouseenter = function () {
- // divSideBarContents.style.display = 'block';
- // }
- // /* 鼠标离开时的事件处理 */
- // divSideBar.onmouseleave = function () {
- // divSideBarContents.style.display = 'none';
- // }
- document.body.appendChild(divSideBar);
- }
- };
|