From 34fa3768979743730d7a558cde66e0cfe188dc91 Mon Sep 17 00:00:00 2001 From: Kevin Chappell Date: Sat, 22 Aug 2020 16:53:50 -0700 Subject: [PATCH] fix: timeout memory leaks --- src/js/control/autocomplete.js | 3 ++- src/js/form-builder.js | 14 +++++++++----- src/js/helpers.js | 3 ++- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/js/control/autocomplete.js b/src/js/control/autocomplete.js index a696d5313..2409ec5e9 100755 --- a/src/js/control/autocomplete.js +++ b/src/js/control/autocomplete.js @@ -101,8 +101,9 @@ export default class controlAutocomplete extends control { }, blur: evt => { evt.target.removeEventListener('keydown', keyboardNav) - setTimeout(() => { + const blurTimeout = setTimeout(() => { evt.target.nextSibling.nextSibling.style.display = 'none' + clearTimeout(blurTimeout) }, 200) // Validate the option entered exists if (this.config.requireValidOption) { diff --git a/src/js/form-builder.js b/src/js/form-builder.js index 5d9b03a17..1481ed29d 100755 --- a/src/js/form-builder.js +++ b/src/js/form-builder.js @@ -229,7 +229,10 @@ const FormBuilder = function(opts, element, $) { } if (isNew) { - setTimeout(() => document.dispatchEvent(events.fieldAdded), 10) + const eventTimeout = setTimeout(() => { + document.dispatchEvent(events.fieldAdded) + clearTimeout(eventTimeout) + }, 10) } appendNewField(field, isNew) @@ -347,8 +350,8 @@ const FormBuilder = function(opts, element, $) { select: defaultAttrs.concat(['multiple', 'options']), textarea: defaultAttrs.concat(['subtype', 'maxlength', 'rows']), } - - if((type in controls.registeredSubtypes) && !(type in typeAttrsMap)){ + + if (type in controls.registeredSubtypes && !(type in typeAttrsMap)) { typeAttrsMap[type] = defaultAttrs.concat(['subtype']) } @@ -536,7 +539,7 @@ const FormBuilder = function(opts, element, $) { number: numberAttribute, boolean: (attr, attrData) => { let isChecked = false - if(attr.type === 'checkbox'){ + if (attr.type === 'checkbox') { isChecked = Boolean(attrData.hasOwnProperty('value') ? attrData.value : false) } else if (values.hasOwnProperty(attr)) { isChecked = values[attr] @@ -1396,12 +1399,13 @@ const FormBuilder = function(opts, element, $) { // set min-height on stage onRender d.onRender(d.controls, () => { // Ensure style has loaded - setTimeout(() => { + const onRenderTimeout = setTimeout(() => { d.stage.style.minHeight = `${d.controls.clientHeight}px` // If option set, controls will remain in view in editor if (opts.stickyControls.enable) { h.stickyControls($stage) } + clearTimeout(onRenderTimeout) }, 0) }) diff --git a/src/js/helpers.js b/src/js/helpers.js index 3a09d90c8..9b0a9a99a 100755 --- a/src/js/helpers.js +++ b/src/js/helpers.js @@ -687,9 +687,10 @@ export default class Helpers { let outerHeight = 0 forEach(fields, index => (outerHeight += fields[index].offsetHeight + 3)) fields[0].style.marginTop = `${-outerHeight}px` - setTimeout(() => { + const animateTimeout = setTimeout(() => { empty(stage).classList.remove('removing') this.save() + clearTimeout(animateTimeout) }, 400) } else { empty(stage)