< el-table > 表格
功能一: 列表过长时,按住ctrl的同时可鼠标拖拽滚动(拖拽过程中文字禁止选中)
enableDrag() {
this.$nextTick(() => {
const tableBodyWrapper = this.$refs.multipleTable.$el.querySelector('.el-table__body-wrapper');
if (!tableBodyWrapper) {
console.error('找不到表体。');
return;
}
let isDown = false;
let startX, scrollLeft;
let ctrlKeyPressed = false;
const disableTableTextSelection = () => {
tableBodyWrapper.style.userSelect = 'none';
tableBodyWrapper.style.webkitUserSelect = 'none';
};
const enableTableTextSelection = () => {
tableBodyWrapper.style.userSelect = '';
tableBodyWrapper.style.webkitUserSelect = '';
};
const handleKeyDown = (e) => {
if (e.key === 'Control' || e.key === 'Meta') {
ctrlKeyPressed = true;
}
};
const handleKeyUp = (e) => {
if (e.key === 'Control' || e.key === 'Meta') {
ctrlKeyPressed = false;
if (isDown) {
isDown = false;
tableBodyWrapper.style.cursor = '';
enableTableTextSelection();
}
}
};
window.addEventListener('keydown', handleKeyDown);
window.addEventListener('keyup', handleKeyUp);
tableBodyWrapper.addEventListener('mousedown', (e) => {
if (e.button !== 0 || !ctrlKeyPressed) return;
isDown = true;
startX = e.pageX - tableBodyWrapper.offsetLeft;
scrollLeft = tableBodyWrapper.scrollLeft;
tableBodyWrapper.style.cursor = 'grabbing';
disableTableTextSelection();
});
tableBodyWrapper.addEventListener('mouseleave', () => {
if (!isDown) return;
isDown = false;
tableBodyWrapper.style.cursor = '';
enableTableTextSelection();
});
tableBodyWrapper.addEventListener('mouseup', () => {
if (!isDown) return;
isDown = false;
tableBodyWrapper.style.cursor = '';
enableTableTextSelection();
});
tableBodyWrapper.addEventListener('mousemove', (e) => {
if (!isDown || !ctrlKeyPressed) return;
e.preventDefault();
const x = e.pageX - tableBodyWrapper.offsetLeft;
const walk = (x - startX) * 2;
tableBodyWrapper.scrollLeft = scrollLeft - walk;
});
this.$once('hook:beforeDestroy', () => {
enableTableTextSelection();
window.removeEventListener('keydown', handleKeyDown);
window.removeEventListener('keyup', handleKeyUp);
});
});
}