From e3f4961c8c8270ac6241a3644b9fad44d14ddc1f Mon Sep 17 00:00:00 2001 From: Ghislain B Date: Fri, 13 Nov 2020 21:56:56 -0500 Subject: [PATCH] fix: unsubscribe everything event & nullify DOM elements avoid detach elements (#551) * fix: nullify every DOM elements to avoid detach elements - see this Stack Overflow [question](https://stackoverflow.com/questions/16901759/javascript-memory-leaks-detached-dom-tree) for reference * refactor: nullify element in correct scope * refactor: nullify every elements to avoid detached elements * refactor: on destroy we should call selector destroy if exist * refactor: remove event handler when destroying controls * refactor: add flag to destroy all elements * refactor: make sure all event listeners are unsubscribed * refactor: fix code indentation --- controls/slick.columnpicker.js | 15 +++++- controls/slick.gridmenu.js | 30 ++++++++--- plugins/slick.autotooltips.js | 12 +++-- plugins/slick.cellmenu.js | 3 ++ plugins/slick.cellrangedecorator.js | 7 ++- plugins/slick.cellrangeselector.js | 9 +++- plugins/slick.cellselectionmodel.js | 4 ++ plugins/slick.checkboxselectcolumn.js | 2 +- plugins/slick.contextmenu.js | 3 ++ plugins/slick.draggablegrouping.js | 4 +- plugins/slick.headermenu.js | 11 ++++ slick.compositeeditor.js | 6 ++- slick.dataview.js | 24 +++++++++ slick.grid.js | 78 ++++++++++++++++++++++++++- 14 files changed, 187 insertions(+), 21 deletions(-) diff --git a/controls/slick.columnpicker.js b/controls/slick.columnpicker.js index a34c3b72..2cba99fa 100644 --- a/controls/slick.columnpicker.js +++ b/controls/slick.columnpicker.js @@ -79,9 +79,18 @@ function destroy() { _grid.onHeaderContextMenu.unsubscribe(handleHeaderContextMenu); _grid.onColumnsReordered.unsubscribe(updateColumnOrder); + if ($list) { + $list.remove(); + } + if ($menu) { + $menu.off("click").remove(); + } $(document.body).off("mousedown", handleBodyMouseDown); - $("div.slick-columnpicker").hide(_options && _options.columnPicker && _options.columnPicker.fadeSpeed); - $menu.remove(); + $(".slick-columnpicker." + _gridUid).hide(_options && _options.columnPicker && _options.columnPicker.fadeSpeed); + $columnTitleElm = null; + $list = null; + $menu = null; + $(window).off("beforeunload"); } function handleBodyMouseDown(e) { @@ -151,6 +160,8 @@ .fadeIn(_options && _options.columnPicker && _options.columnPicker.fadeSpeed); $list.appendTo($menu); + $li = null; + $input = null; } function updateColumnOrder() { diff --git a/controls/slick.gridmenu.js b/controls/slick.gridmenu.js index d887465b..ea7f3470 100644 --- a/controls/slick.gridmenu.js +++ b/controls/slick.gridmenu.js @@ -189,8 +189,7 @@ // if header row is enabled, we need to resize it's width also var enableResizeHeaderRow = (_options.gridMenu && _options.gridMenu.resizeOnShowHeaderRow != undefined) ? _options.gridMenu.resizeOnShowHeaderRow : _defaults.resizeOnShowHeaderRow; if (enableResizeHeaderRow && _options.showHeaderRow) { - var $headerrow = $('.' + _gridUid + '.slick-headerrow'); - $headerrow.attr('style', 'width: calc(100% - ' + gridMenuWidth + 'px)'); + $('.' + _gridUid + '.slick-headerrow').attr('style', 'width: calc(100% - ' + gridMenuWidth + 'px)'); } $button = $('