From cc74f36922d8e07c06aec8fd695c77296aa17d4c Mon Sep 17 00:00:00 2001 From: Roman Bruckner Date: Thu, 18 Jan 2024 14:39:51 +0100 Subject: [PATCH] fix(mvc.Dom): remove event listeners on element removal; fix(linkTools.Vertices): fix to fire mouseleave event when redundancyRemoval is disabled (#2482) --- packages/joint-core/src/mvc/Dom/methods.mjs | 27 ++++++++++++++++----- packages/joint-core/src/mvc/Dom/vars.mjs | 7 ------ 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/packages/joint-core/src/mvc/Dom/methods.mjs b/packages/joint-core/src/mvc/Dom/methods.mjs index db998391c..84075aed7 100644 --- a/packages/joint-core/src/mvc/Dom/methods.mjs +++ b/packages/joint-core/src/mvc/Dom/methods.mjs @@ -1,14 +1,24 @@ import { camelCase } from '../../util/utilHelpers.mjs'; import $ from './Dom.mjs'; import V from '../../V/index.mjs'; -import { dataPriv, cleanNodesData } from './vars.mjs'; +import { dataPriv, dataUser } from './vars.mjs'; // Manipulation -function removeNodes(nodes, removeData) { +function cleanNodesData(nodes) { + let i = nodes.length; + while (i--) cleanNodeData(nodes[i]); +} + +function cleanNodeData(node) { + $.event.remove(node); + dataPriv.remove(node); + dataUser.remove(node); +} + +function removeNodes(nodes) { for (let i = 0; i < nodes.length; i++) { const node = nodes[i]; - removeData && dataPriv.remove(node); if (node.parentNode) { node.parentNode.removeChild(node); } @@ -16,12 +26,17 @@ function removeNodes(nodes, removeData) { } export function remove() { - removeNodes(this, true); + for (let i = 0; i < this.length; i++) { + const node = this[i]; + cleanNodeData(node); + cleanNodesData(node.getElementsByTagName('*')); + } + removeNodes(this); return this; } export function detach() { - removeNodes(this, false); + removeNodes(this); return this; } @@ -29,7 +44,7 @@ export function empty() { for (let i = 0; i < this.length; i++) { const node = this[i]; if (node.nodeType === 1) { - cleanNodesData(dataPriv, node.getElementsByTagName('*')); + cleanNodesData(node.getElementsByTagName('*')); // Remove any remaining nodes node.textContent = ''; } diff --git a/packages/joint-core/src/mvc/Dom/vars.mjs b/packages/joint-core/src/mvc/Dom/vars.mjs index dad70e941..5205f12e3 100644 --- a/packages/joint-core/src/mvc/Dom/vars.mjs +++ b/packages/joint-core/src/mvc/Dom/vars.mjs @@ -3,10 +3,3 @@ import Data from '../Data.mjs'; export const dataPriv = new Data(); export const dataUser = new Data(); - -export function cleanNodesData(data, nodes) { - let i = nodes.length; - while (i--) { - data.remove(nodes[i]); - } -}