• 自己写的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" onload=""></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;100%;height:16px;line-height:16px;text-align:center;padding:2px;}'
        + '    .ue_pager_size {border:1px solid #999;height:12px;24px;margin:1px 0;float:left;}'
        + '    .ue_pager_sizes {border:1px solid #666;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;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,
                         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,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAMAAACHgmeRAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAlQTFRF7Rwk////////qOf6NAAAAAN0Uk5T//8A18oNQQAAACxJREFUeNpiYGRiYGICYkYgAlIQkhEkAmaBxBkgXIg6MMUIUkESiwmNBRBgACd2ALMRm0KHAAAAAElFTkSuQmCC',
                    },
                    style: function () {
                        return ''
            + '<style id="ue_grid_style">'
            + '   .ue_grid_container {padding:0;position:relative;}'
            + '   .ue_grid_click {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; 100%;height: 100%;}'
            + '   .ue_grid_scroll {overflow:hidden;auto;height:auto;position:relative;}'
            + '   .ue_grid_resize{position:absolute;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;3px;cursor:ew-resize;top:0;right:-1px;z-index:100;text-indent:-2px;}'
            + '   .ue_grid_table {overflow:hidden;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 {9px;cursor:pointer;}'
            + '   .ue_grid_thead_chk, .ue_grid_cell_chk{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 + ';' + (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 + ';' + (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 + ';' + (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;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({  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({  g.frameDom.width() + tx });
                                        g.contentDom.css({  g.contentDom.width() + tx });
                                    }
                                } else {
                                    if (g.frameDom.width() > 36) {
                                        g.frameDom.css({  g.frameDom.width() + (e.pageX - g.x) });
                                        g.contentDom.css({  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({  w - 2, height: h - 2 });
                        g.contentDom.css({  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({
                                                 $(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;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="100%px;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({  '12px', opacity: 1 });
                        }).off('mouseleave').on('mouseleave', function (e) {
                            e = e || window.event;
                            e.stopPropagation();
                            $(g).ActiveEvent();
                            $(this).find('.ue_grid_ts').css({  '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({  this.lineWidth });
                            this.theadDom.css({  this.lineWidth });
                            this.tableDom.css({  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({  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="' + (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 {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; 100%;height: 100%;}'
    + '   .ue_lookup_resize{position:absolute;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;auto;}'
    + '   .ue_lookup_th {background-color: transparent;overflow: hidden;display: inline-block;float:left;padding:0 2px;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 + ';' + (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({  this.lineWidth, height: list.length * c.lineHeight });
                        this.contentDom.css({  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({  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({  d.frameDom.width() + tx });
                                    d.contentDom.css({  d.contentDom.width() + tx });
                                }
                            } else {
                                if (d.frameDom.width() > 36) {
                                    d.frameDom.css({  d.frameDom.width() + (e.pageX - d.x) });
                                    d.contentDom.css({  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 + ';' + (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 + ';' + (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({  this.prevWidth,  height: this.prevHeight  });
                    this.nextDom .css({  this.nextWidth,  height: this.nextHeight  });
                    this.splitDom.css({  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次了。。。。

  • 相关阅读:
    图片压缩后,依然很大的解决方案
    怎么使用javascript实现类的功能
    javascript实现像java、c#之类的sleep暂停的函数功能
    用ajax和asp.net实现智能搜索功能
    insert into 和insert into select性能比较
    百度编辑器
    document.selection.createRange()
    CSS设置透明效果
    class中一个小技巧
    asp.net中 解析JSON
  • 原文地址:https://www.cnblogs.com/foren/p/6009089.html
Copyright © 2020-2023  润新知