element_data.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. /**
  2. * DevExtreme (core/element_data.js)
  3. * Version: 19.1.16
  4. * Build date: Tue Oct 18 2022
  5. *
  6. * Copyright (c) 2012 - 2022 Developer Express Inc. ALL RIGHTS RESERVED
  7. * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
  8. */
  9. "use strict";
  10. var WeakMap = require("./polyfills/weak_map");
  11. var domAdapter = require("./dom_adapter");
  12. var eventsEngine = require("../events/core/events_engine");
  13. var MemorizedCallbacks = require("./memorized_callbacks");
  14. var dataMap = new WeakMap;
  15. var strategy;
  16. var strategyChanging = new MemorizedCallbacks;
  17. var beforeCleanData = function() {};
  18. var afterCleanData = function() {};
  19. var setDataStrategy = exports.setDataStrategy = function(value) {
  20. strategyChanging.fire(value);
  21. strategy = value;
  22. var cleanData = strategy.cleanData;
  23. strategy.cleanData = function(nodes) {
  24. beforeCleanData(nodes);
  25. var result = cleanData.call(this, nodes);
  26. afterCleanData(nodes);
  27. return result
  28. }
  29. };
  30. setDataStrategy({
  31. data: function() {
  32. var element = arguments[0];
  33. var key = arguments[1];
  34. var value = arguments[2];
  35. if (!element) {
  36. return
  37. }
  38. var elementData = dataMap.get(element);
  39. if (!elementData) {
  40. elementData = {};
  41. dataMap.set(element, elementData)
  42. }
  43. if (void 0 === key) {
  44. return elementData
  45. }
  46. if (2 === arguments.length) {
  47. return elementData[key]
  48. }
  49. elementData[key] = value;
  50. return value
  51. },
  52. removeData: function(element, key) {
  53. if (!element) {
  54. return
  55. }
  56. if (void 0 === key) {
  57. dataMap.delete(element)
  58. } else {
  59. var elementData = dataMap.get(element);
  60. if (elementData) {
  61. delete elementData[key]
  62. }
  63. }
  64. },
  65. cleanData: function(elements) {
  66. for (var i = 0; i < elements.length; i++) {
  67. eventsEngine.off(elements[i]);
  68. dataMap.delete(elements[i])
  69. }
  70. }
  71. });
  72. exports.setDataStrategy = setDataStrategy;
  73. exports.getDataStrategy = function() {
  74. return strategy
  75. };
  76. exports.data = function() {
  77. return strategy.data.apply(this, arguments)
  78. };
  79. exports.strategyChanging = strategyChanging;
  80. exports.beforeCleanData = function(callback) {
  81. beforeCleanData = callback
  82. };
  83. exports.afterCleanData = function(callback) {
  84. afterCleanData = callback
  85. };
  86. exports.cleanData = function(nodes) {
  87. return strategy.cleanData.call(this, nodes)
  88. };
  89. exports.removeData = function(element, key) {
  90. return strategy.removeData.call(this, element, key)
  91. };
  92. exports.cleanDataRecursive = function(element, cleanSelf) {
  93. if (!domAdapter.isElementNode(element)) {
  94. return
  95. }
  96. var childElements = element.getElementsByTagName("*");
  97. strategy.cleanData(childElements);
  98. if (cleanSelf) {
  99. strategy.cleanData([element])
  100. }
  101. };