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属性做判断
- */
|