fjqingyou.Util

fjqingyou使用的工具

Dit script moet niet direct worden geïnstalleerd - het is een bibliotheek voor andere scripts om op te nemen met de meta-richtlijn // @require https://update.greasyfork.org/scripts/406080/887189/fjqingyouUtil.js

// ==UserScript==
// @name         fjqingyou.Util
// @namespace    https://greasyfork.org/users/390742
// @version      1.0.13
// @include      *
// @description  fjqingyou 使用的工具
// @author       fjqingyou
// @match        http://*/*
// @grant        none
// @run-at       document-start
// ==/UserScript==
(function () {
    if ((typeof fjqingyou !== "object")) {
        fjqingyou = {};
        fjqingyou.util = {};
        fjqingyou.view = {};
    }

    const util = fjqingyou.util;
    const view = fjqingyou.view;
    const isTouch = 'ontouchstart' in window;
    /**
     * 设置剪切板文本
     * @param {*} text 要设置到剪切板的文本内容
     */
    util.setClipboardText = function (text) {
        if (window.copy) {
            window.copy(text);
        } else if (window.clipboardData) {
            window.clipboardData.setData("Text", text);
        } else {
            var textarea = document.createElement('textarea');
            document.body.appendChild(textarea);
            textarea.value = text;
            textarea.select();
            document.execCommand('Copy', false, null);
            document.body.removeChild(textarea);
        }
    };

    /**
     * 弹出土司提示
     * @param {*} msg 提示的消息内容
     * @param {*} duration 界面显示持续时间
     */
    util.toast = function (msg, duration) {
        //持续时间
        duration = isNaN(duration) ? 3000 : duration;
        //构建元素
        var m = document.createElement('div');

        //配置显示内容
        m.innerHTML = msg.replace("\n", "<br />");

        //配置显示界面高度
        var lines = msg.split("\n");
        var height = (40 * lines.length);

        //配置显示样式
        m.style.cssText = "max-width:60%;min-width: 150px;padding:0 14px;height: " + height + "px;color: rgb(255, 255, 255);line-height: 40px;text-align: center;border-radius: 4px;position: fixed;top: 50%;left: 50%;transform: translate(-50%, -50%);z-index: 999999;background: rgba(0, 0, 0,.7);font-size: 16px;";
        document.body.appendChild(m);

        //等待显示的时间到了
        setTimeout(function () {
            //配置隐藏界面的动画
            var d = 0.5;
            m.style.webkitTransition = '-webkit-transform ' + d + 's ease-in, opacity ' + d + 's ease-in';
            m.style.opacity = '0';

            //等待隐藏动画播放完毕后,移除这个元素
            setTimeout(function () {
                document.body.removeChild(m);
            }, d * 1000);
        }, duration);
    };


    /**
     * 保存文本到文件
     * @param fileName 默认文件名
     * @param text 要保存的文本内容
     */
    util.saveTextToFile = function (fileName, text) {
        let urlObject = window.URL || window.webkitURL || window;
        let export_blob = new Blob([text]);

        //创建 link
        let save_link = document.createElementNS("http://www.w3.org/1999/xhtml", "a");
        save_link.href = urlObject.createObjectURL(export_blob);
        save_link.download = fileName;

        //创建事件
        let event = document.createEvent("MouseEvents");
        try {
            event.initMouseEvent("click", true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
        } catch (err) {
            event = new MouseEvent("click");
        }

        //派遣事件
        save_link.dispatchEvent(event);
    };

    /**
    * 年月日,时分秒的字符串
    */
    util.getFullTimeStr = function () {
        let date = new Date(),//时间戳为10位需*1000,时间戳为13位的话不需乘1000
            Y = date.getFullYear() + '',
            M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1),
            D = (date.getDate() < 10 ? '0' + (date.getDate()) : date.getDate()),
            h = (date.getHours() < 10 ? '0' + (date.getHours()) : date.getHours()),
            m = (date.getMinutes() < 10 ? '0' + (date.getMinutes()) : date.getMinutes()),
            s = (date.getSeconds() < 10 ? '0' + (date.getSeconds()) : date.getSeconds());
        return Y + M + D + h + m + s;
    };


    /**
     * 将界面设置为是否允许拖拽
     * @param {*} view 要操作的界面 dom
     * @param {*} canDrop 是否允许拖拽
     * @param {*} otherDropClassName [可选]其他可拖拽的类名-字对象可拖拽的 dom 类名
     * @param {*} onClick [可选]触发点击的回调
     */
    view.setDropView = function (view, canDrop, otherDropClassName, onClick) {
        const ve = view.eventEntity || {};
        if (!canDrop) {//如果目标是不允许拖拽
            if (ve) {//如果确实已经注册过事件了
                //移除事件注册
                view.removeEventListener("mousedown", ve.mousedown);
                window.removeEventListener("mousemove", ve.mousemove);
                view.removeEventListener("mouseup", ve.mouseup);

                //删除记录
                delete view.eventEntity;
            }
        } else {//如果目标是允许拖拽
            let x = 0;
            let y = 0;
            let l = 0;
            let t = 0;
            let isDown = false;
            let isClick = false;

            //鼠标按下事件
            ve.mousedown = function (e) {
                let target = e.target;
                if(target === view || target.classList.contains(otherDropClassName)){    
                    //停止事件冒泡和默认行为
                    e.stopPropagation();
                    e.preventDefault();
    
                    let touch = "touches" in e ? e.touches[0] : e;
                    if(touch){
                        //获取x坐标和y坐标
                        x = touch.clientX;
                        y = touch.clientY;
        
                        //获取左部和顶部的偏移量
                        l = view.offsetLeft;
                        t = view.offsetTop;
        
                        //开关打开
                        isDown = true;
                        isClick = true;
                        //设置样式  
                        view.style.cursor = 'move';
                    }
                }
            };
            view.addEventListener(isTouch ? "touchstart" : "mousedown", ve.mousedown);

            //鼠标移动
            ve.mousemove = function (e) {
                if (isDown == false) {
                    return;
                }
                
                isClick = false;
                let touch = "touches" in e ? e.touches[0] : e;
                if(touch){
                    //获取x和y
                    let nx = touch.clientX;
                    let ny = touch.clientY;
                    //计算移动后的左偏移量和顶部的偏移量
                    let nl = nx - (x - l);
                    let nt = ny - (y - t);
    
                    view.style.left = nl + 'px';
                    view.style.top = nt + 'px';
                }
            };
            window.addEventListener(isTouch ? "touchmove" : "mousemove", ve.mousemove);

            //鼠标抬起事件
            ve.mouseup = function (e) {
                //开关关闭
                isDown = false;
                view.style.cursor = 'default';

                //移动距离
                if(isTouch && !isClick){//触摸模式点击判定容差处理
                    let touch = "changedTouches" in e ? e.changedTouches[0] : e;
                    if(touch){
                        let xLocal = Math.abs(touch.clientX - x);
                        let yLocal = Math.abs(touch.clientY - y);
                        let distance = Math.max(xLocal, yLocal);
                        if(distance < window.innerWidth * 0.05){//移动距离太小时,判定为点击
                            isClick = true;
                        }
                    }
                }

                //因为拖拽和单击冲突。所以需要提供触发的方法
                if(isClick){
                    if(onClick){//如果确实有监听点击事件
                        onClick(e);
                    }
                }

                //恢复环境
                isClick = false;
            };
            view.addEventListener(isTouch ? "touchend" : "mouseup", ve.mouseup);

            //记录实例,方便后面解除
            view.eventEntity = ve;
        }
    };
}());