[editor] Properly dispose the jquery tablescroller plugin
@@ -27,7 +27,7 @@ import $ from 'jquery';
* - data-tablescroller-enforce-height="true": displays the table at its maximum height accordingly to the page
*/
-const pluginName = 'jHueTableScroller',
+const PLUGIN_NAME = 'jHueTableScroller',
defaults = {
minHeight: 300,
maxHeight: -1,
@@ -35,10 +35,11 @@ const pluginName = 'jHueTableScroller',
};
function Plugin(element, options) {
+ this.disposeFunctions = [];
this.element = element;
this.options = $.extend({}, defaults, options);
this._defaults = defaults;
- this._name = pluginName;
+ this._name = PLUGIN_NAME;
this.init();
}
@@ -58,16 +59,29 @@ Plugin.prototype.init = function() {
.data('tablescroller-disable');
if (disableScrollingTable == null || disableScrollingTable !== true) {
resizeScrollingTable(_this);
- let _resizeTimeout = -1;
- $(window).resize(() => {
- window.clearTimeout(_resizeTimeout);
- _resizeTimeout = window.setTimeout(() => {
+ let resizeTimeout = -1;
+ const onResize = () => {
+ window.clearTimeout(resizeTimeout);
+ resizeTimeout = window.setTimeout(() => {
resizeScrollingTable(_this);
}, 400);
+ };
+ $(window).on('resize', onResize);
+ this.disposeFunctions.push(() => {
+ window.clearTimeout(resizeTimeout);
+ $(window).off('resize', onResize);
});
}
};
+Plugin.prototype.destroy = function() {
+ const $element = $(this.element);
+ this.disposeFunctions.forEach(disposeFunction => {
+ disposeFunction();
+ });
+ $element.data('plugin_' + PLUGIN_NAME, null);
+};
+
function resizeScrollingTable(_this) {
const el = _this.element;
$(el)
@@ -142,12 +156,12 @@ function resizeScrollingTable(_this) {
}
}
-$.fn[pluginName] = function(options) {
+$.fn[PLUGIN_NAME] = function(options) {
return this.each(function() {
- if (!$.data(this, 'plugin_' + pluginName)) {
- $.data(this, 'plugin_' + pluginName, new Plugin(this, options));
+ if (!$.data(this, 'plugin_' + PLUGIN_NAME)) {
+ $.data(this, 'plugin_' + PLUGIN_NAME, new Plugin(this, options));
} else {
- $.data(this, 'plugin_' + pluginName).setOptions(options);
+ $.data(this, 'plugin_' + PLUGIN_NAME).setOptions(options);
}
});
};
