Greasy Fork

Greasy Fork is available in English.

Hi-history

获取网站浏览历史

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Hi-history
// @namespace    http://tampermonkey.net/
// @version      1.46
// @description  获取网站浏览历史
// @author       chillybird
// @match        http://*/*
// @match        https://*/*
// @grant       unsafeWindow
// @run-at      document-start
// ==/UserScript==

addEventListener('DOMContentLoaded', function () {
    (function () {
        'use strict';
        if (self.frameElement && self.frameElement.tagName == "IFRAME") {
            return;
        };
        if (window.frames.length != parent.frames.length) {
            return;
        };
        let initialX;
        let initialY;
        let xOffset = 0;
        let yOffset = 0;
        let pos_x;
        let pos_y;

        var currentDomain = new URL(window.location.href).hostname;
        document.addEventListener("click", function (e) {
            var target = e.target;
            while (target && !target.href) {
                target = target.parentElement;
            }
            if (target) {
                e.preventDefault();
                var linkDomain = new URL(target.href).hostname;
                if (linkDomain) {
                    if (linkDomain === currentDomain) {
                        window.location = target.href;
                    } else {
                        window.open(target.href);
                    }
                }
            }
        });

        var tab_flag = true; //是否已经弹出面板
        var last_mark = 0;//当前url在列表中的位置
        var i = NaN;
        document.onkeydown = function (event) {
            var e = event || window.event || arguments.callee.caller.arguments[0];
            if (e.keyCode == 66 && e.altKey) {
                if (tab_flag) {
                    showMarkbook();
                } else {
                    document.getElementsByClassName("exit_his")[0].click();
                }
                tab_flag = !tab_flag;
            }
            if (e.keyCode == 66 && e.ctrlKey) {//ctrl+B复制当前网址
                document.getElementsByClassName('s_item_bnt')[last_mark - 1].children[0].click();
            }

        }
        //创建样式
        var dom = document.createElement('style'),
            dom_body = document.getElementsByTagName('body')[0];

        dom.innerHTML = "#markBook #slider {margin: 0px 30px;width: 160px;background-size: 98% 3px;background: linear-gradient(to left, rgb(249, 118, 118) 0%, rgb(255, 255, 255) 100%);outline: none;-webkit-appearance: none;height: 3px;}#markBook input[type='range']::-webkit-slider-thumb {width: 10px;height: 10px;border-radius: 50%;background-color: rgb(249, 118, 118);box-shadow: 0 0 2px rgba(0, 0, 0, 0.3),0 3px 5px rgba(0, 0, 0, 0.2);cursor: pointer;-webkit-appearance: none;border: 0;}#markBook a:link{color:#0366d6;}#markBook{box-sizing:border-box;box-shadow:1px 1px 2px 1px #0000005c;position:fixed;z-index:9999999999;border-radius:5px;background-color:cornsilk;box-sizing:border-box;width:220px;}.bookNav{ user-select:none;background-color:#fbfbfb !important;    border-bottom:1px solid #a0a0a04a !important;overflow:hidden;/*border-radius:5px;*/}.del_mark{position:absolute;bottom:0px;left:0px;}.bookNav,.del_mark{width:100%;height:28px;line-height:28px;/*position:absolute;bottom:0px;*/background-color:lightgray;font-size:16px;color:#A9A9A9;/*border:1px solid #000000;*/}.hismark_history{width:70px;line-height:28px;box-sizing:border-box;display:inline;height:28px;text-align:center;font-size:14px;color:#000;cursor:pointer;}.exit_his{width:100%;color:#fca273;height:28px;line-height:28px;text-align:center;box-sizing:border-box;cursor:pointer;}.exit_his:hover{background-color:#808080a3;color:rgb(239, 233, 232);}.history_notice{height:280px;width:190px;line-height:40px;}.history_tab{padding:10px 0px 0px 10px;display:block;box-sizing:border-box;padding-bottom:5px;width:250px;}.hismark_del{float:right;width:80px;height:28px;line-height:28px;font-size:12px;text-align:center;color:#000;cursor:pointer}.hismark_del:hover{color:red;}.s_item>a:hover {color:#428bca !important;}.s_item{width:190px;height:40px;position:relative;text-align:left;border-bottom:2px dashed #BEBEBE;padding-left:5px;line-height:40px;}.s_item a{text-decoration:none;font-size:14px;width:185px;position: absolute; top: 50%; transform: translate(0, -50%);display:inline-block;float:left;overflow:hidden; white-space:nowrap;text-overflow:ellipsis;}.m_hismark{overflow:hidden;width:220px;}.s_item_bnt{position:absolute;top:10px; right:0px;font-size:14px;float:right;width:45px;height:20px;cursor:pointer;display:none;color:rgb(250, 128, 114);text-align:center;box-sizing:border-box;}.i_item_bnt{width:100%;height:20px;line-height:20px;box-sizing:border-box;float:left;}.i_item_bnt:last-child{border-left:2px solid rgb(250, 128, 114);}.his_alert{color:#42b983;font-size:18px;font-weight:bold;position:fixed;z-index:144469;animation:mymove 1200ms linear; -webkit-animation:mymove 1200ms linear;}@keyframes mymove{from {top:100px;left:50%;opacity:1;transform:translateX(-50%);}to {top:60px;left:50%;opacity:0;transform:translateX(-50%);display:none;}}@-webkit-keyframes mymove{from {top:100px;left:50%;opacity:1;transform:translateX(-50%);}to {top:60px;left:50%;opacity:0;transform:translateX(-50%);display:none;}}";
        dom_body.appendChild(dom);

        //创建标签
        dom = document.createElement('div');
        dom.id = "markBook";
        var str = "<div class='bookNav'><div class='exit_his'>Hi-history</div></div><div class='m_hismark'>";//    color:#fca273;    background-color:#fbfbfb;

        //获取浏览记录
        if (!sessionStorage) {
            str += "<div class='history_notice'>浏览器不支持sessionStorage!</div>";
        } else {
            // console.log('first record!');
            if (his_item_length() < 1) {
                //建立第一条记录
                sessionStorage.setItem('url_1', location.href);
                sessionStorage.setItem('url_1_name', (document.getElementsByTagName('title')[0]).innerHTML.split(' ').join('-'));
                str += "<div class='history_tab'><div class='s_item'><a title=" + sessionStorage.getItem('url_' + i + '_name') + " href=" + sessionStorage.getItem('url_1') + ">1:" + sessionStorage.getItem('url_1_name') + "</a><div class='s_item_bnt'><div class='i_item_bnt'rgb(250, 128, 114)>复制</div></div><textarea class='s_copy' style='height:0px;width:0px;opacity:0;margin:0px;padding:0px;'>content</textarea></div></div>";
            } else {
                // console.log('continue!');
                history_tab1();
            }
        }
        //创建按钮
        var slider_val = sessionStorage.getItem("sliderVal");
        console.log("opacity", slider_val);
        if (!slider_val) {
            slider_val = 1;
        }
        str += "</div><input type='range' min='0' max='1' step='0.01' id='slider' value='" + slider_val + "'><a  style='width:220px;height:40px;line-height:40px;display:block;color:#8e959a;font-size:14px;text-align:center;overflow:hidden;border-bottom:none;white-space:pre-wrap; text-overflow:ellipsis;' href=" + location.href.slice(0, location.href.indexOf(location.host)) + location.host + ">" + location.href.slice(0, location.href.indexOf(location.host)) + location.host + "</a></div>";
        dom.innerHTML = str;
        dom_body.appendChild(dom);

        var markBook = document.getElementById('markBook');
        var dragPoint = document.getElementsByClassName('bookNav')[0];
        var exit_bnt = document.getElementsByClassName('exit_his')[0];
        markBook.style.opacity = slider_val;
        markBook.style.userSelect = "none";


        hismark_init();

        // 透明度滑动条
        var slider = document.getElementById("slider");
        slider.oninput = function () {
            markBook.style.opacity = this.value;
            sessionStorage.setItem("sliderVal", this.value);
        }

        exit_bnt.onclick = function () {
            hideMarkbook();
        };

        dragPoint.addEventListener("mousedown", (event) => {
            //document.body.style.userSelect = "none";
            //markBook.style.transition = "none";
            initialX = event.clientX - xOffset;
            initialY = event.clientY - yOffset;

            console.log("on", initialX, initialY);
        });

        dragPoint.addEventListener("mouseup", () => {
            // 恢复动画
            //element.style.userSelect = "text";
            //markBook.style.transition = "all 400ms";
            console.log("up");
        });

        // 拖放元素
        dragPoint.addEventListener("dragstart", (event) => {
            // 设置元素的透明度(可选)
            markBook.style.opacity = "0.5";
            console.log("dragstart");
        });

        dragPoint.addEventListener("dragend", (event) => {
            // 恢复元素的透明度(可选
            markBook.style.opacity = slider.getAttribute("value");

            var left_pos = parseInt(extract_numder(markBook.style.left)[0]);
            var top_pos = parseInt(extract_numder(markBook.style.top)[0]);

            if (markBook.style.transform) {
                var trans_pos = extract_numder(markBook.style.transform);
                left_pos = left_pos + parseInt(trans_pos[1]);
                top_pos = top_pos + parseInt(trans_pos[2]);
            }

            if (left_pos < 0 && top_pos < 0) {
                console.log("dragover1", left_pos, top_pos, xOffset, yOffset);

                xOffset = xOffset - left_pos;
                yOffset = yOffset - top_pos;
                left_pos = 0;
                top_pos = 0;
            }

            if (left_pos < 0) {
                console.log("dragover2", left_pos, top_pos, xOffset, yOffset);

                xOffset = xOffset - left_pos;
                left_pos = 0;
            }

            if (top_pos < 0) {
                console.log("dragover3", left_pos, top_pos, xOffset, yOffset);

                yOffset = yOffset - top_pos;
                top_pos = 0;
            }
            setTranslate(xOffset, yOffset, markBook);

            sessionStorage.setItem("elementX", left_pos);
            sessionStorage.setItem("elementY", top_pos);
            console.log("save", left_pos, top_pos);
            console.log("dragend", xOffset, yOffset);

        });

        dragPoint.addEventListener("dragover", (event) => {
            event.preventDefault();
            xOffset = event.clientX - initialX;
            yOffset = event.clientY - initialY;

            setTranslate(xOffset, yOffset, markBook);

            // console.log("dragover", event.clientX, event.clientY, initialX, initialY, xOffset, yOffset);

        });

        add_item_bnt();

        function showMarkbook() {
            markBook.style.left = "0px";
            var W_height = document.documentElement.clientHeight;
            var scroll_height = document.documentElement.clientHeight - 90;
            var object_height = markBook.clientHeight;
            var scroll_tab = document.getElementsByClassName("history_tab");
            var m_hismark = document.getElementsByClassName("m_hismark")[0];
            if ((object_height + 40) > W_height) {
                scroll_tab[0].style.height = scroll_height + "px";
                scroll_tab[0].style.overflow = "scroll";
                scroll_tab[0].style.overflowX = "hidden";
                m_hismark.style.height = scroll_height + "px";
            }
        };

        function hideMarkbook() {
            markBook.style.left = "-220px";
            markBook.style.top = "0px";
            markBook.style.transform = "none";
            xOffset = 0;
            yOffset = 0;
            sessionStorage.setItem("elementX", 0);
            sessionStorage.setItem("elementY", 0);
        };

        // 设置元素的位置
        function setTranslate(xPos, yPos, el) {
            el.style.transform = "translate3d(" + xPos + "px, " + yPos + "px, 0)";
        }

        function extract_numder(str) {
            var numbers = str.match(/-?\d+/g);
            return numbers;
        }

        function copy_alert(text) {
            var dom = document.createElement('div'),
                dom_body = document.getElementsByTagName('body')[0];
            // 判断网址是否复制成功
            dom.classList.add('his_alert');
            dom.innerHTML = text;
            dom_body.appendChild(dom);
        }

        function copyText(text) {
            var textarea = document.createElement("textarea"); // 创建一个文本域元素
            textarea.value = text; // 将文本内容放入文本域
            document.body.appendChild(textarea); // 将文本域添加到网页中
            textarea.select(); // 选中文本域中的文本
            var success = document.execCommand("copy"); // 执行复制命令
            document.body.removeChild(textarea); // 将文本域从网页中移除
            if (success) {
                copy_alert("复制成功");
            } else {
                copy_alert("复制失败");
            }
        }

        function hismark_init() {
            if (top != window) {
                console.log("Not a top window!");
                return;
            }
            // 初始化位置
            pos_x = sessionStorage.getItem("elementX") | 0;
            pos_y = sessionStorage.getItem("elementY") | 0;
            markBook = document.getElementById('markBook');
            if (pos_x != 0 || pos_y != 0) {
                markBook.style.left = `${pos_x}px`;
                markBook.style.top = `${pos_y}px`;
            } else {
                markBook.style.left = "-220px";
                markBook.style.top = "0px";
            }
            //markBook.style.transition = "all 400ms";
            console.log("initail pos:", pos_x, pos_y);
            //setTranslate(pos_x, pos_y, document.getElementById('markBook'));
        }
        function history_tab1() {
            str += "<div class='history_tab'>";
            var url_name = 'url_' + (his_item_length() + 1);

            if (find_history(window.location.href)) {
                sessionStorage.setItem(url_name, window.location.href);
                sessionStorage.setItem(url_name + '_name', (document.getElementsByTagName('title')[0]).innerHTML.split(' ').join('-'));
            }

            for (var i = 1; i <= his_item_length(); i++) {
                if (sessionStorage.getItem('url_' + i) !== null) {
                    if (sessionStorage.getItem('url_' + i + '_name') === null) {
                        sessionStorage.setItem('url_' + i + '_name', 'note' + i);
                    }
                    str += "<div class='s_item'><a title=" + sessionStorage.getItem('url_' + i + '_name') + " href=" + sessionStorage.getItem('url_' + i) + ">" + i + ":" + sessionStorage.getItem('url_' + i + '_name') + "</a><div class='s_item_bnt'><div class='i_item_bnt'rgb(250, 128, 114)>复制</div></div><textarea class='s_copy' style='height:0px;width:0px;opacity:0;margin:0px;padding:0px;'>content</textarea></div>";
                }
            }
            str += "</div>";
        }

        function extractBaseUrl(url) {
            // 使用URL对象来解析给定的URL
            const parsedUrl = new URL(url);

            // 返回不包含查询参数的基础URL
            return `${parsedUrl.origin}${parsedUrl.pathname}`;
        }

        function find_history(his_url) {
            var baseUrl = extractBaseUrl(his_url);
            for (var i = 1; ; i++) {
                var storedUrl = sessionStorage.getItem('url_' + i);
                if (!storedUrl) break;
                if (extractBaseUrl(storedUrl) === baseUrl) return false;
            }
            return true;
        }

        function his_item_length() {
            var len = 0;
            for (var i = 1; i <= sessionStorage.length; i++) {
                if (sessionStorage.getItem('url_' + i) !== null)
                    len = len + 1;
            }
            return len;
        }

        function his_mark(his_url, last_mark) {
            var historyTab = document.getElementsByClassName("history_tab")[0].children;
            var his_index = null;

            for (var i = 1; i <= sessionStorage.length; i++) {
                var storedUrl = sessionStorage.getItem('url_' + i);
                if (extractBaseUrl(storedUrl) === his_url) {
                    his_index = i;
                    break;
                }
            }

            if (last_mark !== 0 && last_mark !== his_index && historyTab[last_mark - 1]) {
                historyTab[last_mark - 1].style.borderBottom = "2px dashed #BEBEBE";
            }

            if (his_index !== null && historyTab[his_index - 1]) {
                historyTab[his_index - 1].style.borderBottom = "2px solid #FA8072";

            }

            return his_index;
        }

        // 检查url是否发生改变,使用框架时,嵌套路由得改变,不引起页面得刷新
        var win_url = location.href;
        setInterval(function () {
            if (win_url !== location.href) {
                var url_name = 'url_' + (his_item_length() + 1);
                if (find_history(location.href)) {
                    sessionStorage.setItem(url_name, window.location.href);
                    sessionStorage.setItem(url_name + '_name', (document.getElementsByTagName('title')[0]).innerHTML);
                    var ele = document.createElement('div');
                    ele.className = "s_item";
                    ele.innerHTML = "<a href=" + sessionStorage.getItem(url_name) + ">" + (his_item_length()) + ":" + sessionStorage.getItem(url_name + '_name') + "</a><div class='s_item_bnt'><div class='i_item_bnt'rgb(250, 128, 114)>复制</div></div><textarea class='s_copy' style='height:0px;width:0px;opacity:0;margin:0px;padding:0px;'>content</textarea>";
                    document.getElementsByClassName("history_tab")[0].appendChild(ele);
                    add_item_bnt();
                }
                win_url = location.href;
            }
            his_mark(extractBaseUrl(location.href));
        }, 3000);

        setInterval(function() {
            window.addEventListener('mousemove', function(event) {
                var mouseX = event.clientX;
                var mouseY = event.clientY;

                if (mouseX > event.clientX + 20) {
                    return;
                }

                if(mouseX < 5 && mouseY < markBook.clientHeight) {
                    showMarkbook();
                    return;
                }

                if (!(mouseX < markBook.clientWidth + 5 && mouseY < markBook.clientHeight + 5)) {
                    hideMarkbook();
                }
            });
        }, 500);

        function add_item_bnt() {
            //删除与复制按钮
            var s_item = document.getElementsByClassName('s_item');
            var s_item_bnt = document.getElementsByClassName('s_item_bnt');
            var s_copy = document.getElementsByClassName('s_copy');
            for (var i = 0; i < s_item.length; i++) {
                (function (i) {
                    s_item[i].onmouseover = function () {
                        s_item_bnt[i].style.display = "block";
                        s_item[i].children[0].style.width = 140 + 'px';
                    };
                    s_item[i].onmouseout = function () {
                        s_item_bnt[i].style.display = "none";
                        s_item[i].children[0].style.width = 185 + 'px';
                    };

                    s_item_bnt[i].children[0].onclick = function () {
                        copyText("[" + sessionStorage.getItem('url_' + (i + 1) + '_name') + "](" + sessionStorage.getItem('url_' + (i + 1)) + ")");
                    };
                })(i);
            }
        }
    })();
}, false);