dom-size-monitor
Version:
监听元素大小变化
70 lines (57 loc) • 1.15 kB
JavaScript
import debounce from '../debounce'
export const createSensor = element => {
// 感应器
let sensor = null
// callback
let listeners = []
/**
* 统一触发 listeners
*/
const resizeListener = debounce(() => {
// 依次触发执行
listeners.forEach(listener => {
listener(element)
})
})
const newSensor = () => {
const sensor = new ResizeObserver(resizeListener)
// 监听 element
sensor.observe(element)
// 直接触发一次
resizeListener()
return sensor
}
const bind = cb => {
if (!sensor) {
sensor = newSensor()
}
if (listeners.indexOf(cb) === -1) {
listeners.push(cb)
}
}
/**
* 完全 destroy
*/
const destroy = () => {
sensor.disconnect()
listeners = []
sensor = undefined
}
const unbind = cb => {
const idx = listeners.indexOf(cb)
if (idx !== -1) {
listeners.splice(idx, 1)
}
// 不存在 listener,并且存在 sensor object
// 则移除 object
if (listeners.length === 0 && sensor) {
destroy()
}
}
return {
element,
bind,
destroy,
unbind
}
}