resize.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import XEUtils from 'xe-utils'
  2. import GlobalConfig from '../v-x-e-table/src/conf'
  3. /**
  4. * 监听 resize 事件
  5. * 如果项目中已使用了 resize-observer-polyfill,那么只需要将方法定义全局,该组件就会自动使用
  6. */
  7. let resizeTimeout
  8. const eventStore = []
  9. const defaultInterval = 500
  10. function eventHandle () {
  11. if (eventStore.length) {
  12. eventStore.forEach(item => {
  13. item.tarList.forEach(observer => {
  14. const { target, width, heighe } = observer
  15. const clientWidth = target.clientWidth
  16. const clientHeight = target.clientHeight
  17. const rWidth = clientWidth && width !== clientWidth
  18. const rHeight = clientHeight && heighe !== clientHeight
  19. if (rWidth || rHeight) {
  20. observer.width = clientWidth
  21. observer.heighe = clientHeight
  22. setTimeout(item.callback)
  23. }
  24. })
  25. })
  26. /* eslint-disable @typescript-eslint/no-use-before-define */
  27. eventListener()
  28. }
  29. }
  30. function eventListener () {
  31. clearTimeout(resizeTimeout)
  32. resizeTimeout = setTimeout(eventHandle, GlobalConfig.resizeInterval || defaultInterval)
  33. }
  34. class ResizeObserverPolyfill {
  35. constructor (callback) {
  36. this.tarList = []
  37. this.callback = callback
  38. }
  39. observe (target) {
  40. if (target) {
  41. if (!this.tarList.some(observer => observer.target === target)) {
  42. this.tarList.push({
  43. target,
  44. width: target.clientWidth,
  45. heighe: target.clientHeight
  46. })
  47. }
  48. if (!eventStore.length) {
  49. eventListener()
  50. }
  51. if (!eventStore.some(item => item === this)) {
  52. eventStore.push(this)
  53. }
  54. }
  55. }
  56. unobserve (target) {
  57. XEUtils.remove(eventStore, item => item.tarList.some(observer => observer.target === target))
  58. }
  59. disconnect () {
  60. XEUtils.remove(eventStore, item => item === this)
  61. }
  62. }
  63. export function createResizeEvent (callback) {
  64. if (window.ResizeObserver) {
  65. return new window.ResizeObserver(callback)
  66. }
  67. return new ResizeObserverPolyfill(callback)
  68. }