我是靠谱客的博主 含糊短靴,最近开发中收集的这篇文章主要介绍自己写的js插件,grid/lookup等,留存参考,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

        自己写的js插件,留存参考

if (typeof jQuery === 'undefined') { throw 'no jquery'; }
(function () {
    //合并json对象
    var MergeJsonObj = function (s, o) {
        var r = {};
        for (var p in s) {
            r[p] = s[p];
        }
        for (var q in o) {
            r[q] = o[q];
        }
        return r;
    };
    //取字符串占位长度(全角及汉字2,字母1)
    var GetCharLength = function (s) {
        var l = 0, s = s + '';
        for (var i in s) {
            if ((s.charCodeAt(i) & 0xff00) != 0) {
                l++;
            }
            l++;
        }
        return l;
    };
    //字符串补零
    var FixedZero = function (s, n, isEnd) {
        s += '';
        while (s.length < n) {
            s = isEnd ? s + '0' : '0' + s;
        }
        return s;
    }
    //取绝对定位信息
    $.fn.GetRect = function () {
        var r = $(this).get(0).getBoundingClientRect(),
            t = document.documentElement.clientTop,
            l = document.documentElement.clientLeft;
        return{
            top    :   r.top - t,
            bottom :   r.bottom - t,
            left   :   r.left - l,
            right  :   r.right - l
        }
    }
    /* 公共事件管理模块 ------ Start ------ */
    window.UE_EVENT = window.UE_EVENT || {
        Key: 1,
        ClipBoard: null,
        CurrElement: null,
        CurrKey: 0,
        Events: { 'mousemove': [], 'mousedown': [], 'keypress': [], 'dblclick': [], 'mouseup': [], 'keydown': [], 'keyup': [], 'click': [], 'resize': [], 'copy': [], 'paste': [] },
        Delete: function (event, key) {
            if (!event || !key) return false;
            var e = event.toLowerCase(),l = this.Events[e];
            for (var i in l) {
                if (l[i].KEY == key) {
                    l.splice(i, 1);
                    break;
                }
            }
        },
        Add: function (dom, event, callback) {
            if (!dom || !event || !callback) return false;
            UE_EVENT.IsRun || UE_EVENT.Run();
            var key = UE_EVENT.SetEventKey(dom), isExists = false, e = event.toLowerCase(), l = this.Events[e];
            for (var i in l) {
                if (l[i].KEY == key) {
                    l[i].FUN = callback;
                    isExists = true;
                }
            }
            if (!isExists) {
                l.push({ 'KEY': key, 'EVENT': e, 'DOM': dom[0] || dom, 'FUN': callback });
            }
        },
        Excute: function (event, e) {
            var l = this.Events[event];
            if (event == 'resize') {
                for (var i in l) {
                    var t = l[i], d = t.DOM;
                    if (t.width != $(d).width() || t.height != $(d).height()) {
                        t.width = $(d).width();
                        t.height = $(d).height();
                        l[i].FUN(t.width, t.height, null, d);
                    }
                }
            } else {
                e = e || window.event;
                var t = e.srcElement || e.target,
                    k = parseInt($(t).attr('eventkey'), 10);
                for (var i in l) {
                    if (l[i].KEY == k || l[i].KEY == this.CurrKey) {
                        l[i].FUN(e, t, l[i].KEY, l[i].DOM);
                    }
                }
            }
        },
        Download: function (url, json) {
            var form = $('<form style="display:none" target="ue_download_iframe" method="post" action="' + url + '"><iframe id="ue_download_iframe" name="ue_download_iframe" οnlοad=""></iframe><input name="JsonData" value="' + JSON.stringify(json).replace(/"/g, "'") + '" /></form>').appendTo('body');
            var iframe = document.getElementById('ue_download_iframe');
            if (document.readyState) {
                iframe.onreadystatechange = function () {
                    if (this.readyState && this.readyState == 'complete') {
                        form.remove();
                    }
                }
            } else {
                iframe.onload = function () {
                    form.remove();
                }
            }
            form.submit();
        },
        SetEventKey: function (obj) {
            if (!obj) return;
            var dom = obj[0] || obj,
                isDOM = (typeof HTMLElement === 'object') ? (dom instanceof HTMLElement) : dom && typeof dom === 'object' && dom.nodeType === 1,
                key = isDOM ? parseInt($(dom).attr('eventkey'), 10) : dom.eventKey;
            key = key || UE_EVENT.Key++;
            if (isDOM) {
                $(dom).attr('eventkey', key)
            } else {
                dom.eventKey = key;
            }
            return key;
        },
        Run: function (obj) {
            if (!this.IsRun) {
                $(document).on('mousemove', function (e) {
                    UE_EVENT.Excute('mousemove', e);
                }).on('mousedown', function (e) {
                    UE_EVENT.Excute('mousedown', e);
                }).on('keypress',  function (e) {
                    UE_EVENT.Excute('keypress',  e);
                }).on('dblclick',  function (e) {
                    UE_EVENT.Excute('dblclick',  e);
                }).on('mouseup',   function (e) {
                    UE_EVENT.Excute('mouseup',   e);
                }).on('keydown',   function (e) {
                    UE_EVENT.Excute('keydown',   e);
                }).on('keyup',     function (e) {
                    UE_EVENT.Excute('keyup',     e);
                }).on('click',     function (e) {
                    UE_EVENT.CurrKey = 0;
                    UE_EVENT.Excute('click', e);
                });
                setInterval(function () { UE_EVENT.Excute('resize', null); }, 200);
                //$(window).on('resize', function (e) {
                //    UE_EVENT.Excute('resize', e);
                //});
                $('body').on({
                    copy: function (e) {
                        var d = window.clipboardData || e.originalEvent.clipboardData;
                        var txt = "";
                        UE_EVENT.Excute('copy', txt);
                        d.setData('Text', txt);
                        return false;
                    },
                    paste: function (e) {
                        var d = window.clipboardData || e.originalEvent.clipboardData;
                        UE_EVENT.Excute('paste', d.getData('Text'));
                    }
                });
            }
            UE_EVENT.IsRun = true;
            return true;
        }
    };
    $.fn.SetEvent = function (event, callback) {
        return UE_EVENT.Add(this, event, callback);
    };
    $.fn.ActiveEvent = function () {
        UE_EVENT.CurrKey = UE_EVENT.SetEventKey(this);
    };
    /* 公共事件管理模块 ------ End   ------ */

    /* 分页模块         ------ Start ------ */
    $.fn.LoadPageFilter = function (pager, callback) {
        if (pager.totalPage > 1) {
            var parent = $(this);
            var styles = ''
    + '<style id="ue_pager_style">'
    + '    .ue_pager_frame{position:relative;border:none;width:100%;height:16px;line-height:16px;text-align:center;padding:2px;}'
    + '    .ue_pager_size {border:1px solid #999;height:12px;width:24px;margin:1px 0;float:left;}'
    + '    .ue_pager_sizes {border:1px solid #666;width:16px;height:80px;background-color:#eee;position:absolute;z-index:105;display:none;left:34px;bottom:16px;}'
    + '    .ue_pager_sizes div {cursor:pointer;}'
    + '    .ue_pager_sizes div:hover {background-color:#ccc;}'
    + '    .ue_pager_page {border:1px solid #999;height:12px;width:24px;margin:1px 18px 1px 0;float:right;}'
    + '    .ue_pager_btn {color:#0f7fc9;text-decoration:none;padding:0 5px;font-weight:bold;border-radius:3px;box-shadow:0 1px 0px 1px rgba(0, 0, 0, 0.05);margin:0 3px;}'
    + '    .ue_pager_btn:hover {color:#337383;background-color:#eeeeee;transition:all ease-in-out 0.2s;}'
    + '    .ue_pager_selected{background-color:#cccccc;}'
    + '</style>';
            if ($('#ue_pager_style').length < 1) {
                $('head').append(styles);
            }
            var idx = pager.pageIndex, total = pager.totalPage;
            $(this).find('.ue_pager_frame').remove();
            var frame = $('<div class="ue_pager_frame"><span style="float:left;margin-left:2px;">Size:</span></div>').appendTo($(this));
            var size = $('<input class="ue_pager_size" value="' + pager.pageSize + '" />').appendTo(frame);
            var sizes = $('<div class="ue_pager_sizes"><div>10</div><div>20</div><div>30</div><div>40</div><div>50</div></div>').appendTo(frame);
            var page = $('<input class="ue_pager_page" value="' + idx + '" />').appendTo(frame);
            frame.append('<span style="float:right;">Page:</span>');
            if (idx > 1) {
                frame.append('<a class="ue_pager_btn" href="#" pidx="' + (idx - 1) + '"><<</a>');
            }
            frame.append('<a class="ue_pager_btn ' + (idx == 1 ? "ue_pager_selected" : "") + '" href="#" pidx="1" >1</a>');
            if (idx == 3) {
                frame.append('<a class="ue_pager_btn" href="#" pidx="2">2</a>');
            }
            if (idx > 3) {
                frame.append('<a class="ue_pager_btn" href="#"> ... </a>');
                frame.append('<a class="ue_pager_btn" href="#" pidx="' + (idx - 1) + '">' + (idx - 1) + '</a>');
            }
            if (idx > 1 && idx < total) {
                frame.append('<a class="ue_pager_btn ue_pager_selected" href="#" >' + idx + '</a>');
            }
            if (idx < (total - 2)) {
                frame.append('<a class="ue_pager_btn" href="#" pidx="' + (idx + 1) + '">' + (idx + 1) + '</a>');
                frame.append('<a class="ue_pager_btn" href="#"> ... </a>');
            }
            if (idx == (total - 2)) {
                frame.append('<a class="ue_pager_btn" href="#" pidx="' + (total - 1) + '">' + (total - 1) + '</a>');
            }
            frame.append('<a class="ue_pager_btn ' + (idx == total ? "ue_pager_selected" : "") + '" href="#" pidx="' + total + '" >' + total + '</a>');
            if (idx < total) {
                frame.append('<a class="ue_pager_btn" href="#" pidx="' + (idx + 1) + '">>></a>');
            }
            frame.find('a').off('click').on('click', function () {
                var pidx = parseInt($(this).attr('pidx'), 10);
                if (pidx > 0) {
                    callback(pidx, pager.pageSize);
                }
            });
            size.off('click').on('click', function (e) {
                e.stopPropagation();
                parent.find('.ue_pager_sizes').show().find('div').off('click').on('click', function () {
                    parent.find('.ue_pager_size').val($(this).html());
                    parent.find('.ue_pager_sizes').hide();
                    callback(idx, parseInt($(this).html(), 10));
                });
            }).off('change').on('change', function (e) {
                e.stopPropagation();
                callback(idx, parseInt($(this).val(), 10));
            });
            page.off('change').on('change', function (e) {
                e.stopPropagation();
                callback(parseInt($(this).val(), 10), pager.pageSize);
            });
            return true;
        }
        return false;
    };
    /* 分页模块         ------ End   ------ */

    /* grid模块         ------ Start ------ */
    window.UEGridList = [];
    window.UEGrid = window.UEGrid || {
        create: function (container, config) {
            var grid = {
                pager: { pageIndex: 1, pageSize: 0, totalCount: 0, startIndex: 0, totalPage: 0 },
                srcList: [], filterList: [], pageList: [], currList: [], backList: [], changeList: [], checkedList:[], errList: [],                
                newRow: null, selectedRow: null, selectRowIdx: 0, overRowIdx: 0, eventKey: 0,
                compareTypes:'*,=,>,<,!',
                lineWidth: 0,
                rowCount: 0,
                defaultConfig: {
                    showPage: false,
                    resizeable: true,
                    charWidth: 8,
                    headHeight: 24,
                    lineHeight: 20,
                    width: 360,
                    height: 200,
                    columnMaxWidth: 150,
                    columnMinWidth: 40,
                    columnDefWidth: 80,
                    headColor: "#fff",
                    headBGColor: "#666",
                    headLineColor: '#fff',
                    cellBorderColor: "#999",
                    overLineBGColor: "#def",
                    firstLineBGColor: "#ddd",
                    secondLineBGColor: "#fff",
                    selectLineBGColor: "#8ac",
                    filterImg: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAYAAACwXJejAAAAL0lEQVR42mP4X6/OQAhDGCCATQFUHFURDhpDFzY+piA6jaIIh4KhoQhHcDAQEy0AohflF76Z3eMAAAAASUVORK5CYII=',
                    unFilterImg:'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAlQTFRF7RwkqOf6NAAAAAN0Uk5T//8A18oNQQAAACxJREFUeNpiYGRiYGICYkYgAlIQkhEkAmaBxBkgXIg6MMUIUkESiwmNBRBgACd2ALMRm0KHAAAAAElFTkSuQmCC',
                },
                style: function () {
                    return ''
        + '<style id="ue_grid_style">'
        + '   .ue_grid_container {padding:0;position:relative;}'
        + '   .ue_grid_click {width:12px;font-size:10px;position:absolute;cursor:pointer;opacity:0;}'
        + '   .ue_grid_frame {border: 1px solid #666;border-radius: 3px;overflow:hidden;background-color:#fff; position:relative;z-index: 99;font-size:12px;margin: 0;padding: 0;}'
        + '   .ue_grid_content {border: none;position: relative;overflow:auto;width: 100%;height: 100%;}'
        + '   .ue_grid_scroll {overflow:hidden;width:auto;height:auto;position:relative;}'
        + '   .ue_grid_resize{position:absolute;width:13px;height:15px;right:0;bottom:0;padding:1px 0 0 3px;z-index:100;cursor:se-resize;display:none;}'
        + '   .ue_grid_thead {font-size:16px;font-weight:bold;text-align:center;position:relative;}'
        + '   .ue_grid_th {background-color:transparent;float:left;position:relative;user-select:none;}'
        + '   .ue_grid_ts {background-color:transparent;overflow:hidden;color:#0c0;font-size: xx-small;position:absolute;border:none;opacity:0;width:3px;cursor:ew-resize;top:0;right:-1px;z-index:100;text-indent:-2px;}'
        + '   .ue_grid_table {overflow:hidden;width:auto;height:auto;position:relative;}'
        + '   .ue_grid_input {border:none;height:100%;left:1px;top:0;position:absolute;}'
        + '   .ue_grid_filter {border:none;left:1px;top:1px;position:absolute;background-color:#eee;font-size:12px;color:#666;text-align:left;display:none;z-index:101;}'
        + '   .ue_grid_fbtn {width:9px;cursor:pointer;}'
        + '   .ue_grid_thead_chk, .ue_grid_cell_chk{width:14px; height:14px;margin:3px auto;}'
        + '   .ue_grid_cell_drp{position:absolute;left:0;top:0;}'
        + '   .ue_grid_cell {position:relative;background-color: transparent;margin: 0;padding:0 2px;float:left;overflow: hidden;text-overflow:ellipsis;word-break:keep-all;white-space:nowrap;cursor:default;}'
        + '</style>';
                },
                showHead: function () {
                    var c = this.config, th = '';
                    for (var i = 0; i < c.columns.length; i++) {
                        var col = c.columns[i], display = !col.visiable ? "display:none" : "display:inline-block;", sc = col.sortType == 'asc' ? 'ue_grid_asc' : 'ue_grid_desc';
                        if (col.type == "checkbox") {
                            th += '<div class="ue_grid_th" thIdx="' + i + '" style="' + display + ';border-right:1px solid ' + c.headLineColor + ';width:' + (col.width - 1) + 'px;height:' + c.headHeight + 'px;line-height:' + c.headHeight + 'px;color:' + c.headColor + '" onselectstart="return false;">'
                                + '<input class="ue_grid_thead_chk" thIdx="' + i + '"  type="checkbox"  ' + (col.readonly ? 'disabled="disabled"' : '') + '/>'
                                + '</div>';
                        } else {
                            th += '<div class="ue_grid_th" thIdx="' + i + '" style="' + display + ';border-right:1px solid ' + c.headLineColor + ';width:' + (col.width - 1) + 'px;height:' + c.headHeight + 'px;line-height:' + c.headHeight + 'px;color:' + c.headColor + '" onselectstart="return false;">'
                                + col.caption
                                + '<div class="ue_grid_ts" thIdx="' + i + '" style="height:' + c.headHeight + 'px;line-height:' + c.headHeight + 'px;">'
                                + (!col.filterable ? '' : '<div class="ue_grid_fbtn" thIdx="' + i + '" style="height:' + c.headHeight + 'px;background-color:' + c.headBGColor + ';"><img alt="" style="margin-top:' + (c.headHeight - 12) / 2 + 'px;" src="' + c.filterImg + '" /></div>') + '</div></div>';
                        }
                    }
                    this.theadDom.html(th).width(this.lineWidth);
                },
                refresh: function () {//数据绑定
                    var c = this.config,list = this.getCurrList();
                    if (Object.prototype.toString.call(list) === '[object Array]' && list.length > 0) {
                        this.tableDom.html('').width(this.lineWidth);;
                        for (var i = 0; i < list.length; i++) {
                            var r = list[i], bgc = (i % 2) > 0 ? c.firstLineBGColor : c.secondLineBGColor;
                            for (var j = 0; j < c.columns.length; j++) {
                                var col = c.columns[j], f = col.field, v = r[f], display = !col.visiable ? "display:none" : "display:inline-block;";
                                var td = $('<div class="ue_grid_cell" trIdx="' + i + '" tdIdx="' + j + '" srcIdx="' + r.ue_grid_src_idx + '" style="' + display + ';background-color:' + bgc + ';border-right:1px solid ' + c.cellBorderColor + ';border-bottom:1px solid ' + c.cellBorderColor + ';width:' + (col.width - 5) + 'px;height:' + (c.lineHeight - 1) + 'px;line-height:' + (c.lineHeight - 1) + 'px;"></div>').appendTo(this.tableDom);
                                switch (col.type) {
                                    case '':
                                    case 'string':
                                    case 'mail': {
                                    } break;
                                    case 'bool': {
                                        var m = r.format ? r.format : 'true,false', s = m.split(','), v = v ? s[0] : s[1];
                                    } break;
                                    case 'number': {
                                        v = '<input class="ue_grid_cell_time" type="number" value="' + v + '" style="border:none;background-color:transparent;100%;height:100%;" />';
                                    } break;
                                    case 'button': {
                                        v = '<input class="ue_grid_cell_' + col.option + '" type="button" value="' + (col.value ? col.value : col.option) + '" />';
                                    } break;
                                    case 'time': {
                                        v = '<input class="ue_grid_cell_time" type="datetime" value="' + v + '" style="border:none; background-color:transparent;width:100%;height:100%;" />';
                                    } break;
                                    case 'date': {
                                        v = '<input class="ue_grid_cell_time" type="date" value="' + v + '" style="border:none;background-color:transparent;100%;height:100%;" />';
                                    } break;
                                    case 'checkbox': {
                                        td.css('text-align', 'center');
                                        v = '<input class="ue_grid_cell_chk" trIdx="' + i + '" tdIdx="' + j + '" srcIdx="' + r.ue_grid_src_idx + '" type="checkbox" ' + (v ? 'checked="checked"' : '') + '  ' + (col.readonly ? 'disabled="disabled"' : '') + '/>';
                                    } break;
                                    case 'dropdown': {
                                        if (col.datasource) {
                                            for (var k in col.datasource) {
                                                var item = col.datasource[k];
                                                v = item.value == v ? item.text : v;
                                            }
                                        }
                                    } break;
                                    case 'lookup': {
                                        if (col.type == 'lookup') {
                                            td.css('overflow', '');
                                        }
                                    } break;
                                    case 'template': {
                                        v = r.content ? r.content : col.content;
                                    } break;
                                    default: break;
                                }
                                td.html(v);
                            }
                        }
                        this.scrollDom.css({ width: this.lineWidth });
                        this.contentDom.height(this.frameDom.height() - c.headHeight - (this.lineWidth > this.contentDom.width() ? 0 : 0));
                        if (this.config.showPage) {
                            var g = this, pager = g.pager;
                            var re = g.frameDom.LoadPageFilter(pager, function (page, size) {
                                pager.pageIndex = page < 1 ? 1 : page > pager.totalPage ? pager.totalPage : page;
                                if (size != pager.pageSize) {
                                    pager.pageSize = size < 1 ? 1 : size > pager.totalCount ? pager.totalCount : size;
                                    pager.totalPage = Math.ceil(pager.totalCount / size);
                                    pager.pageIndex = 1;
                                }
                                g.setPageList();
                            });
                            if (re) {
                                this.contentDom.height(this.contentDom.height() - 20);
                            }
                        }
                    }
                    this.bindEvent();
                },
                setListByfilter: function () {
                    this.filterList = this.srcList, c = this.config;
                    for (var i in c.columns) {
                        var col = c.columns[i];
                        if (col.filterText) {
                            var type = col.filterText.substr(0, 1),
                                text = this.compareTypes.indexOf(type) == -1 ? col.filterText : col.filterText.substr(1);
                            t = text.toLowerCase();
                            this.filterList = this.filterList.filter(function (item) {
                                var s = item[col.field].toLowerCase();
                                return type == '*' ? s.indexOf(t) > -1
                                     : type == '=' ? s == t
                                     : type == '>' ? s > t
                                     : type == '<' ? s < t
                                     : type == '!' ? s != t
                                     : s.indexOf(t) > -1;
                            });
                        }
                    }
                    this.setPageList();
                },
                setPageList: function () {
                    var pager = this.pager, c = this.config;
                    pager.totalCount = this.filterList.length;
                    pager.pageSize = c.showPage ? (pager.pageSize || c.pageSize || this.rowCount) : pager.totalCount;
                    pager.totalPage = Math.ceil(pager.totalCount / pager.pageSize);
                    pager.pageStart = (pager.pageIndex - 1) * pager.pageSize;
                    var endIdx = pager.pageStart + pager.pageSize;
                    pager.endIndex = pager.totalCount > endIdx ? endIdx : pager.totalCount;
                    this.pageList = this.filterList.slice(pager.pageStart, pager.endIndex);
                    var h = (c.showPage ? this.pageList.length : pager.totalCount) * c.lineHeight;
                    this.scrollDom.height(h);
                    this.refresh();
                },
                getCurrList: function () {
                    var pager = this.pager;
                    var endIdx = pager.startIndex + this.rowCount;
                    pager.endIndex = pager.totalCount > endIdx ? endIdx : pager.totalCount;
                    this.currList = this.pageList.slice(pager.startIndex, pager.endIndex);
                    return this.currList;
                },
                changeColumnIdx: function (srcIdx, targetIdx) {
                    var c = this.config, src = c.columns[srcIdx];
                    c.columns.splice(srcIdx, 1);
                    c.columns.splice(targetIdx, 0, src);
                    this.showHead();
                    this.refresh();
                },
                mouseMove: function (e, t, k, d) {
                    var g = d;
                    if (g.x > 0 || g.y > 0) {
                        if (g.columnMove && e.pageX != g.x) {
                            if (!g.thClone) {
                                var o = g.theadDom.find('.ue_grid_th[thIdx="' + g.currentColumnIdx + '"]'),
                                    t = g.tableDom.find('.ue_grid_cell[tdIdx="' + g.currentColumnIdx + '"]');
                                g.startLeft = o.offset().left - g.theadDom.offset().left;
                                g.thClone = o.clone().css({ position: 'absolute', border: '1px solid #333', opacity: 0.6, left: g.startLeft, zIndex: 999 }).appendTo(g.theadDom);
                                g.tdClone = t.clone().css({ position: 'absolute', border: '1px solid #333', opacity: 0.6, left: g.startLeft, zIndex: 999 }).appendTo(g.theadDom);
                                for (var i = 0; i < t.length; i++) {
                                    var src = $(t[i]);
                                    $(g.tdClone[i]).css({ top: i * g.config.lineHeight }).appendTo(g.tableDom);
                                }
                            } else {
                                var left = parseInt(g.thClone.css('left'), 10) + e.pageX - g.x;
                                g.thClone.css({ left: left });
                                g.tdClone.css({ left: left });
                            }
                        }
                        if (g.columnResize) {
                            g.setColumnWidth(g.currentColumnIdx, e.pageX - g.x);
                        }
                        if (g.startResize) {
                            if (e.pageX > g.x) {
                                if (g.contentDom[0].clientWidth < g.tableDom.width()) {
                                    var x = e.pageX - g.x,
                                        sx = g.tableDom.width() - g.contentDom[0].clientWidth,
                                        tx = x > sx ? sx : x;
                                    g.frameDom.css({ width: g.frameDom.width() + tx });
                                    g.contentDom.css({ width: g.contentDom.width() + tx });
                                }
                            } else {
                                if (g.frameDom.width() > 36) {
                                    g.frameDom.css({ width: g.frameDom.width() + (e.pageX - g.x) });
                                    g.contentDom.css({ width: g.contentDom.width() + (e.pageX - g.x) });
                                }
                            }
                            if (e.pageY > g.y) {
                                if ((g.contentDom[0].clientHeight - g.config.headHeight) < g.tableDom.height()) {
                                    var y = e.pageY - g.y,
                                        sy = g.tableDom.height() - g.contentDom[0].clientHeight + g.config.headHeight,
                                        ty = y > sy ? sy : y;
                                    g.frameDom.css({ height: g.frameDom.height() + ty });
                                    g.contentDom.css({ height: g.contentDom.height() + ty });
                                }
                            } else {
                                if (g.frameDom.height() > 36) {
                                    g.frameDom.css({ height: g.frameDom.height() + (e.pageY - g.y) });
                                    g.contentDom.css({ height: g.contentDom.height() + (e.pageY - g.y) });
                                }
                            }
                            g.config.maxWidth = g.contentDom.width();
                            g.config.maxHeight = g.contentDom.height();
                        }
                    }
                    g.x = e.pageX;
                    g.y = e.pageY;
                },
                mouseUp: function (e, k, t, d) {
                    var g = d;
                    g.startResize = false;
                    g.columnResize = false;
                    if (g.columnMove) {
                        g.columnMove = false;
                        if (g.thClone) {
                            var left = parseInt(g.thClone.css('left'), 10), cols = g.config.columns;
                            if (g.startLeft > left) {
                                for (var i = 0; i < cols.length; i++) {
                                    if (left < cols[i].width) {
                                        g.changeColumnIdx(g.currentColumnIdx, i);
                                        break;
                                    }
                                    left = left - cols[i].width;
                                }
                            } else {
                                left += g.thClone.outerWidth();
                                for (var i = 0; i < cols.length; i++) {
                                    left = left - cols[i].width;
                                    if (left < cols[i].width) {
                                        g.changeColumnIdx(g.currentColumnIdx, i);
                                        break;
                                    }
                                }
                            }
                            g.thClone && g.thClone.remove();
                            g.tdClone && g.tdClone.remove();
                            g.thClone = null;
                            g.tdClone = null;
                        }
                        g.theadDom.find('.ue_grid_th[thIdx=' + g.currentColumnIdx + ']').css('cursor', 'default');
                    }
                },
                keyDown: function (e, k, t, d) {
                    e = e || window.event;
                    if (d.eventKey == UE_EVENT.CurrKey && d.frameDom.css('display') != 'none') {
                        var c = d.config;
                        switch (e.which) {
                            case 13: {//回车
                                var o = $(document.activeElement);
                                if (o.hasClass('ue_grid_filter')) {
                                    var idx = parseInt(o.attr('thIdx'), 10), col = d.config.columns[idx], txt = $(o).val();
                                    if (txt != col.filterText) {
                                        col.filterText = txt;
                                        d.setListByfilter();
                                    }
                                } else {
                                    d.setSelectRow(d.overRowIdx);
                                    !d.config.callback || d.config.callback(d.selectedRow, d);
                                }
                            } break;
                            case 38: {//上向键
                                d.keyPrev();
                                return false;
                            } break;
                            case 40: {//下向键
                                d.keyNext();
                                return false;
                            } break;
                            default: break;
                        }
                    }
                },
                autoSize: function (w, h, t, d) {
                    var g = $(d).GetUEGrid();
                    g.frameDom.css({ width: w - 2, height: h - 2 });
                    g.contentDom.css({ width: g.frameDom.width() - g.config.headWidth, height: g.frameDom.height() - g.config.headHeight });
                    g.bindData();
                },
                bindEvent: function () {
                    var g = this;
                    $(g).SetEvent('mouseup', g.mouseUp);
                    $(g).SetEvent('mousemove', g.mouseMove);
                    $(g).SetEvent('mousedown', g.mouseDown);
                    $(g).SetEvent('keydown', g.keyDown);
                    g.parent.SetEvent('resize', g.autoSize);
                    g.contentDom.scroll(function () {
                        $(g).ActiveEvent();
                        var tp = $(this).scrollTop();
                        if (tp != g.scrollTop) {
                            if (!g.config.showPage) {
                                var lines = Math.ceil(tp / g.config.lineHeight);
                                g.pager.startIndex = lines;
                                g.refresh();
                            }
                            g.scrollTop = tp;
                        }
                        if (!g.config.showPage) {
                            g.tableDom.css({ top: tp });
                        }
                        g.theadDom.css({ left: -$(this).scrollLeft() });
                    });
                    g.resizeDom.on('mousedown', function (e) {
                        e = e || window.event;
                        e.stopPropagation();
                        $(g).ActiveEvent();
                        g.startResize = !g.startResize;
                    });

                    g.tableDom.find('.ue_grid_cell').off('mouseenter').on('mouseenter', function (e) {
                        e = e || window.event;
                        e.stopPropagation();
                        g.overLine(parseInt($(this).attr('trIdx'), 10));
                    }).off('click').on('click', function (e) {
                        $(g).ActiveEvent();
                        e = e || window.event;
                        e.stopPropagation();
                        var t = e.srcElement || e.target;
                        var tdIdx = parseInt($(this).attr('tdIdx'), 10), srcIdx = parseInt($(this).attr('srcIdx'), 10), c = g.config.columns[tdIdx];
                        g.setSelectRow(parseInt($(this).attr('trIdx'), 10));
                        !g.config.callback || g.config.callback(g.selectedRow, g);
                        if (!c.readonly) {
                            if (c.type == 'dropdown'){
                                if (c.datasource) {
                                    if (!c.drpDom) {
                                        c.drpDom = $('<select class="ue_grid_cell_drp"></select>');
                                        for (var i in c.datasource) {
                                            var item = c.datasource[i];
                                            c.drpDom.append('<option value="' + item.value + '" >' + item.text + '</option>');
                                        }
                                    }
                                    if ($(this).find('select').length < 1) {
                                        var text = $(this).text();
                                        c.drpDom.css({
                                            width: $(this).width() + 4,
                                            height: $(this).height(),
                                        }).appendTo($(this)).show().focus();
                                        c.drpDom.off('click').on('click', function (e) { e = e || window.event; e.stopPropagation(); }).off('change').on('change', function (e) {
                                            var text = $(this).find("option:selected").text();
                                            g.tableDom.find('.ue_grid_cell[srcIdx="' + srcIdx + '"][tdIdx="' + tdIdx + '"]').text(text);
                                            g.changeCellValue(srcIdx, tdIdx, $(this).val());
                                        }).off('blur').on('blur', function (e) {
                                            $(this).hide();
                                        });
                                        var options = c.drpDom.find('option');
                                        for (var i = 0; i < options.length; i++) {
                                            var opt = $(options[i]);
                                            if (opt.is('option')) {
                                                if (opt.text() == text) {
                                                    c.drpDom.get(0).selectedIndex = i;
                                                }
                                            }
                                        }
                                    }
                                }
                            } else if (c.type == 'button') {

                            } else if (c.type == 'checkbox') {
                                // 测试弹出层效果
                                //var l = $(this).offset().left - g.parent.offset().left;
                                //var t = $(this).offset().top - g.parent.offset().top;
                                //$('<div style="border:1px solid red;width:100px;height:40px;position:absolute;z-index:999;"></div>').css({ top: t, left: l - 30 }).appendTo(g.parent);
                            } else if (c.type == 'lookup') {
                                c.callback($(this), g);
                            } else if (c.type == 'template') {
                                c.callback($(this), g);
                            } else {
                                if (!$(t).hasClass('ue_grid_input')) {
                                    g.currentCell = $(this);
                                    g.inputDom = g.inputDom || $('<input type="text" class="ue_grid_input" style="width:100%px;width:100%px;" />');
                                    g.inputDom.val(g.currentCell.text()).appendTo(g.currentCell).show().focus().on('change', function () {
                                        var parent = $(this).parent(),
                                            srcIdx = parseInt(parent.attr('srcIdx'), 10),
                                            tdIdx  = parseInt(parent.attr('tdIdx'), 10);
                                        g.changeCellValue(srcIdx, tdIdx, $(this).val());
                                        parent.text($(this).val());
                                        $(this).hide();
                                    });
                                }
                            }
                        }
                    }).find('input').off('click').on('click', function (e) {
                        e = e || window.event;
                        e.stopPropagation();
                        $(g).ActiveEvent();
                        if (this.type == 'button') {
                            alert('test button');
                        }
                        if (this.type == 'checkbox') {
                        }
                    });
                    g.tableDom.find('input[type="checkbox"]').off('change').on('change', function (e) {
                        var idx = parseInt($(this).parent().attr('tdIdx'), 10);
                        var sdx = parseInt($(this).parent().attr('srcIdx'), 10);
                        g.changeCellValue(sdx, idx, $(this).is(':checked'));
                        g.setCheckedRow();
                    });
                    g.tableDom.find('input').off('click').on('click', function (e) {
                        e = e || window.event;
                        e.stopPropagation();
                        $(g).ActiveEvent();
                        //
                    });
                    g.theadDom.find('.ue_grid_th').off('mousedown').on('mousedown', function (e) {
                        e = e || window.event;
                        e.stopPropagation();
                        $(g).ActiveEvent();
                        g.currentColumnIdx = parseInt($(this).attr('thIdx'), 10);
                        $(this).css('cursor', 'move');
                        g.columnMove = !g.columnMove;
                    }).off('click').on('click', function (e) {
                        e = e || window.event;
                        e.stopPropagation();
                        $(g).ActiveEvent();
                        var t = e.srcElement || e.target;
                        if ($(t).hasClass('ue_grid_th')) {
                            var idx = parseInt($(this).attr('thIdx'), 10);
                            g.sortColumn(idx);
                        }
                    }).off('mouseenter').on('mouseenter', function (e) {
                        e = e || window.event;
                        e.stopPropagation();
                        $(g).ActiveEvent();
                        $(this).find('.ue_grid_ts').css({ width: '12px', opacity: 1 });
                    }).off('mouseleave').on('mouseleave', function (e) {
                        e = e || window.event;
                        e.stopPropagation();
                        $(g).ActiveEvent();
                        $(this).find('.ue_grid_ts').css({ width: '3px', opacity: 0 });
                    });
                    g.theadDom.find('.ue_grid_ts').off('mousedown').on('mousedown', function (e) {
                        e = e || window.event;
                        e.stopPropagation();
                        $(g).ActiveEvent();
                        g.columnResize = !g.columnResize;
                        g.currentColumnIdx = parseInt($(this).attr('thIdx'), 10);
                    }).off('dblclick').on('dblclick', function (e) {
                        e = e || window.event;
                        e.stopPropagation();
                        $(g).ActiveEvent();
                        var idx = parseInt($(this).attr('thIdx'), 10), col = g.config.columns[idx], f = col.field;
                        var len = GetCharLength(col.caption) * 8 + 8;
                        for (var i in g.currList) {
                            var r = g.currList[i], v = r[f], l = GetCharLength(v) * 8 + 8;
                            len = len > l ? len : l;
                        }
                        g.setColumnWidth(idx, len - $(this).parent().outerWidth());
                    });
                    g.theadDom.find('.ue_grid_fbtn').off('click').on('click', function (e) {
                        e = e || window.event;
                        e.stopPropagation();
                        $(g).ActiveEvent();
                        var idx = parseInt($(this).attr('thIdx'), 10);
                        if (!g.config.columns[idx].filterText) {
                            g.showFilterDom($(this));
                            $(this).find('img').attr('src', g.config.unFilterImg);
                        } else {
                            g.config.columns[idx].filterText = '';
                            g.setListByfilter();
                            $(this).find('img').attr('src', g.config.filterImg);
                        }
                    });
                    g.theadDom.find('.ue_grid_thead_chk').off('change').on('change', function (e) {
                        e = e || window.event;
                        e.stopPropagation();
                        $(g).ActiveEvent();
                        var val = $(this).is(':checked'), cid = parseInt($(this).attr('thIdx'), 10), field = g.config.columns[cid].field;
                        g.tableDom.find('input[tdIdx="' + cid + '"]').prop('checked', val);
                        g.filterList.forEach(function (item) {
                            item[field] = val;
                        });
                        g.checkedList = val ? g.filterList : [];
                    });
                },
                keyPrev: function () {
                    var g = this, c = g.config, idx = 0,
                        st = g.contentDom[0].scrollTop,
                        ch = g.contentDom[0].clientHeight;
                    if (g.overRowIdx > 0) {
                        idx = g.overRowIdx - 1;
                    } else {
                        g.pager.startIndex -= 1;
                        idx = 0;
                        g.refresh();
                    }
                    g.overLine(idx);
                },
                keyNext: function () {
                    var g = this, idx = 0;
                    if (g.overRowIdx < (this.rowCount - 1)) {
                        idx = g.overRowIdx + 1;
                    } else {
                        g.pager.startIndex += 1;
                        idx = this.rowCount - 1;
                        g.refresh();
                    }
                    g.overLine(idx);
                },
                setColumnWidth: function (i, x) {
                    var c = this.frameDom.find('.ue_grid_th[thIdx="' + i + '"]');
                    var d = this.frameDom.find('.ue_grid_cell[tdIdx="' + i + '"]');
                    if ((c.width() + x) > this.config.columnMinWidth) {
                        this.lineWidth += x;
                        this.scrollDom.css({ width: this.lineWidth });
                        this.theadDom.css({ width: this.lineWidth });
                        this.tableDom.css({ width: this.lineWidth });
                        c.width(c.width() + x);
                        d.width(d.width() + x);
                        this.config.columns[i].width = this.config.columns[i].width = c.outerWidth();
                    }
                },
                showFilterDom: function (obj) {
                    var g = this, idx = parseInt($(obj).attr('thIdx'), 10), col = g.config.columns[idx], p = obj.parent().parent();
                    if (!g.filterDom) {
                        g.filterDom = $('<input class="ue_grid_filter" type="text" />');
                    }
                    g.filterDom.css({ width: p.width() - 2, height: p.height() - 5 }).off('blur').on('blur', function () {
                        $(g).ActiveEvent();
                        var txt = $(this).val();
                        if (txt != col.filterText) {
                            col.filterText = txt;
                            g.setListByfilter();
                        }
                        $(this).hide();
                    }).val(g.config.columns[idx].filterText).appendTo(p).show().focus();
                },
                getRowBySrcId: function (list, srcId) {
                    for (var i in list) {
                        if (list[i].ue_grid_src_idx == srcId) {
                            return list[i];
                        }
                    }
                    return null;
                },
                getIdxBySrcId: function (list, srcId) {
                    for (var i in list) {
                        if (list[i].ue_grid_src_idx == srcId) {
                            return i;
                        }
                    }
                    return -1;
                },
                getRowByKey: function (list, key) {
                    var k = this.config.keyField;
                    for (var i in list) {
                        if (list[i][k] == key) {
                            return list[i];
                        }
                    }
                    return null;
                },
                changeCellValue: function (srcIdx, tdIdx, val) {
                    var c = this.config.columns[tdIdx],
                        row = this.getRowBySrcId(this.srcList, srcIdx),
                        crow = this.getRowBySrcId(this.changeList, srcIdx),
                        brow = this.getRowBySrcId(this.backList, srcIdx),
                        cell = this.tableDom.find('.ue_grid_cell[srcIdx="' + srcIdx + '"][tdIdx="' + tdIdx + '"]');
                    if (c.regexp && !c.regexp.test(val)) {
                        cell.css({ borderColor: '#f00'}).focus();
                        return false;
                    }
                    if (!brow) {
                        brow = $.extend(true, {}, row);//深度复制
                        this.backList.push(row);
                    }
                    row[c.field] = val;
                    if (!crow) {
                        this.changeList.push(row);
                    } else {
                        crow[c.field] = val;
                    }
                    cell.css({ borderColor: this.config.cellBorderColor});
                },
                changeCell: function (grid, cell, val) {
                    var obj = $(cell),
                        srcIdx = parseInt(obj.attr('srcIdx'), 10),
                        tdIdx = parseInt(obj.attr('tdIdx'), 10);
                    grid.changeCellValue(srcIdx, tdIdx, val);
                },
                overLine: function (trIdx) {
                    var overRow = this.tableDom.find('.ue_grid_cell[trIdx=' + this.overRowIdx + ']'),
                        bgc = this.selectedRow && this.selectRowIdx == this.overRowIdx ? this.config.selectLineBGColor : (this.overRowIdx % 2) > 0 ? this.config.firstLineBGColor : this.config.secondLineBGColor;
                    overRow.css('background-color', bgc);
                    this.overRowIdx = trIdx;
                    this.tableDom.find('.ue_grid_cell[trIdx=' + trIdx + ']').css('background-color', this.config.overLineBGColor);
                },
                filterColumn: function (idx, value) {
                    if (this.currentCell && this.currentCell.find('.ue_grid_input')) {
                        var o = this.currentCell.find('.ue_grid_input');
                        this.currentCell.text(o.val());
                        var srcIdx = parseInt(this.currentCell.parent().attr('srcIdx'), 10);
                        var tdIdx = this.currentCell.attr('tdIdx');
                        this.srcList[srcIdx][this.config.columns[tdIdx].field] = o.val();
                        o.hide();
                    }
                },
                setSelectRow: function (trIdx) {
                    var srcIdx = parseInt(this.tableDom.find('.ue_grid_cell[trIdx=' + trIdx + ']').attr('srcIdx'), 10);
                    this.selectedRow = this.srcList[srcIdx];
                    if (this.selectRowIdx != trIdx) {
                        var bgc = (this.selectRowIdx % 2) > 0 ? this.config.firstLineBGColor : this.config.secondLineBGColor;
                        this.tableDom.find('.ue_grid_cell[trIdx=' + this.selectRowIdx + ']').css('background-color', bgc);
                    }
                    this.selectRowIdx = trIdx;
                    this.tableDom.find('.ue_grid_cell[trIdx=' + trIdx + ']').css('background-color', this.config.selectLineBGColor);
                },
                setCheckedRow: function (filterField) {
                    this.checkdeList = this.filterList.filter(function (item) {
                        return item[filterField];
                    });
                },
                showHideColumn: function (idxs) {
                    if (idxs) {
                        var idxs = idxs.split(',');
                        for (var i in idxs) {
                            var idx = idxs[i];
                            this.contentDom.find('.ue_grid_th[thIdx="' + idx + '"]').css('display', 'inline-block');
                            this.contentDom.find('.ue_grid_cell[tdIdx="' + idx + '"]').css('display', 'inline-block');
                        }
                    } else {
                        this.contentDom.find('div:hidden').css('display', 'inline-block');
                    }
                },
                getCofig: function () {
                    return this.config;
                },
                getColumnCofig: function () {
                    return this.config.columns;
                },
                setColumnCofig: function (columnsConfig) {
                    this.config.columns = columnsConfig;
                    return this.bindData();
                },
                initSrcId: function () {
                    var list = this.srcList, len = list.length;
                    for (var i = 0; i < len; i++) {
                        list[i].ue_grid_src_idx = i;
                    }
                },
                setRow: function (row, idx) {
                    if (!row) return;
                    var k = this.config.keyField;
                    srow = this.getRowByKey(this.srcList, row[k]);
                    if (srow) {
                        srcId = srow.ue_grid_src_idx;
                        row = MergeJsonObj(srow, row);
                        item = this.getRowByKey(this.changeList, row[k]);
                        if (item) {
                            item = row;
                        } else {
                            this.changeList.push(row);
                            var copy = $.extend(true, {}, srow);
                            this.backList.push(copy);
                        }
                        this.srcList.splice(srcId, 1, row);
                    } else {
                        this.addRow(row);
                    }
                    this.setListByfilter();
                },
                deleteRow: function (srcIdx) {
                    var idx = this.getIdxBySrcId(this.srcList, srcIdx);
                    if (idx != -1) {
                        this.srcList.splice(idx, 1);
                    } 
                    item = this.getRowByKey(this.changeList, srcIdx);
                    if (item) {
                        item.isDelete = true;
                    }
                    idx = this.getIdxBySrcId(this.backList, srcIdx);
                    if (idx != -1) {
                        this.changeList.splice(idx, 1);
                    }
                    this.setListByfilter();
                },
                createNewRow: function () {
                    this.newRow = {};
                    this.newRow.ue_grid_src_idx = this.srcList.length;
                    for (var i in this.config.columns) {
                        this.newRow[this.config.columns[i].field] = '';
                    }
                },
                addRow: function (item, idx) {
                    if (!item) return;
                    item.ue_grid_src_idx = this.srcList.length;
                    idx = idx || this.srcList.length;
                    this.srcList.splice(idx, 0, item);
                    this.changeList.push(item);
                    this.setListByfilter();
                },
                addEmptyRow: function () {
                    this.createNewRow();
                    this.pageList.shift();
                    this.pageList.push(this.newRow);
                    this.srcList.push(this.newRow);
                    this.refresh();
                    this.overLine(this.rowCount - 1);
                },
                addRange: function (arr, idx) {
                    if (arr && Object.prototype.toString.call(arr) === '[object Array]' && arr.length > 0) {
                        var list = this.srcList, len = list.length;
                        for (var i in arr) {
                            arr[i].ue_grid_src_idx = len + i;
                        }
                        idx = idx || len;
                        list.splice(idx, 0, arr);
                        this.changeList.splice(idx, 0, arr);
                        this.setListByfilter();
                    }
                },
                sortColumn: function (idx) {
                    var c = this.config.columns[idx], f = c.field;
                    if (c.sortable) {
                        var sort = this.theadDom.find('.ue_grid_sort[thIdx="' + idx + '"]');
                        if (c.sortType == 'desc') {
                            this.filterList.sort(function (a, b) {
                                return a[f] == b[f] ? 0 : a[f] > b[f] ? 1 : -1;
                            });
                            c.sortType = 'asc';
                        } else {
                            this.filterList.sort(function (a, b) {
                                return a[f] == b[f] ? 0 : a[f] < b[f] ? 1 : -1;
                            });
                            c.sortType = 'desc';
                        }
                    }
                    this.setPageList();
                },
                show: function () {
                    if (this.frameDom.css('display') == 'none') {
                        this.showHead();
                        this.refresh();
                        this.frameDom.show();
                    }
                },
                bindData: function (list, cfg) {
                    var c = this.config = cfg ? MergeJsonObj(this.defaultConfig, cfg) : this.config;
                    c.dataList = list || c.dataList;
                    this.srcList = list || this.srcList;
                    this.lineWidth = 0;
                    if (c.columns && c.columns.length > 0) {
                        for (var i in c.columns) {
                            var col = c.columns[i];
                            col.width = col.width || c.columnDefWidth;
                            col.caption = col.caption || col.field;
                            col.readonly = col.readonly || false;
                            col.filterable = col.filterable == undefined ? true : col.filterable;
                            col.visiable = col.visiable || false;
                            col.sortable = col.sortable || false;
                            col.filterType = '⊂';
                            col.type = col.type || '';
                            if (col.visiable) {
                                this.lineWidth += col.width;
                            }
                        }
                    } else {
                        c.columns = [];
                        for (var i in this.srcList[0]) {
                            var col = { field: i, caption: i, type: '', readonly: true, visiable: true, filterable: true, format: '', style: '', sortable: true, filterType: '⊂' };
                            c.columns.push(col);
                            col.width = c.columnDefWidth;
                            this.lineWidth += col.width;
                        }
                    }

                    var h = this.parent[0].clientHeight - c.headHeight - (this.lineWidth > this.parent[0].clientWidth ? 17 : 0) - (c.showPage ? 20 : 0);
                    this.rowCount = Math.ceil(h / c.lineHeight);
                    this.initSrcId();
                    this.filterList = this.srcList;
                    this.showHead();
                    this.setPageList();
                },
                initGrid: function (parent, cfg) {
                    if ($('#ue_grid_style').length < 1) {
                        $(this.style()).appendTo('head');
                    }
                    var c = this.config = MergeJsonObj(this.defaultConfig, cfg);
                    if (!c.keyField) {
                        alert('No key field!');
                        return;
                    }
                    this.scrollTop = 0;
                    this.parent = parent;

                    this.parent.addClass('ue_grid_container');

                    this.frameDom = this.frameDom || $('<div class="ue_grid_frame" contenteditable="false" style="width:' + (parent[0].clientWidth - 2) + 'px;height:' + (parent[0].clientHeight - 2) + 'px;"></div>').appendTo(parent);
                    this.resizeDom = $('<div class="ue_grid_resize">◢</div>').appendTo(this.frameDom);
                    this.theadDom = $('<div class="ue_grid_thead" style="background-color:' + c.headBGColor + ';height:' + c.headHeight + 'px;"></div>').appendTo(this.frameDom);
                    this.contentDom = $('<div class="ue_grid_content"></div>').appendTo(this.frameDom);
                    this.scrollDom = $('<div class="ue_grid_scroll"></div>').appendTo(this.contentDom);
                    this.tableDom = $('<div class="ue_grid_table"></table>').appendTo(this.scrollDom);
                    this.contentDom.height(this.frameDom.height() - c.headHeight);
                    if (c.resizeable) {
                        this.resizeDom.show();
                    }
                    this.bindData(cfg.dataList);
                }
            };
            grid.initGrid(container, config);
            return grid;
        }
    };
    $.fn.AddUEGrid = function (config, callback) {
        config.callback = callback;
        var parent = $(this);
        var id = parent.attr('id') || 'ue_grid_container_' + UEGridList.length;
        parent.attr('id', id);
        for (var i in UEGridList) {
            var item = UEGridList[i];
            if (item.parent.attr('id') == id) {
                UEGridList.splice(i, 1);
                break;
            }
        }
        var o = UEGrid.create(parent, config);
        UEGridList.push(o);
        return o;
    };
    $.fn.GetUEGrid = function () {
        var id = $(this).attr('id');
        for (var idx in UEGridList) {
            var item = UEGridList[idx];
            if (id == item.parent.attr('id')) {
                return item;
            }
        }
        return null;
    };
    /* grid模块         ------ End   ------ */

    /* lookup模块       ------ Start ------ */
    window.UELookupList = [];
    'use strict';
    window.UELookup || (window.UELookup = function (target, config) {
        var lookup = {
            fields: [],
            captions: [],
            filterText: null,
            selectValue: null,
            selectText: null,
            selectedRow: null,
            overRowIndex: 0,
            selectedRowIndex: 0,
            keyIndex: 0,
            keyDown: false,
            defaultConfig: {
                charWidth: 8,
                headHeight: 24,
                lineHeight: 20,
                maxWidth: 360,
                maxHeight: 200,
                columnMaxWidth: 150,
                columnMinWidth: 60,
                columnDefWidth: 80,
                headColor: "#fff",
                headBGColor: "#666",
                headLineColor: '#fff',
                firstLineBGColor: "#eee",
                secondLineBGColor: "#fff",
                overLineBGColor: "#cde",
                cellBorderColor: "#999",
                defaultValue: '',
                isDropDownList: false,
                isCaseSensitive: false,
            },
            style: ''
+ '<style id="ue_lookup_style">'
+ '   .ue_lookup_select {background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAALCAYAAACprHcmAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAEZJREFUeNpi/P//PwOxgImBBEAHxUFBUf9BGFkSXQyueN26ZYwwBcg0TBwEGNFDA9kkZIVgAFKMjgMDI/9jE2ccHOEMEGAAmBo82XXtlgkAAAAASUVORK5CYII=) no-repeat;}'
+ '   .ue_lookup_click {width:12px;font-size:12px;position:absolute;cursor:pointer;opacity:0.4;}'
+ '   .ue_lookup_frame {border:1px solid #666;display:none;overflow:hidden;position:absolute;z-index:299;font-size:12px;user-select:none;margin: 0;padding: 0;background-color:#fff;}'
+ '   .ue_lookup_content {border: none;position: relative;overflow:auto;width: 100%;height: 100%;}'
+ '   .ue_lookup_resize{position:absolute;width:13px;height:15px;right:0;bottom:0;padding:1px 0 0 3px;z-index:300;cursor:se-resize;}'
+ '   .ue_lookup_thead {font-size: 14px;font-weight: bold; text-align: center; position: relative;overflow:hidden;width:auto;}'
+ '   .ue_lookup_th {background-color: transparent;overflow: hidden;display: inline-block;float:left;padding:0 2px;width:auto;}'
+ '   .ue_lookup_table {overflow:hidden;}'
+ '   .ue_lookup_tr {display: block;}'
+ '   .ue_lookup_td {background-color:transparent;overflow:hidden;display:inline-block;margin:0;padding:0 2px;float:left;text-overflow:ellipsis;word-break:keep-all;white-space:nowrap;cursor:default;}'
+ '</style>',
            bindData: function (src) {//数据绑定
                var o = this, c = this.config, list = src || this.list;
                this.tableDom.html('');
                if (Object.prototype.toString.call(list) === '[object Array]' && list.length > 0) {
                    for (var i = 0; i < list.length; i++) {
                        var r = list[i], bgc = (i % 2) > 0 ? c.firstLineBGColor : c.secondLineBGColor;
                        for (var j = 0; j < this.columns.length; j++) {
                            var col = this.columns[j], f = col.field, v = r[f], w = GetCharLength(v) * c.charWidth + 6;
                            var title = w > col.width ? ('title="' + v + '"') : '';
                            if (col.visiable) {
                                var tdDom = $('<div class="ue_lookup_td" trIdx="' + i + '" tdIdx="' + j + '" style="background-color:' + bgc + ';border-right:1px solid ' + c.cellBorderColor + ';border-bottom:1px solid ' + c.cellBorderColor + ';width:' + (col.width - 5) + 'px;height:' + (c.lineHeight - 1) + 'px;line-height:' + (c.lineHeight) + 'px;" ' + title + '>' + v + '</div>').appendTo(this.tableDom);
                            }
                            if (f == c.indexField) {
                                this.keyIndex = j
                            };
                        }
                    }
                    var hs = c.lineHeight * list.length;
                    this.theadDom.width(this.lineWidth);
                    this.tableDom.css({ width: this.lineWidth, height: list.length * c.lineHeight });
                    this.contentDom.css({ width: this.lineWidth < c.maxWidth ? (this.lineWidth + (hs < c.maxHeight ? 0 : 17)) : c.maxWidth, height: hs < c.maxHeight ? (hs + (this.lineWidth < c.maxWidth ? 1 : 17)) : c.maxHeight });
                    this.frameDom.css({ width: this.contentDom.width(), height: this.contentDom.height() + (c.isDropDownList ? 0 : c.headHeight) });
                    this.bindEvent();
                    var value = this.target.val() || this.target.text();
                    this.setSelectByValue(value);
                }
            },
            mouseMove: function (e,t,k,d) {
                e.stopPropagation();
                if (d.startResize) {
                    if (d.x == 0 && d.y == 0) {
                        d.x = e.pageX;
                        d.y = e.pageY;
                    } else {
                        if (e.pageX > d.x) {
                            if (d.contentDom[0].clientWidth < d.tableDom.width()) {
                                var x = e.pageX - d.x,
                                    sx = d.tableDom.width() - d.contentDom[0].clientWidth,
                                    tx = x > sx ? sx : x;
                                d.frameDom.css({ width: d.frameDom.width() + tx });
                                d.contentDom.css({ width: d.contentDom.width() + tx });
                            }
                        } else {
                            if (d.frameDom.width() > 36) {
                                d.frameDom.css({ width: d.frameDom.width() + (e.pageX - d.x) });
                                d.contentDom.css({ width: d.contentDom.width() + (e.pageX - d.x) });
                            }
                        }
                        if (e.pageY > d.y) {
                            if (d.contentDom[0].clientHeight < d.tableDom.height()) {
                                var y = e.pageY - d.y,
                                    sy = d.tableDom.height() - d.contentDom[0].clientHeight,
                                    ty = y > sy ? sy : y;
                                d.frameDom.css({ height: d.frameDom.height() + ty });
                                d.contentDom.css({ height: d.contentDom.height() + ty });
                            }
                        } else {
                            if (d.frameDom.height() > 36) {
                                d.frameDom.css({ height: d.frameDom.height() + (e.pageY - d.y) });
                                d.contentDom.css({ height: d.contentDom.height() + (e.pageY - d.y) });
                            }
                        }
                        d.config.maxWidth = d.contentDom.width();
                        d.config.maxHeight = d.contentDom.height();
                        d.x = e.pageX;
                        d.y = e.pageY;
                    }
                }
            },
            mouseUp: function (e,t,k,d) {
                d.startResize = false;
            },
            keyDown: function (e, t, k, d) {
                if (d.eventKey == UE_EVENT.CurrKey && d.frameDom.css('display') != 'none') {
                    var c = d.config;
                    switch (e.which) {
                        case 13: {//回车
                            var idx = parseInt(d.overRowIndex, 10);
                            d.setSelectRow(idx || 0);
                            d.setTargetValue(d.selectValue);
                            d.frameDom.hide();
                            !d.config.callback || d.config.callback(d.selectedRow);
                        } break;
                        case 27: {//ESC
                            d.frameDom.hide();
                        } break;
                        case 38: {//上向键
                            d.setSelectRow(d.overRowIndex - 1);
                            return false;
                        } break;
                        case 40: {//下向键
                            d.setSelectRow(d.overRowIndex + 1);
                            return false;
                        } break;
                        default: break;
                    }
                }
            },
            bindEvent: function () {
                var lkp = this;
                $(lkp).SetEvent('mouseup', lkp.mouseUp);
                $(lkp).SetEvent('mousemove', lkp.mouseMove);
                $(lkp).SetEvent('keydown', lkp.keyDown);
                lkp.tableDom.find('.ue_lookup_td').off('mouseenter').on('mouseenter', function (e) {
                    e = e || window.event;
                    e.stopPropagation();
                    $(lkp).ActiveEvent();
                    lkp.viewSelectRow(parseInt($(this).attr('trIdx'), 10));
                }).off('click').on('click', function (e) {
                    e = e || window.event;
                    e.stopPropagation();
                    $(lkp).ActiveEvent();
                    lkp.setSelectRow(parseInt($(this).attr('trIdx'), 10));
                    lkp.setTargetValue(lkp.selectValue);
                    lkp.frameDom.hide();
                    !lkp.config.callback || lkp.config.callback(lkp.selectedRow);
                });
            },
            setTargetValue: function (value) {
                var isExsits = false;
                for (var idx in this.config.dataList) {
                    var item = this.config.dataList[idx];
                    if (item[this.config.valueField] == value) {
                        var text = item[this.config.textField];
                        this.setSelectRow(idx);
                        this.target.val(text);
                        this.target.text(text);
                        isExsits = true;
                        break;
                    }
                }
                if (!isExsits) {
                    this.selectValue = this.selectText = value;
                    this.target.val(value);
                    this.target.text(value);
                }
                this.filterListByText(value);
            },
            setSelectByValue: function (value) {
                for (var i in this.list) {
                    if (this.list[i][this.config.valueField] == value) {
                        this.setSelectRow(i);
                        break;
                    }
                }
            },
            filterListByText: function (text) {
                if (this.filterText != text) {
                    this.filterText = text;
                    this.list = [];
                    var v = text.toLowerCase();
                    for (var i in this.config.dataList) {
                        var item = this.config.dataList[i];
                        var s = item[this.config.textField].toLowerCase();
                        if (s.indexOf(v) > -1) {
                            this.list.push(item);
                        }
                    }
                    this.bindData();
                }
            },
            setSelectRow: function (idx) {
                var i = idx < 0 ? 0 : (idx >= this.list.length ? (this.list.length - 1) : idx);
                this.selectedRowIndex = i;
                this.selectedRow = this.list[i];
                this.selectValue = this.selectedRow[this.config.valueField];
                this.selectText = this.selectedRow[this.config.textField];
                this.viewSelectRow(i);
            },
            viewSelectRow: function (idx) {
                this.tableDom.find('div[trIdx="' + this.overRowIndex + '"]').css('background-color', this.overDomBGColor);
                this.overRowIndex = idx;
                var overLine = this.tableDom.find('div[trIdx="' + this.overRowIndex + '"]');
                this.overDomBGColor = overLine.css('background-color');
                overLine.css('background-color', this.config.overLineBGColor);

                if (idx == 0) {
                    this.contentDom[0].scrollTop = 0;
                } else {
                    var tp = idx * this.config.lineHeight;
                    var sp = this.contentDom[0].scrollTop;
                    var ch = this.contentDom[0].clientHeight;
                    if (tp < sp) {
                        this.contentDom[0].scrollTop = tp;
                    } else if ((tp + this.config.lineHeight) > (sp + ch)) {
                        this.contentDom[0].scrollTop = tp - ch + this.config.lineHeight;
                    }
                }
            },
            setPosition: function () {
                var ww = $(window).width(),
			        wh = $(window).height(),
                    bt = $('body').scrollTop(),
                    bl = $('body').scrollLeft(),
                    fw = this.frameDom.outerWidth(),
                    fh = this.frameDom.outerHeight(),
                    pw = this.target.outerWidth(),
                    ph = this.target.outerHeight(),
                    pl = this.target.offset().left,
                    pt = this.target.offset().top,
		            l = pl - this.target.parent().offset().left,
                    t = pt - this.target.parent().offset().top;
                if ((pt + ph) > (wh + bt)) {
                    this.frameDom.css({ top: (wh + bt - fh) });
                } else {
                    this.frameDom.css({ top: t + ph + 2 });
                }
                if ((pl + pw) > (ww + bl)) {
                    this.frameDom.css({ left: (ww + bl - fw) });
                } else {
                    this.frameDom.css({ left: l });
                }
            },
            show: function () {
                if (this.frameDom.css('display') == 'none') {
                    this.bindData();
                    this.setPosition();
                    this.frameDom.show();
                    this.setSelectRow(0);
                }
            },
            bind: function (tg, cfg) {
                if ($('#ue_lookup_style').length < 1) {
                    $(this.style).appendTo('head');
                }
                var c = this.config = MergeJsonObj(this.defaultConfig, cfg), w = tg.outerWidth();
                this.lineWidth = 0;
                this.theadDom = $('<div class="ue_lookup_thead" style="background-color:' + c.headBGColor + ';height:' + c.headHeight + 'px;"></div>');
                if (c.columns && c.columns.length > 0) {
                    this.columns = c.columns;
                    for (var i in this.columns) {
                        var col = this.columns[i];
                        col.width = col.width || c.columnDefWidth;
                        col.caption = !col.caption ? col.field : col.caption;
                        var col = this.columns[i];
                        col.visiable = col.visiable == undefined ? true : col.visiable;
                        if (col.visiable) {
                            $('<div class="ue_lookup_th" thIdx="' + i + '" style="border-right:1px solid ' + c.headLineColor + ';width:' + (col.width - 5) + 'px;height:' + c.headHeight + 'px;line-height:' + c.headHeight + 'px;color:' + c.headColor + '">' + col.caption + '</div>').appendTo(this.theadDom);
                            this.lineWidth += col.visiable ? col.width : 0;
                        }
                    }
                } else {
                    this.columns = [];
                    for (var i in c.dataList[0]) {
                        var col = { field: i, caption: i, visiable: true };
                        col.width = col.width || c.columnDefWidth;
                        this.lineWidth += col.width;
                        this.columns.push(col);
                        $('<div class="ue_lookup_th" thIdx="' + i + '" style="border-right:1px solid ' + c.headLineColor + ';width:' + (col.width - 5) + 'px;height:' + c.headHeight + 'px;line-height:' + c.headHeight + 'px;color:' + c.headColor + '">' + col.caption + '</div>').appendTo(this.theadDom);
                    }
                }
                var ths = this.theadDom.find('.ue_lookup_th');
                if (this.lineWidth < (w + 10) && ths.length > 0) {
                    var ws = w + 10 - this.lineWidth, cs = Math.ceil(ws / ths.length, 10);
                    for (var i = 0; i < ths.length; i++) {
                        var th = $(ths[i]);
                        var idx = parseInt(th.attr('thIdx'), 10);
                        this.columns[idx].width += cs;
                        $(th).width(th.width() + cs);
                        this.lineWidth += cs;
                    }
                }
                c.valueField = c.valueField || this.fields[0];
                c.textField = c.textField || this.fields[0];
                tg.addClass('ue_lookup_select').css('background-position', (tg.outerWidth() - 16) + 'px ' + (tg.outerHeight() - 14) / 2 + 'px');
                tg.parent().css({ position: 'relative' });
                this.target = tg;
                this.list = c.dataList;
                this.frameDom = this.frameDom || $('<div class="ue_lookup_frame"></div>').insertAfter(tg);
                this.resizeDom = $('<div class="ue_lookup_resize">◢</div>').appendTo(this.frameDom);
                if (!c.isDropDownList) {
                    this.theadDom.appendTo(this.frameDom)
                }
                this.contentDom = $('<div class="ue_lookup_content"></div>').appendTo(this.frameDom);
                this.tableDom = $('<div class="ue_lookup_table"></table>').appendTo(this.contentDom);
                this.setPosition();
                var lkp = this;
                tg.val(c.defaultValue) || tg.text(c.defaultValue);
                tg.on('keyup', function (e) {
                    $(lkp).ActiveEvent();
                    e = e || window.event;
                    lkp.filterListByText($(this).val());
                }).on('blur', function (e) {
                    var obj = $(this);
                    lkp.frameDom.delay(500).queue(function () {
                        if (lkp.config.isBlurHide) {
                            !lkp.config.blurCallback || lkp.config.blurCallback(lkp.selectedRow);
                            obj.remove();
                        }
                        $(this).hide().dequeue();
                    });
                }).on('focus', function (e) {
                    $(lkp).ActiveEvent();
                    $('.ue_lookup_frame').hide();
                    if (lkp.config.setDataCallback) {
                        lkp.config.dataList = lkp.list = lkp.config.setDataCallback();
                    }
                    lkp.show();
                });
                this.contentDom.scroll(function () {
                    $(lkp).ActiveEvent();
                    lkp.theadDom.css({ left: -$(this).scrollLeft() });
                });
                this.resizeDom.off('mousedown').on('mousedown', function (e) {
                    $(lkp).ActiveEvent();
                    lkp.startResize = !lkp.startResize;
                });
            }
        };
        lookup.bind(target, config);
        return lookup;
    });

    $.fn.AddUELookup = function (config, callback) {
        if (!config.dataList) return false;
        config.callback = callback;
        var id = $(this).attr('id') || 'ue_lookup_container_' + UELookupList.length;
        $(this).attr('id', id);
        for (var i in UELookupList) {
            var item = UELookupList[i];
            if (item.target.attr('id') == id) {
                UELookupList.splice(i, 1);
                break;
            }
        }
        var o = UELookup($(this), config);
        UELookupList.push(o);
        return o;
    };
    $.fn.GetUELookup = function () {
        var id = $(this).attr('id');
        for (var idx in UELookupList) {
            var item = UELookupList[idx];
            if (item.target.attr('id') == id) {
                return item;
            }
        }
        return null;
    };
    /* lookup模块       ------ End   ------ */

    /* split模块        ------ Start ------ */
    window.UESplitList = [];
    'use strict';
    $.fn.AddUESplit = function (config) {
        var id = $(this).attr('id') || 'ue_split_container_' + UELookupList.length;
        $(this).attr('id', id);
        for (var i in UELookupList) {
            var item = UELookupList[i];
            if (item.parent.attr('id') == id) {
                UELookupList.splice(i, 1);
                break;
            }
        }
        var split = {
            resize: 0,
            prevWidth: 0,
            prevHeight: 0,
            nextWidth: 0,
            nextHeight: 0,
            splitWidth: 0,
            splitHeight: 0,
            parentWidth: 0,
            parentHeight: 0,
            defaultConfig: {
                showBorder: false,
                splitType: 's',
                splitWidth: 5,
                overHeight: 0,
                underHeight: 0,
                leftWidth: 0,
                rightWidth: 0,
                borderWidth: 1,
                borderColor: "#999",
            },
            mouseMove: function (e, t, k, d) {
                e.stopPropagation();
                if (d.resize == 1 && (d.x > 0 || d.y > 0)) {
                    var x = e.pageX - d.x, y = e.pageY - d.y, h = d.prevHeight + d.nextHeight, w = d.prevWidth + d.nextWidth;
                    if (d.config.splitType == 's') {
                        d.prevHeight += y;
                        d.nextHeight -= y;
                        if (d.nextHeight < 0) {
                            d.prevHeight = h;
                            d.nextHeight = 0;
                        }
                        if (d.prevHeight < 0) {
                            d.prevHeight = 0;
                            d.nextHeight = h;
                        }
                    } else {
                        d.prevWidth += x;
                        d.nextWidth -= x;
                        if (d.prevWidth < 0) {
                            d.prevWidth = 0;
                            d.nextWidth = w;
                        }
                        if (d.nextWidth < 0) {
                            d.nextWidth = 0;
                            d.prevWidth = w;
                        }
                    }
                    d.show();
                }
                d.x = e.pageX;
                d.y = e.pageY;
            },
            mouseUp: function (e, t, k, d) {
                d.resize = d.x = d.y = 0;
            },
            resize: function (w, h, k, d) {
                var s = $(d).GetUESplit();
                s.rework();
            },
            bindEvent:function(){
                var s = this;
                $(this).SetEvent('mousemove', this.mouseMove);
                $(this).SetEvent('mouseup', this.mouseMove);
                this.parent.SetEvent('resize', this.resize);
                this.splitDom.on('mousedown', function (e) {
                    $(s).ActiveEvent();
                    s.resize = 1;
                    s.x = s.y = 0;
                });
            },
            rework: function () {
                var c = this.config, r = c.borderWidth * 4 + c.splitWidth,
                    pw = this.parent[0].clientWidth, ph = this.parent[0].clientHeight;
                if (c.splitType == 's') {
                    this.splitHeight = c.splitWidth;
                    this.splitWidth = pw;
                    this.prevWidth = this.nextWidth = pw - c.borderWidth * 2;
                    if (this.prevHeight == this.nextHeight) {
                        var rh = parseInt((ph - r) / 2, 10);
                        this.prevHeight = this.nextHeight = rh;
                    } else {
                        this.prevHeight = parseInt(this.prevHeight * ph / this.parentHeight, 10);
                        this.nextHeight = ph - this.prevHeight - r;
                    }
                } else {
                    this.splitWidth = c.splitWidth;
                    this.splitHeight = ph;
                    this.prevHeight = this.nextHeight = ph - c.borderWidth * 2;
                    if (this.prevWidth == this.nextWidth) {
                        var rw = parseInt((pw - r) / 2, 10);
                        this.prevWidth = this.nextWidth = rw;
                    } else {
                        this.prevWidth = parseInt(this.prevWidth * pw / this.parentWidth, 10);
                        this.nextWidth = pw - this.prevWidth - r;
                    }
                }
                this.parentWidth = pw;
                this.parentHeight = ph;
                this.show();
            },
            show: function () {
                this.prevDom .css({ width: this.prevWidth,  height: this.prevHeight  });
                this.nextDom .css({ width: this.nextWidth,  height: this.nextHeight  });
                this.splitDom.css({ width: this.splitWidth, height: this.splitHeight });
            },
            init: function (p, f) {
                var i = UESplitList.length;
                var c = this.config = MergeJsonObj(this.defaultConfig, f);
                    r = c.borderWidth * 4 + c.splitWidth;
                this.parent = p;
                this.parent.css({position: 'relative', overflow: 'hidden', fontSize: 0 });
                this.prevDom  = c.prevDom || $('<div></div>').appendTo(p);
                this.nextDom  = c.nextDom || $('<div></div>').appendTo(p);
                this.prevDom.css({ display: 'inline-block', whiteSpace: 'normal' }).attr('splitId', i);
                this.nextDom.css({ display: 'inline-block', whiteSpace: 'normal' }).attr('splitId', i);
                if (c.showBorder) {
                    this.prevDom.css({ position: 'relative', border: c.borderWidth + 'px solid ' + c.borderColor });
                    this.nextDom.css({ position: 'relative', border: c.borderWidth + 'px solid ' + c.borderColor });
                } else {
                    c.borderWidth = 0;
                }
                if (c.splitType == 'w') {
                    this.parent.css({ whiteSpace: 'nowrap' });
                }else {
                    this.parent.css({ whiteSpace: 'normal' });
                }
                this.splitDom = this.splitDom || $('<div splitId="split_' + i + '" style="position:relative; display:inline-block; background-color:#eee; cursor:' + c.splitType + '-resize;"></div>').insertBefore(this.nextDom);
                this.rework();
                this.bindEvent();
            }
        }
        split.init($(this), config);
        UESplitList.push(split);
        return split;
    };
    $.fn.GetUESplit = function () {
        var id = $(this).attr('id');
        for (var idx in UESplitList) {
            var item = UESplitList[idx];
            if (item.parent.attr('id') == id) {
                return item;
            }
        }
        return null;
    };
    /* split            ------ End   ------ */

}());




短短三天,更新了30次。。。。现在是3.0版了。。。。。。

更新不下200次了。。。。

最后

以上就是含糊短靴为你收集整理的自己写的js插件,grid/lookup等,留存参考的全部内容,希望文章能够帮你解决自己写的js插件,grid/lookup等,留存参考所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(99)

评论列表共有 0 条评论

立即
投稿
返回
顶部