scrollview-resize-umd

A UMD build of scrollview-resize

此腳本不應該直接安裝,它是一個供其他腳本使用的函式庫。欲使用本函式庫,請在腳本 metadata 寫上: // @require https://update.gf.qytechs.cn/scripts/531084/1561338/scrollview-resize-umd.js

  1. (function (global, factory) {
  2. typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
  3. typeof define === 'function' && define.amd ? define(factory) :
  4. (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.SVResizeObserver = factory());
  5. })(this, (() => {
  6. class SVResizeObserver {
  7. constructor(callback) {
  8. Object.defineProperty(this, "callback", {
  9. enumerable: true,
  10. configurable: true,
  11. writable: true,
  12. value: callback
  13. });
  14. Object.defineProperty(this, "dataset", {
  15. enumerable: true,
  16. configurable: true,
  17. writable: true,
  18. value: []
  19. });
  20. }
  21. /**
  22. * Observing the specified `Element`.
  23. *
  24. * @param target - A reference to an `Element` to be observed.
  25. */
  26. observe(target, options) {
  27. const resizeObserver = new ResizeObserver(() => this._checkChange());
  28. for (let i = 0; i < target.children.length; i++) resizeObserver.observe(target.children[i]);
  29. const mutationObserver = new MutationObserver(() => {
  30. this._checkChange();
  31. this.unobserve(target);
  32. this.observe.apply(this, arguments);
  33. });
  34. mutationObserver.observe(target, { childList: true });
  35. const [scrollWidth, scrollHeight] = [target.scrollWidth, target.scrollHeight];
  36. this.dataset.push({
  37. target,
  38. entrie: {
  39. target,
  40. scrollWidth,
  41. scrollHeight,
  42. previousScrollWidth: scrollWidth,
  43. previousScrollHeight: scrollHeight,
  44. },
  45. direction: options === null || options === void 0 ? void 0 : options.direction,
  46. resize: resizeObserver,
  47. mutation: mutationObserver
  48. });
  49. }
  50. /**
  51. * Ends the observing of a specified `Element`.
  52. *
  53. * @param target - A reference to an `Element` to be unobserved.
  54. */
  55. unobserve(target) {
  56. const dataset = [];
  57. for (const data of this.dataset) {
  58. if (data.target === target) {
  59. data.resize.disconnect();
  60. data.mutation.disconnect();
  61. } else dataset.push(data);
  62. }
  63. this.dataset = dataset;
  64. }
  65. /**
  66. * Unobserves all observed `Element` targets.
  67. */
  68. disconnect() {
  69. for (const data of this.dataset) {
  70. data.resize.disconnect();
  71. data.mutation.disconnect();
  72. }
  73. this.dataset = [];
  74. }
  75. _checkChange() {
  76. let hasChange = false;
  77. const entries = [];
  78. for (const data of this.dataset) {
  79. const [scrollWidth, scrollHeight] = [data.target.scrollWidth, data.target.scrollHeight];
  80. const scrollWidthChange = data.entrie.scrollWidth !== scrollWidth;
  81. const scrollHeightChange = data.entrie.scrollHeight !== scrollHeight;
  82. switch (data.direction) {
  83. case undefined:
  84. hasChange = scrollWidthChange || scrollHeightChange;
  85. break;
  86. case 'x':
  87. hasChange = scrollWidthChange;
  88. break;
  89. case 'y':
  90. hasChange = scrollHeightChange;
  91. break;
  92. }
  93. data.entrie.previousScrollHeight = data.entrie.scrollHeight;
  94. data.entrie.previousScrollWidth = data.entrie.scrollWidth;
  95. data.entrie.scrollWidth = scrollWidth;
  96. data.entrie.scrollHeight = scrollHeight;
  97. entries.push(Object.freeze(Object.assign({}, data.entrie)));
  98. }
  99. if (hasChange) this.callback(entries, this);
  100. }
  101. }
  102. return SVResizeObserver;
  103. }));

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址