Skip to content

Commit e2c74b7

Browse files
authored
ignore elements that are no longer in the document (#7881)
* ignore elements that are no longer in the document - closes #7876 * we cant use document.contains because of fucking shadow DOM
1 parent 5259a84 commit e2c74b7

File tree

4 files changed

+38
-1
lines changed

4 files changed

+38
-1
lines changed

.changeset/light-papayas-agree.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@sveltejs/kit': patch
3+
---
4+
5+
Ignore elements that are no longer in the document

packages/kit/src/runtime/client/utils.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ function parent_element(element) {
101101
* @param {Element} target
102102
*/
103103
export function find_anchor(element, target) {
104-
while (element !== target) {
104+
while (element && element !== target) {
105105
if (element.nodeName.toUpperCase() === 'A') {
106106
return /** @type {HTMLAnchorElement | SVGAElement} */ (element);
107107
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<script>
2+
let visible = true;
3+
4+
function toggle() {
5+
visible = !visible;
6+
}
7+
</script>
8+
9+
{#if visible}
10+
<button on:click={toggle}>remove</button>
11+
{:else}
12+
<button on:click={toggle}>add</button>
13+
{/if}

packages/kit/test/apps/basics/test/client.test.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1184,3 +1184,22 @@ test.describe('cookies', () => {
11841184
await expect(page.locator('p')).toHaveText('foo=bar');
11851185
});
11861186
});
1187+
1188+
test.describe('Interactivity', () => {
1189+
test('click events on removed elements are ignored', async ({ page }) => {
1190+
let errored = false;
1191+
1192+
page.on('pageerror', (err) => {
1193+
console.error(err);
1194+
errored = true;
1195+
});
1196+
1197+
await page.goto('/interactivity/toggle-element');
1198+
expect(await page.textContent('button')).toBe('remove');
1199+
1200+
await page.click('button');
1201+
expect(await page.textContent('button')).toBe('add');
1202+
1203+
expect(errored).toBe(false);
1204+
});
1205+
});

0 commit comments

Comments
 (0)