Files
vxe-table/packages/tools/resize.js
2022-02-16 23:24:11 +08:00

77 lines
2.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import XEUtils from 'xe-utils'
import GlobalConfig from '../v-x-e-table/src/conf'
/**
* 监听 resize 事件
* 如果项目中已使用了 resize-observer-polyfill那么只需要将方法定义全局该组件就会自动使用
*/
let resizeTimeout
const eventStore = []
const defaultInterval = 500
function eventHandle () {
if (eventStore.length) {
eventStore.forEach(item => {
item.tarList.forEach(observer => {
const { target, width, heighe } = observer
const clientWidth = target.clientWidth
const clientHeight = target.clientHeight
const rWidth = clientWidth && width !== clientWidth
const rHeight = clientHeight && heighe !== clientHeight
if (rWidth || rHeight) {
observer.width = clientWidth
observer.heighe = clientHeight
setTimeout(item.callback)
}
})
})
/* eslint-disable @typescript-eslint/no-use-before-define */
eventListener()
}
}
function eventListener () {
clearTimeout(resizeTimeout)
resizeTimeout = setTimeout(eventHandle, GlobalConfig.resizeInterval || defaultInterval)
}
class ResizeObserverPolyfill {
constructor (callback) {
this.tarList = []
this.callback = callback
}
observe (target) {
if (target) {
if (!this.tarList.some(observer => observer.target === target)) {
this.tarList.push({
target,
width: target.clientWidth,
heighe: target.clientHeight
})
}
if (!eventStore.length) {
eventListener()
}
if (!eventStore.some(item => item === this)) {
eventStore.push(this)
}
}
}
unobserve (target) {
XEUtils.remove(eventStore, item => item.tarList.some(observer => observer.target === target))
}
disconnect () {
XEUtils.remove(eventStore, item => item === this)
}
}
export function createResizeEvent (callback) {
if (window.ResizeObserver) {
return new window.ResizeObserver(callback)
}
return new ResizeObserverPolyfill(callback)
}