Skip to content

Commit 4fef0eb

Browse files
authored
fix: capture the correct event names when spreading attributes (#11783)
fixes #11777 We need to scope the `key` variable because it may be captured in a closure
1 parent ee9d5ef commit 4fef0eb

File tree

4 files changed

+31
-1
lines changed

4 files changed

+31
-1
lines changed

.changeset/happy-dogs-jump.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"svelte": patch
3+
---
4+
5+
fix: capture the correct event names when spreading attributes

packages/svelte/src/internal/client/dom/elements/attributes.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,8 @@ export function set_attributes(element, prev, next, lowercase_attributes, css_ha
163163
/** @type {Array<[string, any, () => void]>} */
164164
var events = [];
165165

166-
for (key in next) {
166+
// since key is captured we use const
167+
for (const key in next) {
167168
// let instead of var because referenced in a closure
168169
let value = next[key];
169170
if (value === prev?.[key]) continue;
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { flushSync } from 'svelte';
2+
import { test } from '../../test';
3+
4+
export default test({
5+
test({ assert, target }) {
6+
const div = target.querySelector('div');
7+
8+
div?.dispatchEvent(new Event('b'));
9+
flushSync();
10+
assert.htmlEqual(target.innerHTML, '<div>b</div>');
11+
12+
div?.dispatchEvent(new Event('a'));
13+
flushSync();
14+
assert.htmlEqual(target.innerHTML, '<div>a</div>');
15+
}
16+
});
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<script lang="ts">
2+
const props = {};
3+
let changed = $state('');
4+
</script>
5+
6+
<div {...props} ona={() => (changed = 'a')} onb={() => (changed = 'b')}>
7+
{changed}
8+
</div>

0 commit comments

Comments
 (0)