diff --git a/.changeset/happy-spoons-talk.md b/.changeset/happy-spoons-talk.md
new file mode 100644
index 0000000000..cf165320db
--- /dev/null
+++ b/.changeset/happy-spoons-talk.md
@@ -0,0 +1,5 @@
+---
+'svelte': patch
+---
+
+fix: clean up removed capture event handlers from spread attributes
diff --git a/packages/svelte/src/internal/client/dom/elements/attributes.js b/packages/svelte/src/internal/client/dom/elements/attributes.js
index 589685b5f2..8a25be7acd 100644
--- a/packages/svelte/src/internal/client/dom/elements/attributes.js
+++ b/packages/svelte/src/internal/client/dom/elements/attributes.js
@@ -315,7 +315,8 @@ function set_attributes(
var is_option_element = element.nodeName === OPTION_TAG;
for (var key in prev) {
- if (!(key in next)) {
+ // don't null our internal $$onX listeners
+ if (!(key in next) && key[0] + key[1] !== '$$') {
next[key] = null;
}
}
diff --git a/packages/svelte/tests/runtime-runes/samples/event-attribute-spread-update/_config.js b/packages/svelte/tests/runtime-runes/samples/event-attribute-spread-update/_config.js
index af03eed4c9..5fbd37c768 100644
--- a/packages/svelte/tests/runtime-runes/samples/event-attribute-spread-update/_config.js
+++ b/packages/svelte/tests/runtime-runes/samples/event-attribute-spread-update/_config.js
@@ -3,16 +3,31 @@ import { test } from '../../test';
export default test({
test({ assert, target }) {
- const [change, increment] = target.querySelectorAll('button');
+ const [change, remove, increment] = target.querySelectorAll('button');
increment.click();
flushSync();
- assert.htmlEqual(target.innerHTML, '');
+ assert.htmlEqual(
+ target.innerHTML,
+ ''
+ );
change.click();
flushSync();
increment.click();
flushSync();
- assert.htmlEqual(target.innerHTML, '');
+ assert.htmlEqual(
+ target.innerHTML,
+ ''
+ );
+
+ remove.click();
+ flushSync();
+ increment.click();
+ flushSync();
+ assert.htmlEqual(
+ target.innerHTML,
+ ''
+ );
}
});
diff --git a/packages/svelte/tests/runtime-runes/samples/event-attribute-spread-update/main.svelte b/packages/svelte/tests/runtime-runes/samples/event-attribute-spread-update/main.svelte
index 32d4b242cc..ee049e469c 100644
--- a/packages/svelte/tests/runtime-runes/samples/event-attribute-spread-update/main.svelte
+++ b/packages/svelte/tests/runtime-runes/samples/event-attribute-spread-update/main.svelte
@@ -24,4 +24,7 @@
>
change handlers
+