From 02c021084b1b3a24d2c7416efdb88024432c3724 Mon Sep 17 00:00:00 2001 From: Decio Ferreira Date: Wed, 4 Mar 2020 11:35:09 +0000 Subject: [PATCH 1/2] Fixes #103 Html.map + blur event on DOM removal makes impossible states possible --- src/Elm/Kernel/VirtualDom.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Elm/Kernel/VirtualDom.js b/src/Elm/Kernel/VirtualDom.js index 414a820..6ed5a3a 100644 --- a/src/Elm/Kernel/VirtualDom.js +++ b/src/Elm/Kernel/VirtualDom.js @@ -574,6 +574,10 @@ function _VirtualDom_applyEvents(domNode, eventNode, events) if (oldHandler.$ === newHandler.$) { oldCallback.__handler = newHandler; + oldCallback.__eventNode = { + __tagger: eventNode.__tagger, + __parent: eventNode.__parent + }; continue; } domNode.removeEventListener(key, oldCallback); @@ -633,7 +637,7 @@ function _VirtualDom_makeCallback(eventNode, initialHandler) var currentEventNode = ( stopPropagation && event.stopPropagation(), (tag == 2 ? value.b : tag == 3 && value.__$preventDefault) && event.preventDefault(), - eventNode + callback.__eventNode ); var tagger; var i; @@ -656,6 +660,7 @@ function _VirtualDom_makeCallback(eventNode, initialHandler) } callback.__handler = initialHandler; + callback.__eventNode = { __tagger: eventNode.__tagger, __parent: eventNode.__parent }; return callback; } From de8f8f3c24fe6c35819f28d202da21410f826396 Mon Sep 17 00:00:00 2001 From: Decio Ferreira Date: Tue, 1 Sep 2020 22:36:51 +0100 Subject: [PATCH 2/2] Fix case when no `Html.map` is used. Pointed out by @matsjoyce on the PR, thanks! --- src/Elm/Kernel/VirtualDom.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Elm/Kernel/VirtualDom.js b/src/Elm/Kernel/VirtualDom.js index 6ed5a3a..4ba1ffd 100644 --- a/src/Elm/Kernel/VirtualDom.js +++ b/src/Elm/Kernel/VirtualDom.js @@ -574,10 +574,10 @@ function _VirtualDom_applyEvents(domNode, eventNode, events) if (oldHandler.$ === newHandler.$) { oldCallback.__handler = newHandler; - oldCallback.__eventNode = { + oldCallback.__eventNode = eventNode.__tagger ? { __tagger: eventNode.__tagger, __parent: eventNode.__parent - }; + } : eventNode; continue; } domNode.removeEventListener(key, oldCallback); @@ -660,7 +660,7 @@ function _VirtualDom_makeCallback(eventNode, initialHandler) } callback.__handler = initialHandler; - callback.__eventNode = { __tagger: eventNode.__tagger, __parent: eventNode.__parent }; + callback.__eventNode = eventNode.__tagger ? { __tagger: eventNode.__tagger, __parent: eventNode.__parent } : eventNode; return callback; }