Jelajahi Sumber

Remove stale event handlers when nodes are readded to the document.

Fixes: #1171
Adam Kelly 4 tahun lalu
induk
melakukan
8f700d6f79
2 mengubah file dengan 9 tambahan dan 0 penghapusan
  1. 2 0
      src/component.js
  2. 7 0
      src/directives/on.js

+ 2 - 0
src/component.js

@@ -411,6 +411,8 @@ export default class Component {
                             return
                         }
 
+                        node.__x_node_add_count = (node.__x_node_add_count || 0) + 1
+
                         this.initializeElements(node)
                     })
                 }

+ 7 - 0
src/directives/on.js

@@ -9,6 +9,8 @@ export function registerListener(component, el, event, modifiers, expression, ex
         event = camelCase(event);
     }
 
+    const node_add_count = el.__x_node_add_count
+
     let handler, listenerTarget
 
     if (modifiers.includes('away')) {
@@ -43,6 +45,11 @@ export function registerListener(component, el, event, modifiers, expression, ex
                 }
             }
 
+            if (el.__x_node_add_count !== node_add_count) {
+                listenerTarget.removeEventListener(event, handler, options);
+                return
+            }
+
             if (isKeyEvent(event)) {
                 if (isListeningForASpecificKeyThatHasntBeenPressed(e, modifiers)) {
                     return