游戏蛮牛 - Unity手册页面增强

Unity手册文档左侧导航添加红色标记,添加历史查看位置

目前为 2020-01-17 提交的版本。查看 最新版本

// ==UserScript==
// @name         游戏蛮牛 - Unity手册页面增强
// @namespace    游戏蛮牛页面增强
// @version      1.1.3
// @icon         https://i.postimg.cc/8PX6jtxn/manual-Helper.png
// @description  Unity手册文档左侧导航添加红色标记,添加历史查看位置
// @author       曦源 <[email protected]>
// @match        *://docs.manew.com/Manual/index.htm
// @match        *://docs.manew.com/Components/index.htm
// @match        *://docs.manew.com/Script/index.htm
// @grant        none
// ==/UserScript==

(function () {
    'use strict';

    //用户手册 Manual
    //组件手册 Components
    //脚本手册 Script

    //1. 左侧菜单点击标注逻辑
    //2. 根据右侧标题,查找左侧菜单位置,使用红色表明
    //3. 刷新导致页面回到 序言位置,使用本地存储添加上次查看位置
    //4. 搜索框点击按钮,对应上左侧菜单索引
    //5. 内容页面的链接点击,需要左侧菜单定位



    var menuFrame = frames["left"]; //左侧页面iframe
    var bodyFrame = frames["body"]; //右侧页面iframe

    var pageName = getPageName(); //手册类型
    var menuData = getMenuData(); //菜单列表


    //左侧iframe
    var lf = document.getElementsByName("left")[0];
    lf.onload = function () {
        //临时存储,菜单 - 地址
        saveMenuData();

        //左侧菜单
        var menuDiv = menuFrame.document.getElementsByClassName("publicMenu")[0].getElementsByTagName("a");

        //添加点击事件
        menuBinding(menuDiv);

        //页面加载完,检查用户是否在页面记载前点击了菜单,如果点击了,右侧标题就不是序言
        var title = bodyFrame.document.getElementsByClassName("layout")[0].childNodes[1].textContent;
        if (title == "序言") {
            var cheatsheet = menuFrame.document.children[0].childNodes[2].childNodes[10].childNodes[2];
            //本次位置,添加颜色,添加标记
            cheatsheet.style.color = 'red';
            cheatsheet.classList.add('lastclick');
        }

        //搜索框点击事件
        var btnso = menuFrame.document.getElementById("butsoso");
        btnso.onclick = function () {
            var searchKey = menuFrame.document.getElementById("query").value;
            //根据关键字查询左侧菜单,非空检查
            if (searchKey.replace(/(^\s*)|(\s*$)/g, "") != "") {
                var keyUrl = searchKey + ".html";
                var menuValue = menuData[keyUrl];

                //搜索跳转定位
                bodyToLeftItem(menuValue, false);
            }
        };

        //获取上次阅读记录
        var lastReadUrl = getLastReadUrl();
        var lastReadText = getLastReadText();

        if (lastReadUrl != null) {
            var top = menuFrame.document.getElementById("closeAll").parentNode;

            //不能用 innerHTML 附加,会覆盖掉页面上折叠和关闭的事件
            var split = document.createElement('span');
            split.className = 'appentCotent';
            split.innerText = ' | ';
            top.appendChild(split);

            var a = document.createElement('a');
            a.className = 'appentCotent';
            a.href = lastReadUrl;
            a.title = lastReadText;
            a.target = "body";
            a.innerText = '上次查阅位置';
            a.id = 'targetLastRead';
            a.style.color = "blue";
            top.appendChild(a);

            var space = document.createElement('span');
            space.className = 'appentCotent';
            space.innerText = " ";
            top.appendChild(space);

            var clear = document.createElement('a');
            clear.className = 'appentCotent';
            clear.id = 'clearHistory';
            clear.href = 'javascript:void(0)';
            clear.innerText = "[清空]";
            clear.style.color = "blue";
            top.appendChild(clear);



            var lastRead = menuFrame.document.getElementById("targetLastRead");
            lastRead.onclick = function () {
                //上次阅读定位
                bodyToLeftItem(lastReadText, true);

            };

            var clearlink = menuFrame.document.getElementById("clearHistory");
            clearlink.onclick = function () {
                delHistory();
            };
        }


        //为序言添加点击事件,点击序言清空菜单项选中样式,清空上次浏览记录
        var cheatsheet2 = menuFrame.document.children[0].childNodes[2].childNodes[10].childNodes[2];
        cheatsheet2.onclick = function () {
            var lastClick = menuFrame.document.getElementsByClassName("lastclick")[0];
            if (lastClick != undefined) {
                //变回原来的颜色
                lastClick.style.color = '#333';
                //删除标记
                lastClick.classList.remove('lastclick');
                //删除上次浏览记录和标记
                delLastRead();

                //本次位置,添加颜色,添加标记
                cheatsheet2.style.color = 'red';
                cheatsheet2.classList.add('lastclick');

            }
        };
    }


    //右侧iframe
    var bd = document.getElementsByName("body")[0];
    bd.onload = function () {
        //右侧内容页面加载完毕
        //内容页面内链接,如果能匹配到菜单,左侧菜单定位
        var aList = bodyFrame.document.getElementsByClassName("layout")[0].getElementsByTagName("a");
        for (let i = 0; i < aList.length; i++) {
            aList[i].onclick = function () {
                //根据链接查询左侧菜单名称
                var keyUrl = aList[i].href.replace('http://docs.manew.com/' + pageName + '/', '');
                var menuValue = menuData[keyUrl];
                if(menuValue!=undefined){
                    bodyToLeftItem(menuValue, false);
                }
            };
        }
    };


    //删除附加内容和文字提示
    function delHistory() {
        //删除当前附加的内容
        var top = menuFrame.document.getElementById("closeAll").parentNode;
        var appendClass = menuFrame.document.getElementsByClassName("appentCotent");
        while (appendClass.length > 0) {
            top.removeChild(appendClass[0]);
        }

        //删除存储
        delLastRead();
    }


    //为菜单项添加点击事件,重置颜色,添加颜色,记录点击位置
    function menuBinding(menuDiv) {
        for (let i = 0; i < menuDiv.length; i++) {
            if (menuDiv[i].href != 'javascript:void(0)') {
                menuDiv[i].onclick = function () {
                    //找到上次点击的位置
                    var lastClick = menuFrame.document.getElementsByClassName("lastclick")[0];
                    if (lastClick != undefined) {
                        //变回原来的颜色
                        lastClick.style.color = '#333';
                        //删除标记
                        lastClick.classList.remove('lastclick');

                        //删除上次查看
                        delHistory();
                    }

                    //本次位置,添加颜色,添加标记
                    menuDiv[i].style.color = 'red';
                    menuDiv[i].classList.add('lastclick');

                    //todo 更新上次浏览
                    updateLastRead(menuDiv[i].href, menuDiv[i].innerText);


                }
            }
        }


    }

    //更新上次浏览位置
    function updateLastRead(lastReadUrl, title) {
        localStorage.setItem(pageName + "_PageHelper_lastRead_Url", lastReadUrl.replace('http://docs.manew.com/' + pageName + '/', ''));
        localStorage.setItem(pageName + "_PageHelper_lastRead_Text", title);
    }

    //删除上次浏览位置
    function delLastRead() {
        localStorage.removeItem(pageName + "_PageHelper_lastRead_Url");
        localStorage.removeItem(pageName + "_PageHelper_lastRead_Text");
    }

    //获取上次浏览记录地址
    function getLastReadUrl() {
        return localStorage.getItem(pageName + "_PageHelper_lastRead_Url");
    }

    //获取上次浏览记录名称
    function getLastReadText() {
        return localStorage.getItem(pageName + "_PageHelper_lastRead_Text");
    }

    //存储 菜单 - 地址
    function saveMenuData() {
        if (localStorage.getItem(pageName + "_menu_info") == null) {
            var menuDiv = menuFrame.document.getElementsByClassName("publicMenu")[0].getElementsByTagName("a");
            var data = {};
            for (let i = 0; i < menuDiv.length; i++) {
                if (menuDiv[i].href != 'javascript:void(0)') {
                    var k = menuDiv[i].href.replace('http://docs.manew.com/' + pageName + '/', '');
                    var v = menuDiv[i].textContent.replace('  ', ''); //去掉空白字符
                    data[k] = v;
                }
            }
            localStorage.setItem(pageName + "_menu_info", JSON.stringify(data));
            menuData = data;
        }
    }

    //获取 菜单 - 地址
    function getMenuData() {
        var str = localStorage.getItem(pageName + "_menu_info");
        return JSON.parse(str);
    }

    //根据跳转 定位 左侧菜单
    //1. 搜索后定位
    //2. 上次阅读定位
    function bodyToLeftItem(rightTitleName, delHistory) {
        //找到上次点击的位置
        var lastClick = menuFrame.document.getElementsByClassName("lastclick")[0];
        if (lastClick != undefined) {
            //变回原来的颜色
            lastClick.style.color = '#333';
            //删除标记
            lastClick.classList.remove('lastclick');
        }

        //全部折叠
        menuFrame.document.getElementById("closeAll").click();

        var top = menuFrame.document.getElementById("closeAll").parentNode;
        //标记红色,更新浏览记录
        var menuDiv = menuFrame.document.getElementsByClassName("publicMenu")[0].getElementsByTagName("a");
        for (let i = 0; i < menuDiv.length; i++) {
            var menuItem = menuDiv[i].textContent.replace('  ', ''); //去掉空格
            if (menuItem == rightTitleName) {
                //本次位置,添加颜色,添加标记
                menuDiv[i].style.color = 'red';
                menuDiv[i].classList.add('lastclick');

                //更新上次浏览记录
                updateLastRead(menuDiv[i].href, rightTitleName);

                //根据定位的位置,查找出对应节点,如果是父节点(最外级)不管,如果在子级,展开它的所有父级
                var parent = menuDiv[i];
                var parentName = parent.className;
                while (parentName != "publicMenu") {
                    parent = parent.parentNode;
                    parentName = parent.className;
                    var child = parent.childNodes;

                    var checkIcon = false;
                    for (let j = 0; j < child.length; j++) {
                        if (child[j].nodeName == "I") {
                            checkIcon = true;
                            break;
                        }
                    }

                    if (checkIcon) {
                        for (let j = 0; j < child.length; j++) {
                            if (child[j].nodeName == "I") {
                                // 折叠按钮展开 i 中 a 中 img
                                child[j].childNodes[2].childNodes[0].setAttribute("src", "../images/minusbottom.gif");
                                continue;
                            }

                            if (child[j].nodeName == "IMG") {
                                //书展开
                                child[j].setAttribute("src", "../images/folderopen.gif");
                                continue;
                            }

                            if (child[j].nodeName == "UL") {
                                //子项展开
                                child[j].style.display = "block";
                                continue;
                            }

                        }
                    }

                };

                break;
            }
        }


        //删除当前附加的内容
        var appendClass = menuFrame.document.getElementsByClassName("appentCotent");
        while (appendClass.length > 0) {
            top.removeChild(appendClass[0]);
        }

        if (delHistory) {
            //删除存储
            delLastRead();
        }

    }

    //获取当前是哪种手册
    function getPageName() {
        var url = window.location.href;
        switch (url) {
            case "http://docs.manew.com/Manual/index.htm":
                return "Manual";
            case "http://docs.manew.com/Components/index.htm":
                return "Components";
            case "http://docs.manew.com/Script/index.htm":
                return "Script";
        }
    }

})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址