| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275 | 'use strict';/** * * * @author Zhong * @date 2018/11/7 * @version *//* * 拖动相关公共接口 * 前台使用此接口时,注意在恢复系统默认设置时, * 清除相关缓存数据: project_view.js--->$('#property_default').click(callback) * */const SlideResize = (function () {    // 水平拖动条的宽度    const resizeWidth = 10;    //函数防抖    let timer = null;    function deBounce(fn, wait) {        if (timer) {            clearTimeout(timer);        }        timer = setTimeout(fn, wait);    }    //设置水平拖动条的宽度    //@param {Object dom}resize滚动条    function setResizeWidth(resize, getOtherFunc) {        //滚动条节点 及 同层非滚动条节点的索引        let bros = resize.parent().children();        let index = bros.index(resize);        let otherIndex = index ? 0 : 1;        if (getOtherFunc) {            otherIndex = getOtherFunc(index);        }        const other = resize.parent().children(`:eq(${otherIndex})`);        let resizeParentWidth = resize.parent().width();        let resizeDecimalWidth = resizeWidth / resizeParentWidth,            otherDecimalWidth = 1 - resizeDecimalWidth;        let resizePercentWidth = resizeDecimalWidth * 100 + '%',            otherPercentWidth = otherDecimalWidth * 100 + '%';        resize.css('width', resizePercentWidth);        other.css('width', otherPercentWidth);    }    let mouseMoveCount = 0;    /*     * div之间的水平拖动,适应各种情况     * @param {Object}eleObj: module所属模块,防止不同页面相同id导致localstorage数据被覆盖(放在对象里,因为可能有的地方要实时改这个module)     *         resize, parent, left, right     * @param {Object}limit: min, max     * @param {Function}callback 回调     * */    function horizontalSlide(eleObj, limit, callback) {        const triggerCBSize = 5;        let drag = false,            startPoint = 0,            leftWidth = 0,            rightWidth = 0,            leftChange = 0,            rightChange = 0,            limitMax = 0;        eleObj.resize.mousedown(function (e) {            drag = true;            startPoint = e.clientX;            leftWidth = eleObj.left.width();            rightWidth = eleObj.right.width();            limitMax = eval(limit.max);        });        $('body').mousemove(function (e) {            if (drag) {                console.log('drag');                let moveSize = e.clientX - startPoint;                leftChange = leftWidth + moveSize;                leftChange = leftChange < limit.min ? limit.min : leftChange;                leftChange = leftChange > limitMax ? limitMax - 5 : leftChange;                rightChange = rightWidth - moveSize;                rightChange = rightChange < limit.min ? limit.min : rightChange;                rightChange = rightChange > limitMax ? limitMax - 5 : rightChange;                let leftPercentWidth = leftChange / eleObj.parent.width() * 100 + '%',                    rightPercentWidth = rightChange / eleObj.parent.width() * 100 + '%';                eleObj.left.css('width', leftPercentWidth);                eleObj.right.css('width', rightPercentWidth);                setResizeWidth(eleObj.resize, eleObj.getOtherFunc);                mouseMoveCount += Math.abs(moveSize);                deBounce(function () {                    if (callback) {                        callback();                        mouseMoveCount = 0;                    }                }, 20);            }        });        $('body').mouseup(function (e) {            if (drag) {                drag = false;                mouseMoveCount = 0;                //将宽度信息存储到localstorage                let leftWidthInfo = eleObj.left[0].style.width;                setLocalCache(`${eleObj.module}${eleObj.left.attr('id')}Width`, leftWidthInfo);                let rightWidthInfo = eleObj.right[0].style.width;                setLocalCache(`${eleObj.module}${eleObj.right.attr('id')}Width`, rightWidthInfo);            }        });    }    function loadHorizonWidth(module, resizes, eles, callback) {        for (let ele of eles) {            let cache = getLocalCache(`${module}${ele.attr('id')}Width`);            if (cache) {                ele.css('width', cache);            }        }        for (let resize of resizes) {            setResizeWidth(resize);        }        if (callback) {            callback();        }    }    /*     * div上下拖动     * @param {Object} eleObj: module所属模块,防止不同页面相同id导致localstorage数据被覆盖(放在对象里,因为可能有的地方要实时改这个module)     *        resize, top, topSpread, bottom, bottomSpread     * @param {Object}limit: min, max, notTopSpread(上部分非spread部分的高度) notBottomSpread(下部分非spread部分的高度)     * @param {Function}callback 回调     * */    function verticalSlide(eleObj, limit, callback) {        const triggerCBSize = 5;        let drag = false,            startPoint = 0,            topHeight = 0,            bottomHeight = 0,            topChange = 0,            bottomChange = 0,            limitMax = 0;        eleObj.resize.mousedown(function (e) {            drag = true;            startPoint = e.clientY;            topHeight = eleObj.top.height();            bottomHeight = eleObj.bottom.height();            limitMax = eval(limit.max);        });        $('body').mousemove(function (e) {            if (drag) {                let moveSize = e.clientY - startPoint;                topChange = topHeight + moveSize;                topChange = topChange < limit.min ? limit.min : topChange;                topChange = topChange > limitMax ? limitMax : topChange;                bottomChange = bottomHeight - moveSize;                bottomChange = bottomChange < limit.min ? limit.min : bottomChange;                bottomChange = bottomChange > limitMax ? limitMax : bottomChange;                //设置上部分div高度                eleObj.top.height(topChange);                //设置上部分div内spread高度                eleObj.topSpread.height(topChange - limit.notTopSpread);                //设置下部分div高度                eleObj.bottom.height(bottomChange);                //设置下部分div内spread高度                eleObj.bottomSpread.height(bottomChange - limit.notBottomSpread);                mouseMoveCount += Math.abs(moveSize);                deBounce(function () {                    if (callback) {                        callback();                        mouseMoveCount = 0;                    }                }, 20);            }        });        $('body').mouseup(function (e) {            if (drag) {                drag = false;                mouseMoveCount = 0;                //将高度信息存储到localstorage                let topHeightInfo = eleObj.top.height();                setLocalCache(`${eleObj.module}${eleObj.top.attr('id')}Height`, topHeightInfo);                let bottomHeightInfo = eleObj.bottom.height();                setLocalCache(`${eleObj.module}${eleObj.bottom.attr('id')}Height`, bottomHeightInfo);            }        });    }    /*     * 加载上下高度     * @param {String}module 所属模块,防止不同页面相同id导致localstorage数据被覆盖     * @param {Object}eleObj: module所属模块,防止不同页面相同id导致localstorage数据被覆盖(放在对象里,因为可能有的地方要实时改这个module) top, topSpread, bottom, bottomSpread     * @param {Object}limit: totalHeight(实时的上下部分总高度) notTopSpread(上部分非spread部分的高度) notBottomSpread(下部分非spread部分的高度)     * @param {Function}callback 回调     * */    function loadVerticalHeight(module, eleObj, limit, callback) {        let topHeight = getLocalCache(`${module}${eleObj.top.attr('id')}Height`),            bottomHeight = getLocalCache(`${module}${eleObj.bottom.attr('id')}Height`);        //默认上下比例        const topProp = 5;        const bottomProp = 2;        let topProportion = topProp / (topProp + bottomProp);        if (topHeight !== null && bottomHeight !== null) {            topHeight = parseFloat(topHeight);            bottomHeight = parseFloat(bottomHeight);            topProportion = topHeight / (topHeight + bottomHeight);        }        //设置当前窗口下的的上下部分高度        let totalHeight = eval(limit.totalHeight);        let curTopHeight = totalHeight * topProportion,            curBottomHeight = totalHeight - curTopHeight;        eleObj.top.height(curTopHeight);        eleObj.topSpread.height(curTopHeight - limit.notTopSpread);        eleObj.bottom.height(curBottomHeight);        eleObj.bottomSpread.height(curBottomHeight - limit.notBottomSpread);        if (callback) {            callback();        }    }    /*     * 包含多个上下结构的拖动(n>= 2,只包含上下结构的地方可以用loadVerticalHeight)     * 加载多个结构高度     * @param {String}module所属模块,防止不同页面相同id导致localstorage数据被覆盖     * @param {Array}eles 元素为结构对象 内部: {container: 外部div, spread: 该div的Spread, notSpread: 该div不含Spread的高度, defaultProportion: 默认高度比例0.6}     * @param {String}totalHeight 各个结构div总高度-可编译字符串     * @param {Function}callback 回调     * */    function loadMultiVerticalHeight(module, eles, totalHeight, callback) {        //当前窗口拖动区域总高度        totalHeight = eval(totalHeight);        let cacheHeight = 0,//缓存中设置了高度的div总高度            notCacheProportion = 0;//缓存中没设置高度的div占用的总高度比例(每个div都有默认的高度比例) (有了缓存高度的div就是被拖动过的,被拖动过的div,其默认高度比例就没用了)        //获取缓存的总高度、未被拖动过的所有div的默认比例之和notCacheProportion (1-notCacheProportion)就是缓存高度的占总的比例        for (let ele of eles) {            let eleHeight = getLocalCache(`${module}${ele.container.attr('id')}Height`);            if (eleHeight !== null) {                eleHeight = parseFloat(eleHeight);                cacheHeight += eleHeight;            } else {                notCacheProportion += ele.defaultProportion;            }        }        //缓存高度占总的比例        let cacheProportion = 1 - notCacheProportion;        for (let ele of eles) {            let eleHeight = getLocalCache(`${module}${ele.container.attr('id')}Height`),                curHeight = 0;            if (eleHeight !== null) {                eleHeight = parseFloat(eleHeight);                //ele在当前窗口大小中的高度                curHeight = eleHeight / cacheHeight * cacheProportion * totalHeight;            } else {                curHeight = ele.defaultProportion * totalHeight;            }            ele.container.height(curHeight);            ele.spread.height(curHeight - ele.notSpread);        }        if (callback) {            callback();        }    }    return {        resizeWidth,        setResizeWidth,        horizontalSlide,        loadHorizonWidth,        verticalSlide,        loadVerticalHeight,        loadMultiVerticalHeight    }})();
 |