vxe-table
Version:
一个基于 vue 的 PC 端表格组件,支持增删改查、虚拟滚动、懒加载、快捷菜单、数据校验、树形结构、打印导出、表单渲染、数据分页、虚拟列表、模态窗口、自定义模板、渲染器、贼灵活的配置项、扩展接口等...
264 lines (222 loc) • 7.74 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = exports.DomTools = void 0;
var _ctor = _interopRequireDefault(require("xe-utils/ctor"));
var _utils = _interopRequireDefault(require("./utils"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var getRowid = _utils.default.getRowid;
var browse = _ctor.default.browse();
var htmlElem = browse.isDoc ? document.querySelector('html') : 0;
var bodyElem = browse.isDoc ? document.body : 0;
var reClsMap = {};
function getClsRE(cls) {
if (!reClsMap[cls]) {
reClsMap[cls] = new RegExp("(?:^|\\s)".concat(cls, "(?!\\S)"), 'g');
}
return reClsMap[cls];
}
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;
}
function isScale(val) {
return val && /^\d+%$/.test(val);
}
function hasClass(elem, cls) {
return elem && elem.className && elem.className.match && elem.className.match(getClsRE(cls));
}
function removeClass(elem, cls) {
if (elem && hasClass(elem, cls)) {
elem.className = elem.className.replace(getClsRE(cls), '');
}
}
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
};
}
var DomTools = {
browse: browse,
isPx: function isPx(val) {
return val && /^\d+(px)?$/.test(val);
},
isScale: isScale,
hasClass: hasClass,
removeClass: removeClass,
addClass: function addClass(elem, cls) {
if (elem && !hasClass(elem, cls)) {
removeClass(elem, cls);
elem.className = "".concat(elem.className, " ").concat(cls);
}
},
updateCellTitle: function updateCellTitle(overflowElem, column) {
var content = column.type === 'html' ? overflowElem.innerText : overflowElem.textContent;
if (overflowElem.getAttribute('title') !== content) {
overflowElem.setAttribute('title', content);
}
},
rowToVisible: function rowToVisible($xetable, row) {
var bodyElem = $xetable.$refs.tableBody.$el;
var trElem = bodyElem.querySelector("[data-rowid=\"".concat(getRowid($xetable, 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) {
// 向上定位
return $xetable.scrollTo(null, trOffsetTop);
} else if (trOffsetTop + trHeight >= bodyHeight + bodySrcollTop) {
// 向下定位
return $xetable.scrollTo(null, bodySrcollTop + trHeight);
}
} else {
// 如果是虚拟渲染跨行滚动
if ($xetable.scrollYLoad) {
return $xetable.scrollTo(null, ($xetable.afterFullData.indexOf(row) - 1) * $xetable.scrollYStore.rowHeight);
}
}
return Promise.resolve();
},
colToVisible: function colToVisible($xetable, column) {
var bodyElem = $xetable.$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) {
// 向左定位
return $xetable.scrollTo(tdOffsetLeft);
} else if (tdOffsetLeft + tdWidth >= bodyWidth + bodySrcollLeft) {
// 向右定位
return $xetable.scrollTo(bodySrcollLeft + tdWidth);
}
} else {
// 如果是虚拟渲染跨行滚动
if ($xetable.scrollXLoad) {
var visibleColumn = $xetable.visibleColumn;
var scrollLeft = 0;
for (var index = 0; index < visibleColumn.length; index++) {
if (visibleColumn[index] === column) {
break;
}
scrollLeft += visibleColumn[index].renderWidth;
}
return $xetable.scrollTo(scrollLeft);
}
}
return Promise.resolve();
},
getDomNode: getDomNode,
/**
* 检查触发源是否属于目标节点
*/
getEventTargetNode: function getEventTargetNode(evnt, container, queryCls, queryMethod) {
var targetElem;
var target = evnt.target;
while (target && target.nodeType && target !== document) {
if (queryCls && hasClass(target, queryCls) && (!queryMethod || queryMethod(target))) {
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 boundingTop = bounding.top;
var boundingLeft = bounding.left;
var _getDomNode = getDomNode(),
scrollTop = _getDomNode.scrollTop,
scrollLeft = _getDomNode.scrollLeft,
visibleHeight = _getDomNode.visibleHeight,
visibleWidth = _getDomNode.visibleWidth;
return {
boundingTop: boundingTop,
top: scrollTop + boundingTop,
boundingLeft: boundingLeft,
left: scrollLeft + boundingLeft,
visibleHeight: visibleHeight,
visibleWidth: visibleWidth
};
},
toView: function toView(elem) {
var scrollIntoViewIfNeeded = 'scrollIntoViewIfNeeded';
var scrollIntoView = 'scrollIntoView';
if (elem) {
if (elem[scrollIntoViewIfNeeded]) {
elem[scrollIntoViewIfNeeded]();
} else if (elem[scrollIntoView]) {
elem[scrollIntoView]();
}
}
},
triggerEvent: function triggerEvent(targetElem, type) {
var evnt;
if (typeof Event === 'function') {
evnt = new Event(type);
} else {
evnt = document.createEvent('Event');
evnt.initEvent(type, true, true);
}
targetElem.dispatchEvent(evnt);
},
calcHeight: function calcHeight($xetable, key) {
var val = $xetable[key];
var num = 0;
if (val) {
if (val === 'auto') {
num = $xetable.parentHeight;
} else {
var excludeHeight = $xetable.getExcludeHeight();
if (isScale(val)) {
num = Math.floor((_ctor.default.toInteger(val) || 1) / 100 * $xetable.parentHeight);
} else {
num = _ctor.default.toNumber(val);
}
num = Math.max(40, num - excludeHeight);
}
}
return num;
}
};
exports.DomTools = DomTools;
var _default = DomTools;
exports.default = _default;