Files
vxe-table/lib/tools/src/dom.js
xuliangzhan 82ac04cd74 update
2019-09-16 21:20:05 +08:00

256 lines
7.7 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = exports.DomTools = void 0;
var _xeUtils = _interopRequireDefault(require("xe-utils/methods/xe-utils"));
var _utils = _interopRequireDefault(require("./utils"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var browse = _xeUtils.default.browse();
var htmlElem = browse.isDoc ? document.querySelector('html') : 0;
var bodyElem = browse.isDoc ? document.body : 0;
function getClsRE(cls) {
if (!reClsMap[cls]) {
reClsMap[cls] = new RegExp("(?:^|\\s)".concat(cls, "(?!\\S)"), 'g');
}
return reClsMap[cls];
}
var reClsMap = {};
var DomTools = {
browse: browse,
isPx: function isPx(val) {
return val && /^\d+(px)?$/.test(val);
},
isScale: function isScale(val) {
return val && /^\d+%$/.test(val);
},
hasClass: function hasClass(elem, cls) {
return elem && elem.className && elem.className.match && elem.className.match(getClsRE(cls));
},
removeClass: function removeClass(elem, cls) {
if (elem && DomTools.hasClass(elem, cls)) {
elem.className = elem.className.replace(getClsRE(cls), '');
}
},
addClass: function addClass(elem, cls) {
if (elem && !DomTools.hasClass(elem, cls)) {
DomTools.removeClass(elem, cls);
elem.className = "".concat(elem.className, " ").concat(cls);
}
},
updateCellTitle: function updateCellTitle(evnt) {
var cellElem = evnt.currentTarget.querySelector('.vxe-cell');
var content = cellElem.innerText;
if (cellElem.getAttribute('title') !== content) {
cellElem.setAttribute('title', content);
}
},
rowToVisible: function rowToVisible($table, row) {
var bodyElem = $table.$refs.tableBody.$el;
var trElem = bodyElem.querySelector("[data-rowid=\"".concat(_utils.default.getRowid($table, row), "\"]"));
if (trElem) {
var bodyHeight = bodyElem.clientHeight;
var bodySrcollTop = bodyElem.scrollTop;
var trOffsetTop = trElem.offsetTop + (trElem.offsetParent ? trElem.offsetParent.offsetTop : 0);
var trHeight = trElem.clientHeight;
if (trOffsetTop < bodySrcollTop || trOffsetTop > bodySrcollTop + bodyHeight) {
// 如果跨行滚动
bodyElem.scrollTop = trOffsetTop;
} else if (trOffsetTop + trHeight >= bodyHeight + bodySrcollTop) {
bodyElem.scrollTop = bodySrcollTop + trHeight;
}
} else {
// 如果是虚拟渲染跨行滚动
if ($table.scrollYLoad) {
bodyElem.scrollTop = ($table.afterFullData.indexOf(row) - 1) * $table.scrollYStore.rowHeight;
}
}
},
colToVisible: function colToVisible($table, column) {
var bodyElem = $table.$refs.tableBody.$el;
var tdElem = bodyElem.querySelector(".".concat(column.id));
if (tdElem) {
var bodyWidth = bodyElem.clientWidth;
var bodySrcollLeft = bodyElem.scrollLeft;
var tdOffsetLeft = tdElem.offsetLeft + (tdElem.offsetParent ? tdElem.offsetParent.offsetLeft : 0);
var tdWidth = tdElem.clientWidth;
if (tdOffsetLeft < bodySrcollLeft || tdOffsetLeft > bodySrcollLeft + bodyWidth) {
// 如果跨列滚动
bodyElem.scrollLeft = tdOffsetLeft;
} else if (tdOffsetLeft + tdWidth >= bodyWidth + bodySrcollLeft) {
bodyElem.scrollLeft = bodySrcollLeft + tdWidth;
}
} else {
// 如果是虚拟渲染跨行滚动
if ($table.scrollXLoad) {
var visibleColumn = $table.visibleColumn;
var scrollLeft = 0;
for (var index = 0; index < visibleColumn.length; index++) {
if (visibleColumn[index] === column) {
break;
}
scrollLeft += visibleColumn[index].renderWidth;
}
bodyElem.scrollLeft = scrollLeft;
}
}
},
getDomNode: function getDomNode() {
var documentElement = document.documentElement;
var bodyElem = document.body;
return {
scrollTop: documentElement.scrollTop || bodyElem.scrollTop,
scrollLeft: documentElement.scrollLeft || bodyElem.scrollLeft,
visibleHeight: documentElement.clientHeight || bodyElem.clientHeight,
visibleWidth: documentElement.clientWidth || bodyElem.clientWidth
};
},
/**
* 检查触发源是否属于目标节点
*/
getEventTargetNode: function getEventTargetNode(evnt, container, queryCls) {
var targetElem;
var target = evnt.target;
while (target && target.nodeType && target !== document) {
if (queryCls && DomTools.hasClass(target, queryCls)) {
targetElem = target;
} else if (target === container) {
return {
flag: queryCls ? !!targetElem : true,
container: container,
targetElem: targetElem
};
}
target = target.parentNode;
}
return {
flag: false
};
},
/**
* 获取元素相对于 document 的位置
*/
getOffsetPos: function getOffsetPos(elem, container) {
return getNodeOffset(elem, container, {
left: 0,
top: 0
});
},
getAbsolutePos: function getAbsolutePos(elem) {
var bounding = elem.getBoundingClientRect();
var _DomTools$getDomNode = DomTools.getDomNode(),
scrollTop = _DomTools$getDomNode.scrollTop,
scrollLeft = _DomTools$getDomNode.scrollLeft;
return {
top: scrollTop + bounding.top,
left: scrollLeft + bounding.left
};
},
/**
* 获取单元格节点索引
*/
getCellNodeIndex: function getCellNodeIndex(cell) {
var trElem = cell.parentNode;
var columnIndex = _xeUtils.default.arrayIndexOf(trElem.children, cell);
var rowIndex = _xeUtils.default.arrayIndexOf(trElem.parentNode.children, trElem);
return {
columnIndex: columnIndex,
rowIndex: rowIndex
};
},
/**
* 获取选中单元格矩阵范围
*/
getRowNodes: function getRowNodes(trList, cellNode, targetCellNode) {
var startColIndex = cellNode.columnIndex;
var startRowIndex = cellNode.rowIndex;
var targetColIndex = targetCellNode.columnIndex;
var targetRowIndex = targetCellNode.rowIndex;
var rows = [];
for (var rowIndex = Math.min(startRowIndex, targetRowIndex), rowLen = Math.max(startRowIndex, targetRowIndex); rowIndex <= rowLen; rowIndex++) {
var cells = [];
var trElem = trList[rowIndex];
for (var colIndex = Math.min(startColIndex, targetColIndex), colLen = Math.max(startColIndex, targetColIndex); colIndex <= colLen; colIndex++) {
var tdElem = trElem.children[colIndex];
cells.push(tdElem);
}
rows.push(cells);
}
return rows;
},
getCellIndexs: function getCellIndexs(cell) {
var trElem = cell.parentNode;
var rowid = trElem.getAttribute('data-rowid');
var columnIndex = [].indexOf.call(trElem.children, cell);
var rowIndex = [].indexOf.call(trElem.parentNode.children, trElem);
return {
rowid: rowid,
rowIndex: rowIndex,
columnIndex: columnIndex
};
},
getCell: function getCell($table, _ref) {
var row = _ref.row,
column = _ref.column;
var rowid = _utils.default.getRowid($table, row);
return $table.$refs.tableBody.$el.querySelector(".vxe-body--row[data-rowid=\"".concat(rowid, "\"] .").concat(column.id));
}
};
exports.DomTools = DomTools;
function getNodeOffset(elem, container, rest) {
if (elem) {
var parentElem = elem.parentNode;
rest.top += elem.offsetTop;
rest.left += elem.offsetLeft;
if (parentElem && parentElem !== htmlElem && parentElem !== bodyElem) {
rest.top -= parentElem.scrollTop;
rest.left -= parentElem.scrollLeft;
}
if (container && (elem === container || elem.offsetParent === container) ? 0 : elem.offsetParent) {
return getNodeOffset(elem.offsetParent, container, rest);
}
}
return rest;
}
var _default = DomTools;
exports.default = _default;