| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822 | Namespace.register("U.UF.E");//初始化table/***  表格总接口* range为编辑器的光标对象*/U.UF.E.table = function (range) {    var _p,        _inputo,        _inputt,        _frag = $$("frag"),        _table = U.UF.E.table;  //简写命名空间    _table._range = range;    _p = $$("p", { "style": { "cssText": "text-align: left;font-weight: bold;padding: 10px 0 0 15px;" }, "innerHTML": "表格尺寸: " }, _frag);    _p = $$("p", { "style": { "cssText": "text-align: left;margin-top: 15px;font-size: 14px;padding-left: 30px;" }, "innerHTML": "列数: " }, _frag);    _inputo = $$("input", { "type": "number", "style": { "cssText": "width: 80px;margin-left: 65px;" }, "min": "1" }, _p);    _p = $$("p", { "style": { "cssText": "text-align: left;padding-left: 30px;margin-top: 15px;font-size: 14px;margin-bottom: 22px;" }, "innerHTML": "行数: " }, _frag);    _inputt = $$("input", { "type": "number", "style": { "cssText": "width: 80px;margin-left: 65px;" }, "min": "1" }, _p);    //弹出框的html代码    U.UF.UI.confirm(_frag, function () {    //弹框输入 行 和 列        var _row = _inputo.value;   //行        var _col = _inputt.value;   //列        if (_row >= 1 && _col >= 1) {   //如果 行和列的值大于1 则添加表格            _table.addTable(_row, _col);        }    });    U.selectEl(document).unbind('mousedown', U.UF.E.table.removeFocus); //先取消事件监听 在添加 防止重复绑定    U.selectEl(document).bind('mousedown', U.UF.E.table.removeFocus); //添加点击时的聚焦效果 并且若存在textarea元素 则删除并获取textarea的值给td};//初始化整理table,功能作用: 给外部添加的table元素添加样式和事件U.UF.E.table.load = function (tableel) {    var _table = U.UF.E.table;  //简写命名空间    var _tableEl = tableel;    if (_tableEl.features) return;  //如果已初始化 则直接返回    _tableEl.features = true;   //代表已初始化过    var _pelDiv = _tableEl.parentNode;  //父节点的初始化    var _allTd = _tableEl.querySelectorAll("td");    _allTd.forEach(function (v) {   /*删除所有display为none的dt元素*/        U.selectEl(v).rmAttr("width");        var _value = U.selectEl(v).css("display");        if (_value === "none") {            v.remove();        }    });    _pelDiv.style.cssText = "overflow-y:hidden;padding-bottom:5px;padding-right:7px;";   //_div的样式    _tableEl.style.cssText = _tableEl.style.cssText + "border-spacing: 0;border-collapse: collapse;position: relative;";    _tableEl.contentEditable = "false";    _table.tableOver(_tableEl);  //添加选中选出事件 防止选中td时 选中外面的元素 而报错    var _trList = _tableEl.querySelectorAll("tr");    var _tdList = U.selectEl(_tableEl).find("td");    //列拉升处理    for (var i = 0; i < _tdList.length; i++) {        var _tdCopy = _tdList[i];        _tdCopy.contentEditable = "true";        _tdCopy.style.cssText += ";outline:0;box-sizing:border-box;position:relative;padding:0px;border:2px solid #333;" //这样子写csstext不会给覆盖        var _tdWidth = _tdCopy.clientWidth;        _tdCopy.style.width = _tdWidth + "px";    //给td添加width        _table.loadCell(_tdCopy); //初始有合并单元格 的情况        var _colRule = $$("div", { "style": { "outline": "0", "zIndex": "1", "position": "absolute", "top": 0, "right": 0, "cursor": "col-resize", "width": "3px", "height": "100%" }, "tabindex": "0", "contenteditable": "false", "className": "U_MD_O_W_Table_colRule", "inline": true }, _tdCopy); //列尺        _table.colExpanding(_colRule); //给列尺 添加左右拉伸事件        _table.dragCheckd(_tdCopy);    //td拖拽的选中事件        _table.rightClick(_tableEl);    //添加右键    }    //行拉升处理    for (var i = 0; i < _trList.length; i++) {        var _trEl = _trList[i];        _trEl.style.cssText += ";position:relative;overflow:hidden;";        var _rowRule = $$("div", { "style": { "outline": "0", "zIndex": "1", "position": "absolute", "left": 0, "margin-top": _trEl.clientHeight + "px", cursor: "row-resize", height: "3px", width: "100%" }, tabindex: "0", "contenteditable": "false", "className": "U_MD_O_W_Table_rowRule", "inline": true }, _trEl); //行尺        _table.rowExpanding(_rowRule);  //行尺 上下拉伸事件    };}/*** 初始有合并单元格 的情况* tdEl td元素*/U.UF.E.table.loadCell = function (tdEl) {    var _table = U.UF.E.table;  //简写命名空间    var _tableEl = _table.parentSelect(tdEl, "table");   //获取table元素    var _colSpan = tdEl.colSpan - 1;   //跨了_colSpan列    var _rowSpan = tdEl.rowSpan - 1;  //跨了_rowSpan行    if (_colSpan >= 1) {        for (var i = 0; i < _colSpan; i++) {            var _newTd = $$("td");            _newTd.style.display = "none";            _table.After(tdEl, _newTd);        }    }    if (_rowSpan >= 1) {        var _tdIndex = _table.index(tdEl);       //获取该td的所在索引        var _trIndex = _table.index(tdEl.parentNode);  //获取该行tr所在位置        var _trList = _tableEl.querySelectorAll("tr"); //获取所有的tr        for (var i = 1; i <= _rowSpan; i++) {    //获取该tr的下_rowSpan个tr            var _tdList = _trList[_trIndex + i].querySelectorAll("td"); //获取该tr的所有td            var _td = _tdList[_tdIndex - 1];            for (var j = 0; j <= _colSpan; j++) {                var _newTd = $$("td");                _newTd.style.display = "none";                _table.After(_td, _newTd);            }        }    }}/*** 创建表格* @param row   表格的行* @param col   表格的列*/U.UF.E.table.addTable = function (row, col) {    var i, j, _tr, _td,        _frag = $$("frag"),        _pel = U.UF.E.table.createTablePel(),  //table父节点        _table = $$("table", { style: { cssText: "border-spacing: 0;border-collapse: collapse;width: 100%;position: relative;table-layout:fixed;"} }, _pel),        _tbody = $$("tbody", {}, _table),        _width = Math.max(Math.floor(_table.clientWidth / col), 50)    ;    // var _width = Math.max(Math.floor(_table.clientWidth / col), 50);    //循环创建tr td    for (i = 0; i < row; i++) {        _tr = $$("tr", {}, _frag);  //创建tr        for (j = 0; j < col; j++) {            _td = $$("td", { style: { width: _width + "px" }, "innerHTML": "<br />" }, _tr);        }    }    _tbody.appendChild(_frag);    //修改    U.UF.E.table.load(_table);};/*** 换行并返回该行的div 然后在该行下面创建空div(防止表格后无法聚焦)* return 创建表格的div(父节点)*/U.UF.E.table.createTablePel = function () {    var _table = U.UF.E.table;    //console.log(_table._range);    var _range = U.UF.E.table._range,   //获取光标        _div = U.UF.E.getLineElement(_range.startContainer);    //获取光标所在行的div    if (_div.textContent !== "") {   //如果该行有内容 则新建一行div        var _div = U.selectEl("#" + U.UF.E.key.addLine(_range).addLine)[0];    }    //   U.selectEl(_div).attr("contenteditable", "false");    //无内容的div(表格的父节点) 取消编辑效果    _div.style.cssText = "overflow-y:hidden;padding-bottom:5px;padding-right:7px;width:90%";   //_div的样式    U.UF.E.key.addLine(_range);   //在表格的父节点下添加div 防止无法聚焦    _table.placeCaretAtEnd(_div);    return _div;};/*** 将表格的第一个tr里的所有列尺元素 添加 zindex为1 的样式* tableEl 表格元素*/U.UF.E.table.firstLinePeak = function (tableEl) {    U.selectEl(tableEl).find(".U_UF_E_Table_peak").css("height", 0);  //原来有列尺的元素高度清0    U.selectEl(tableEl).find(".U_UF_E_Table_peak").removeClass("U_UF_E_Table_peak");  //改变 删除所有列尺的zIndex为1的样式    var _height = tableEl.clientHeight;  //获取表格的高    var _colRuleList = tableEl.querySelectorAll("tr")[0].querySelectorAll(".U_MD_O_W_Table_colRule"); //获取第一行的列尺    for (var i = 0, len = _colRuleList.length; i < len; i++) {        var _colRule = _colRuleList[i];        _colRule.style.height = _height + "px"; //所有列尺的高等于表格的高        U.selectEl(_colRule).addClass("U_UF_E_Table_peak");    }};/**** @param table 防止选中事件时选中到表格外的元素而报错*/U.UF.E.table.tableOver = function (table) {    U.selectEl(table).bind('mouseover', function () {    //判断鼠标是否在该table里 如果在 才可以选择区域        this.over = true;    });    U.selectEl(table).bind('mouseout', function () {        this.over = false;    });};/**** @param colrule 列尺(div) 添加左右拉伸事件*/U.UF.E.table.colExpanding = function (colrule) {    var _div = colrule;    U.selectEl(_div).bind({        'mousedown': function (e) {            U.selectEl("#U_UF_EL_rightmenu")[0] && U.selectEl("#U_UF_EL_rightmenu")[0].remove();    //删除右键元素            U.UF.EV.stopBubble(e);                                    //阻止冒泡            this.style.backgroundColor = "#8cb3e0"; //修改列尺(div)的颜色            var _table = U.UF.E.table;            var _this = this;            var _tdEl = this.parentNode;  //获取td(每个列对应一个td父节点)            var _tableEl = _table.parentSelect(this, "table");    //获取所在的table            var _tableElWidth = _tableEl.clientWidth;       //table当前的宽度            var _trList = _tableEl.querySelectorAll("tr");    //获取所有的tr            var _tdElIndex = _table.index(_tdEl);  //获取td在tr的索引位置(列)            var _dis,   //移动的距离                _disX;   //移动后的位置            var _oMouseX = e.pageX;                                   //获取鼠标按下时的X坐标            var _oX = parseInt(this.style.right);               //获取当前Left坐标            var expandingMove = function (e) {                      //拖拽时移动用的函数                U.UF.EV.stopDefault(e);                               //取消默认拖拽                var _mouseX = e.pageX;                                //鼠标移动时的x坐标                _dis = _mouseX - _oMouseX;                            //移动的距离                _disX = _dis + _oX;                                   //移动后的位置                U.selectEl(_this).css("right", -_disX + "px");             //同步当前的left            };            var expandingUp = function () {                  //拖拽时松开用的函数                _this.style.backgroundColor = "";   //列尺颜色 变为空                var _child;                for (var i = 0, len = _trList.length; i < len; i++) {                    var _colTdEl = U.selectEl("td", _trList[i])[_tdElIndex];   //列的td _trList[i].querySelectorAll("td")                    _colTdEl.style.width = _colTdEl.offsetWidth + _disX + "px";    //同步宽度                    var _colRule = _colTdEl.querySelectorAll('.U_MD_O_W_Table_colRule');    //该td对应的列尺                    U.selectEl(_colRule).css("right", "0px"); //同步当前的left                    _child = U.selectEl("div", _trList[i]);                    _child[_child.length - 1].style.marginTop = _trList[i].offsetHeight + "px";                }                U.selectEl(document).unbind('mousemove', expandingMove);                U.selectEl(document).unbind('mouseup', expandingUp);            };            U.selectEl(document).bind('mousemove', expandingMove);            U.selectEl(document).bind('mouseup', expandingUp)        },        'dblclick': function (e) {            U.UF.EV.stopBubble(e);                                    //阻止冒泡        },   //阻止td的双击        'mousemove': function (e) {            U.UF.EV.stopBubble(e);                                    //阻止冒泡            U.UF.EV.stopDefault(e);                                //取消默认拖拽        }    });};/**** @param rowrule 行尺(div) 添加上下拉伸事件*/U.UF.E.table.rowExpanding = function (rowrule) {   //高度扩张    var _div = rowrule;    U.selectEl(_div).bind({        'mousedown': function (e) {            U.selectEl("#U_UF_EL_rightmenu")[0] && U.selectEl("#U_UF_EL_rightmenu")[0].remove();    //删除右键元素            this.style.backgroundColor = "#8cb3e0";            U.UF.EV.stopBubble(e);                                     //阻止冒泡            var _oMouseY = e.pageY;                                    //获取鼠标按下时的Y坐标            var _this = this;            var _oY = parseInt(this.style.marginTop);                 //获取当前Top坐标            var _trEl = this.parentNode;                                //获取tr            var expandingMove = function (e) {                           //拖拽时移动用的函数                U.UF.EV.stopDefault(e);                                //取消默认拖拽                var _mouseY = e.pageY;                                 //鼠标移动时的Y坐标                var _dis = _mouseY - _oMouseY + _oY;                   //移动的距离                _dis = Math.max(30, _dis);                              //拉伸后的tr的高度不能小于30px                _trEl.style.height = _dis + "px";                var clienHeight = _trEl.clientHeight; //tr的高度 会根据内容有个最小值 因此 这个tr最后的高度 才是最终值                _dis = Math.max(clienHeight, _dis);                _trEl.style.height = _dis + "px";                U.selectEl(_this).css("margin-top", _dis + "px");            };            var expandingUp = function () {                  //拖拽时松开用的函数                var _table = U.UF.E.table;  //简写命名空间                    var _tableEl = _table.parentSelect(_this, "table");  //获取table元素                _table.firstLinePeak(_tableEl); //更新第一行的列尺高度                _this.style.backgroundColor = "";                U.selectEl(document).unbind('mousemove', expandingMove);                U.selectEl(document).unbind('mouseup', expandingUp);            };            U.selectEl(document).bind('mousemove', expandingMove);            U.selectEl(document).bind('mouseup', expandingUp)        },        'mousemove': function (e) {            U.UF.EV.stopBubble(e);                                    //阻止冒泡            U.UF.EV.stopDefault(e);                                //取消默认拖拽        }    });};/** 添加文本框 并给文本框添加事件* parent td元素(文本框父元素)* text 为文本 可要可不要*/U.UF.E.table.createTextArea = function (parent, text) {    var _textArea = $$("textarea", { className: "U_UF_E_Table_tdText", value: text || "", contenteditable: "true", inline: true }, parent);   //添加textarea 并且将td的内容放入textarea    U.selectEl(_textArea).bind('mousedown', function (e) {        U.selectEl("#U_UF_EL_rightmenu")[0] && U.selectEl("#U_UF_EL_rightmenu")[0].remove();    //删除右键元素              //阻止冒泡    }); //阻止td的冒泡 (选中效果 和 聚焦效果)    var autoHeight = function (el) {  //表格自动适应高        el.nodeType === 1 ? "" : el = el.target;    //el只能为textarea        el.scrollHeight ? el.style.height = el.scrollHeight + "px" : "";   //此处为textarea的高度跟随文字输入的内容自动增高        var _rowRuleList = U.selectEl(".U_MD_O_W_Table_rowRule");   //获取所有行尺        for (var i = 0, len = _rowRuleList.length; i < len; i++) {            var _trPel = _rowRuleList[i].parentNode;    //每个行尺 对应一个 tr元素            _trPel.style.height = _trPel.clientHeight;  //使每个tr的height 等于 clientHeight            U.selectEl(_rowRuleList[i]).css("margin-top", _trPel.clientHeight + "px");    //同步margintop 的位置        }    };    autoHeight(_textArea);  //由于textarea输入自后td的高度会变化 因此所有行尺的位置重新定位    U.selectEl(_textArea).bind('keydown', autoHeight);    //键盘监听 自动适应高    U.selectEl(_textArea).bind('keyup', autoHeight);  //键盘监听 自动适应高    U.selectEl(_textArea).bind('blur', function () {        var _textla = U.selectEl(".U_UF_E_Table_tdText");        var _tdEl = U.selectEl(".U_UF_E_Table_tdText")[0].parentNode;        _tdEl.innerText = _textla[0].value;        _textla.remove();    });}/**** @param td 添加鼠标拖拽效果的 td* 给td添加鼠标拖拽的选中效果*/U.UF.E.table.dragCheckd = function (td) {    var _tdEl = td;    U.selectEl(_tdEl).bind('mousedown', function (e) {        U.UF.EV.stopBubble(e); //阻止冒泡        U.selectEl("#U_UF_EL_rightmenu")[0] && U.selectEl("#U_UF_EL_rightmenu")[0].remove(); //删除右键元素        if (e.button != 2) {            var _table = U.UF.E.table;            //移除原本选中的效果            U.selectEl(".U_UF_E_Table_tdCheckd").removeClass("U_UF_E_Table_tdCheckd");            U.selectEl(".U_UF_E_Table_tdCurrent").removeClass("U_UF_E_Table_tdCurrent");            //给td添加聚焦样式            U.selectEl(this).addClass("U_UF_E_Table_tdCurrent");            var _start = this; //获取点击元素            var _startX = _table.index(_start); //记录x坐标轴            var _startY = _table.index(this.parentNode);   //获取y坐标轴            var _checkFlag = true;   //注意下面的_table.over是一个属性 防止选中区域在表格外面            var _tableEl = _table.parentSelect(this, "table");    //获取父节点table            //拖拽时移动用的函数            var _drapMove = function (e) {                var tagEl = e.path.filter(_filter)[0];                if (tagEl) {                    U.UF.EV.stopBubble(e); //阻止冒泡                    if (!(_tableEl.over) || (tagEl === _start && _checkFlag)) return;    //此处防止选中table外元素 与 鼠标必须选中两个td才会有选中效果                    _checkFlag = false;  //如果不同 则选中过两个元素                    var _endX = _table.index(tagEl);   //结束点的x坐标                    var _endY = _table.index(tagEl.parentNode); //结束点的y坐标                    U.selectEl(".U_UF_E_Table_tdCheckd").removeClass("U_UF_E_Table_tdCheckd");                    _table.tdAddClass(tagEl.parentNode, _startX, _startY, _endX, _endY);   //给开始点和结束点组成的矩形 添加选中的class                }            };            var _dragUp = function () { //拖拽时松开用的函数                U.selectEl(document).unbind('mousemove', _drapMove);                U.selectEl(document).unbind('mouseup', _dragUp);                _checkFlag = true;            };            var _filter = function (el) {                return el.nodeName && el.nodeName === "TD"            }            U.selectEl(document).bind('mousemove', _drapMove);            U.selectEl(document).bind('mouseup', _dragUp);        }    });};/***  添加右键*  tableEl 表格元素*/U.UF.E.table.rightClick = function (tableEl) {    var _table = U.UF.E.table;    var leftAddCol = {        innerHTML: '左侧添加列',        onclick: function () {            _table.addColumn("left");            U.selectEl("#U_UF_EL_rightmenu")[0] && U.selectEl("#U_UF_EL_rightmenu")[0].remove();    //删除右键元素        },        onmousedown: function (e) {            U.UF.EV.stopBubble(e);                                    //阻止冒泡        }    };    var rightAddCol = {        innerHTML: '右侧添加列',        onclick: function () {            _table.addColumn("right");            U.selectEl("#U_UF_EL_rightmenu")[0] && U.selectEl("#U_UF_EL_rightmenu")[0].remove();    //删除右键元素        },        onmousedown: function (e) {            U.UF.EV.stopBubble(e);                                    //阻止冒泡        }    };    var upAddLine = {        innerHTML: '向上添加行',        onclick: function () {            _table.addTr("up");            U.selectEl("#U_UF_EL_rightmenu")[0] && U.selectEl("#U_UF_EL_rightmenu")[0].remove();    //删除右键元素        },        onmousedown: function (e) {            U.UF.EV.stopBubble(e);                                    //阻止冒泡        }    };    var downAddLine = {        innerHTML: '向下添加行',        onclick: function () {            _table.addTr("down");            U.selectEl("#U_UF_EL_rightmenu")[0] && U.selectEl("#U_UF_EL_rightmenu")[0].remove();    //删除右键元素        },        onmousedown: function (e) {            U.UF.EV.stopBubble(e);                                    //阻止冒泡        }    };    var removeCol = {        innerHTML: '删除列',        onclick: function () {            _table.removeColumn();            U.selectEl("#U_UF_EL_rightmenu")[0] && U.selectEl("#U_UF_EL_rightmenu")[0].remove();    //删除右键元素        },        onmousedown: function (e) {            U.UF.EV.stopBubble(e);                                    //阻止冒泡        }    };    var removeLine = {        innerHTML: '删除行',        onclick: function () {            _table.removeTr();            U.selectEl("#U_UF_EL_rightmenu")[0] && U.selectEl("#U_UF_EL_rightmenu")[0].remove();    //删除右键元素        },        onmousedown: function (e) {            U.UF.EV.stopBubble(e);                                    //阻止冒泡        }    };    var mergeCells = {        innerHTML: '合并单元格',        onclick: function () {            _table.mergeCells();            U.selectEl("#U_UF_EL_rightmenu")[0] && U.selectEl("#U_UF_EL_rightmenu")[0].remove();    //删除右键元素        },        onmousedown: function (e) {            U.UF.EV.stopBubble(e);                                    //阻止冒泡        }    };    var _arr = [leftAddCol, rightAddCol, upAddLine, downAddLine, removeCol, removeLine, mergeCells];    U.selectEl(tableEl).bind('contextmenu', function (e) {        U.UF.EV.stopBubble(e);                                    //阻止冒泡        U.UF.EV.stopDefault();        U.UF.EL.rightMenu(_arr, tableEl);        U.selectEl("#U_UF_EL_rightmenu").bind('contextmenu', function (e) {   //右键元素属于table 因此需要阻止冒泡            U.UF.EV.stopBubble(e);                                    //阻止冒泡        });    });    U.selectEl(tableEl).bind('mousedown', function (e) {        U.selectEl("#U_UF_EL_rightmenu")[0] && U.selectEl("#U_UF_EL_rightmenu")[0].remove();    //删除右键元素    });};/**** @param direction 参数为 "left" 或 "right"* 左右侧添加列*/U.UF.E.table.addColumn = function (direction) {    var _table = U.UF.E.table;    var tdList = U.selectEl(".U_UF_E_Table_tdCheckd");    if (!tdList[0]) { //如果没有 选中的td        if ($(".U_UF_E_Table_tdCurrent")[0]) { //再判断 有无聚焦的 td            tdList = U.selectEl(".U_UF_E_Table_tdCurrent");        } else {            return; //如果没有 则直接返回        }    }    var _tdEl;    if (direction === "left") {        _tdEl = tdList[0];    } else if (direction === "right") {        _tdEl = tdList[tdList.length - 1];    }    _table.insertTd(_tdEl, direction);};/**** @param td  td元素* @param direction  供添加左右列用的api 参数为 "left" 或 "right"* 向每个tr的列(td) 前方或后方插入td*/U.UF.E.table.insertTd = function (td, direction) {    var _table = U.UF.E.table;    var _tdEl = td,            _index = _table.index(_tdEl),    //在tr中位于所有td的位置            _dir = direction;    var _tableEl = _table.parentSelect(_tdEl, 'table');    var _trList = U.selectEl(_tableEl).find("tr");    var _tableElWidth = _tableEl.offsetWidth; //记住当前的宽度    for (var i = 0, len = _trList.length; i < len; i++) {  //遍历每个tr的列(td) 在前方或后方插入td        var _currentColumn = U.selectEl(_trList[i]).find("td")[_index];    //当前列        var _tdElClone = _tdEl.cloneNode(); //克隆td        if (_dir === "left") {            _table.Before(_currentColumn, _tdElClone);    //在列的前面添加td        }        else if (_dir === "right") {            _table.After(_currentColumn, _tdElClone); //在列的后面添加td        }        var _colRule = $$("div", { style: { position: "absolute", top: 0, left: "-7px", "margin-left": _tdElClone.style.width, cursor: "col-resize", width: "7px" }, className: "U_MD_O_W_Table_colRule", inline: true }, _tdElClone); //列尺        _table.colExpanding(_colRule); //添加左右拉伸事件        _table.createTextArea(_tdElClone); //添加文本框        _table.dragCheckd(_tdElClone);    //td拖拽的选中事件        U.selectEl(_tdElClone).removeClass("U_UF_E_Table_tdCheckd"); //清楚添加后的列的选中的样式        U.selectEl(_tdElClone).removeClass("U_UF_E_Table_tdCurrent");    }    _tableEl.style.width = _tableElWidth + _tdEl.offsetWidth + "px";    _table.firstLinePeak(_tableEl);    //第一行tr的所有列尺添加zIndex为1};/**** @param direction 参数为 "up" 或 "down"* 上下添加行*/U.UF.E.table.addTr = function (direction) {    var _table = U.UF.E.table;    var tdList = U.selectEl(".U_UF_E_Table_tdCheckd");    if (!tdList[0]) { //如果没有 选中的td        if ($(".U_UF_E_Table_tdCurrent")[0]) { //再判断 有无聚焦的 td            tdList = U.selectEl(".U_UF_E_Table_tdCurrent");        } else {            return; //如果没有 则直接返回        }    }    var _trEl, _trElClone;    if (direction === "up") {        _trEl = tdList[0].parentNode;        _trElClone = _table.cloneTr(_trEl); //克隆tr 并给td 添加表格事件        _table.Before(_trEl, _trElClone);    } else if (direction === "down") {        _trEl = tdList[tdList.length - 1].parentNode;    //向下插入行        _trElClone = _table.cloneTr(_trEl); //克隆tr 并给td 添加表格事件        _table.After(_trEl, _trElClone);    }    var _tableEl = _table.parentSelect(tdList[0], 'table');    _table.firstLinePeak(_tableEl);    //将表格的第一个tr里的所有列尺元素 添加 zindex为1 的样式};/***  删除行*/U.UF.E.table.removeTr = function () {    var _table = U.UF.E.table;    var tdList = U.selectEl(".U_UF_E_Table_tdCheckd");    if (!tdList[0]) { //如果没有 选中的td        if ($(".U_UF_E_Table_tdCurrent")[0]) { //再判断 有无聚焦的 td            tdList = U.selectEl(".U_UF_E_Table_tdCurrent");        } else {            return; //如果没有 则直接返回        }    }    var start = _table.index(tdList[0].parentNode);    var end = _table.index(tdList[tdList.length - 1].parentNode);    var _tableEl = _table.parentSelect(tdList[0], "table");    var _parentDiv = _table.parentSelect(_tableEl, "div");    var _trList = U.selectEl(_tableEl).find("tr");    for (var i = start; i <= end; i++) {        _trList[i].remove();    }    if (!(_tableEl.querySelectorAll("tr").length)) {        _parentDiv.remove();        return    }    _table.firstLinePeak(_tableEl);    //将表格的第一个tr里的所有列尺元素 添加 zindex为1 的样式};/**** @param tr 需要克隆的tr* 克隆tr 并添加表格事件*/U.UF.E.table.cloneTr = function (tr) {    var _table = U.UF.E.table;    var _trNodes = tr.cloneNode(true); //带子节点的tr    var _trClone = tr.cloneNode();  //无子节点的tr    var _cloneTd = U.selectEl(_trNodes).find("td");    for (var i = 0, len = _cloneTd.length; i < len; i++) {        var _td = _cloneTd[i].cloneNode();        U.selectEl(_td).rmAttr("rowspan");   //删除跨行的属性        _trClone.appendChild(_td);        var _colRule = $$("div", { style: { position: "absolute", top: 0, left: "-7px", "margin-left": _td.style.width, cursor: "col-resize", width: "7px" }, className: "U_MD_O_W_Table_colRule", inline: true }, _td); //列尺        _table.colExpanding(_colRule); //添加左右拉伸事件        //_table.tdDbClick(_td); //添加双击事件        _table.createTextArea(_td);        _table.dragCheckd(_td);    //td拖拽的选中事件    }    var _rowRule = $$("div", { style: { position: "absolute", zIndex: "1", left: 0, "margin-top": "30px", cursor: "row-resize", height: "3px", width: "100%" }, className: "U_MD_O_W_Table_rowRule", inline: true }, _trClone); //行尺    _table.rowExpanding(_rowRule);  //上下拉伸事件    U.selectEl(_trClone).find(".U_UF_E_Table_tdCheckd").removeClass("U_UF_E_Table_tdCheckd");    //删除所有选中表格和 聚焦表格的样式    U.selectEl(_trClone).find(".U_UF_E_Table_tdCurrent").removeClass("U_UF_E_Table_tdCurrent");    return _trClone;};/***  合并单元格功能*/U.UF.E.table.mergeCells = function () {    var _table = U.UF.E.table;    var _tdList = U.selectEl(".U_UF_E_Table_tdCheckd");    if (_tdList.length <= 1) return;    var _x1 = _table.index(_tdList[0]);  //x坐标开始点    var _y1 = _table.index(_tdList[0].parentNode); //y坐标开始点    var _x2 = _table.index(_tdList[_tdList.length - 1]); //x坐标结束点    var _y2 = _table.index(_tdList[_tdList.length - 1].parentNode);  //y坐标结束点    var _tableEl = _table.parentSelect(_tdList[0], "table");    //获取table元素    var _trList = _tableEl.querySelectorAll("tr");  //获取table里所有tr    var _text = "";     //合并后的总内容    var allWidth = 0;   //合并后的总宽度    for (var i = _y1; i <= _y2; i++) {  /*该循环*/        var _trAllTd = _trList[i].querySelectorAll("td"); //获取选中表格的所在tr        for (var j = _x1; j <= _x2; j++) { // 获取选中表格的 所在td            var _tdEl = _trAllTd[j];    //获取每个选中的单元格            _text += _tdEl.innerText;   //合并内容            if (i === _y1) { //只计算选中表格第一行 的总宽度                allWidth += _tdEl.offsetWidth;            }            if (i === _y1 && j === _x1) continue;    //第一个td就跳过 其他的则display为 none            U.selectEl(_tdEl).css("display", "none");        }    }    var _textNode = document.createTextNode(_text); //文字节点 _text为总内容    var _firstNode = _table.getFirstText(_tdList[0]);   //获取被合并单元格的td所在的文字节点    _firstNode ? _firstNode.remove() : ""; //如果存在文字节点 则删除    _tdList[0].appendChild(_textNode); //然后将新创建的总文字节点 添加到该单元格里    _tdList[0].style.width = allWidth + "px"; //添加总宽度    var _col = U.selectEl(_tdList[0]).attr("colspan");    _col <= _x2 - _x1 + 1 ? U.selectEl(_tdList[0]).attr("colspan", _x2 - _x1 + 1) : ""; //跨的列数    U.selectEl(_tdList[0]).attr("rowspan", _y2 - _y1 + 1); //跨的行数    U.selectEl(_tdList[0].querySelector(".U_MD_O_W_Table_colRule")).css("margin-left", allWidth + 'px');   //更新 列尺的位置    _table.firstLinePeak(_tableEl);    //将表格的第一个tr里的所有列尺元素 添加 zindex为1 的样式};/*** 删除列*/U.UF.E.table.removeColumn = function () {    var _table = U.UF.E.table    var tdList = U.selectEl(".U_UF_E_Table_tdCheckd");    if (!tdList[0]) { //如果没有 选中的td        if ($(".U_UF_E_Table_tdCurrent")[0]) { //再判断 有无聚焦的 td            tdList = U.selectEl(".U_UF_E_Table_tdCurrent");        } else {            return; //如果没有 则直接返回        }    }    var _start = _table.index(tdList[0]);  //列的开始位置    var _end = _table.index(tdList[tdList.length - 1]); //列的结束位置    var _tableEl = _table.parentSelect(tdList[0], 'table');    var _trList = U.selectEl(_tableEl).find("tr");    var _widthSum = 0;  //删除列的总宽    for (var i = 0, len = _trList.length; i < len; i++) {        var _tdList = U.selectEl(_trList[i]).find("td");        for (var j = _start; j <= _end; j++) {            i === 0 ? _widthSum += _tdList[j].offsetWidth : "";    //只计算第一行删除的列宽            _tdList[j].remove();        }    }    _tableEl.style.width = _tableEl.offsetWidth - _widthSum + "px";    var _tdLen = _tableEl.querySelectorAll("td").length;  //获取当前列的长度    if (!_tdLen) {    //如果table不存在td 则删除table和 table父节点(div)        var _parentDiv = _table.parentSelect(_tableEl, "div");        _parentDiv.remove();        return    }    _table.firstLinePeak(_tableEl);    //将表格的第一个tr里的所有列尺元素 添加 zindex为1 的样式};/*** 添加点击时的聚焦效果 并且若存在textarea元素 则删除并获取textarea的值给td*/U.UF.E.table.removeFocus = function () {        //添加点击时的聚焦效果 并且若存在textarea元素 则删除并获取textarea的值给td    U.selectEl(".U_UF_E_Table_tdCheckd").removeClass("U_UF_E_Table_tdCheckd");    U.selectEl(".U_UF_E_Table_tdCurrent").removeClass("U_UF_E_Table_tdCurrent");    return;    var _textArea = U.selectEl(".U_UF_E_Table_tdText")[0],        //如果存在textarea元素 则将其变为文本            _pel;    _textArea ? _pel = _textArea.parentNode : ""; //如果textArea存在 先获取父节点td 然后将其变为文本    if (_pel) {        var _textNode = document.createTextNode(_textArea.value);        _pel.appendChild(_textNode);        _textArea.remove();    }    var _rowRuleList = U.selectEl(".U_MD_O_W_Table_rowRule"); //使div的margintop 及时更新    for (var i = 0, len = _rowRuleList.length; i < len; i++) {        var _trEl = _rowRuleList[i].parentNode;        _trEl.style.height = _trEl.clientHeight;        U.selectEl(_rowRuleList[i]).css("margin-top", _trEl.clientHeight + "px");    }};/**** @param tr 获取所有tr用的(遍历所有tr)* @param x1 开始点x坐标* @param y1 开始点y坐标* @param x2 结束点x坐标* @param y2 结束点y坐标*/U.UF.E.table.tdAddClass = function (tr, x1, y1, x2, y2) {   //获取首尾坐标轴 最后组成矩形 然后添加选中的class    var _trList = tr.parentNode.querySelectorAll("tr");    var _x1 = Math.min(x1, x2);    var _x2 = Math.max(x1, x2);    var _y1 = Math.min(y1, y2);    var _y2 = Math.max(y1, y2);    for (var i = _y1; i <= _y2; i++) {        var _tdList = _trList[i].querySelectorAll("td");        for (var j = _x1; j <= _x2; j++) {            U.selectEl(_tdList[j]).addClass("U_UF_E_Table_tdCheckd");        }    }}/**** @param el 元素* @returns {number} 返回当前元素在所有同类型元素 的第几个位置*/U.UF.E.table.index = function (el) {    var _el = el;    var _name = _el.nodeName;   //获取该元素的节点名    var _list = _el.parentNode.querySelectorAll(_name); //获取父节下的所有自己的节点    for (var i = 0, len = _list.length; i < len; i++) {        if (_list[i] === _el) {            return i;   //返回在数组的索引        }    }};/*** 获取td的第一个文本元素*/U.UF.E.table.getFirstText = function (td) {    var _child = td.childNodes;    for (var i = 0, len = _child.length; i < len; i++) {        if (_child[i].nodeType === 3) {            return _child[i];        }    }    return false;}/*获取指定标签的父节点*/U.UF.E.table.parentSelect = function (el, type) {    var _this = el;    var type = type.toUpperCase();    if (_this.tagName === type) return _this;    var parent = _this.parentNode;    while (parent.tagName !== type) {        parent = parent.parentNode;    }    return parent;};/*在元素前面插入新元素*/U.UF.E.table.Before = function (el, newEl) {    var _this = el;    var parentEl = _this.parentNode;    parentEl.insertBefore(newEl, _this);};/*在元素后面插入新元素*/U.UF.E.table.After = function (el, newEl) {    var _this = el;    if (_this && _this.parentNode) {        var parentEl = _this.parentNode;        var child = parentEl.childNodes;        var last = child[child.length - 1] || parentEl.lastChild;        if (last === _this) {            parentEl.appendChild(newEl);        } else {            parentEl.insertBefore(newEl, _this.nextSibling);        }        return newEl;    }};/***  使光标聚焦在该元素后面* @param el 需要文字聚焦的 元素节点*/U.UF.E.table.placeCaretAtEnd = function (el) {    //传入光标要去的节点对象    if (el.collapse) {   //如果存在el.collapsed 则是range        var range = el;        range.collapse(false);        var sel = window.getSelection();        sel.removeAllRanges();        sel.addRange(range);        return;    }    if (typeof window.getSelection != "undefined" && typeof document.createRange != "undefined") {        el.focus && el.focus();        var range = document.createRange();        range.selectNodeContents(el);        range.collapse(false);        var sel = window.getSelection();        sel.removeAllRanges();        sel.addRange(range);    } else if (typeof document.body.createTextRange != "undefined") {        var textRange = document.body.createTextRange();        textRange.moveToElementText(el);        textRange.collapse(false);        textRange.select();    }};/*合并单元格使用bug:1.选中表格时 如出现行和列对不齐时 除了删除列不会有问题以外 其他都会出问题	解决思路:由于合并单元格后 每行的td都对不齐了 因此需要修改选中td的接口 不准出现参差不齐的情况2.在合并单元格的那一列用添加列 删除列会有bug   解决思路: 由于合并单元格时 有占用两列或两行的情况 因此需要在添加列删除列那里将占用两列以上的情况考虑进去 针对colspan属性做判断3.在合并单元格的那一行除了 向上添加行功能 其他都会有bug解决思路:由于跨行合并单元格 会使第第一行变成占2行或以上 其他行display为none 因此如果向下添加行则需要将display为none 消掉 主要也是需要针对rowspan属性做判断*/
 |