diff --git a/packages/svelte/src/internal/client/render.js b/packages/svelte/src/internal/client/render.js
index dd959cf39a..7107f41d8a 100644
--- a/packages/svelte/src/internal/client/render.js
+++ b/packages/svelte/src/internal/client/render.js
@@ -2843,6 +2843,8 @@ export function spread_attributes(dom, prev, attrs, css_hash) {
if (!setters) map_set(setters_cache, dom.nodeName, (setters = get_setters(dom)));
for (const key in next) {
+ if (key.startsWith('$$')) continue;
+
let value = next[key];
if (has_hash && key === 'class') {
if (value) value += ' ';
diff --git a/packages/svelte/tests/runtime-runes/samples/event-listener-spread/Button.svelte b/packages/svelte/tests/runtime-runes/samples/event-listener-spread/Button.svelte
new file mode 100644
index 0000000000..db525426e4
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/event-listener-spread/Button.svelte
@@ -0,0 +1,7 @@
+
+
+
diff --git a/packages/svelte/tests/runtime-runes/samples/event-listener-spread/_config.js b/packages/svelte/tests/runtime-runes/samples/event-listener-spread/_config.js
new file mode 100644
index 0000000000..43084e6809
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/event-listener-spread/_config.js
@@ -0,0 +1,13 @@
+import { test } from '../../test';
+
+export default test({
+ html: ``,
+
+ async test({ assert, target }) {
+ const button = target.querySelector('button');
+
+ button?.click();
+ await Promise.resolve();
+ assert.htmlEqual(target.innerHTML, '');
+ }
+});
diff --git a/packages/svelte/tests/runtime-runes/samples/event-listener-spread/main.svelte b/packages/svelte/tests/runtime-runes/samples/event-listener-spread/main.svelte
new file mode 100644
index 0000000000..093c863407
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/event-listener-spread/main.svelte
@@ -0,0 +1,13 @@
+
+
+