You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firefox中SvelteKit页面关闭时如何成功发送HTTP DELETE请求?

解决方案

问题原因

你之前的实现依赖unload事件发送请求,但现代浏览器(包括Firefox 116.0.3)对unload事件中的异步请求限制严格,即便设置了keepalive: true,浏览器也可能在请求完成前终止页面进程,导致请求无法触发后端接口。


方案1:改用pagehide事件 + 带keepalive的fetch

pagehide事件是浏览器推荐的页面卸载监听事件,比unload更可靠。修改+page.svelte代码如下:

<script>
    import { onMount } from 'svelte';

    onMount(() => {
        const handlePageUnload = async () => {
            try {
                await fetch('/', {
                    method: 'DELETE',
                    keepalive: true,
                    headers: {
                        'Content-Type': 'application/json'
                    }
                });
            } catch (err) {
                console.error('请求发送失败:', err);
            }
        };

        window.addEventListener('pagehide', handlePageUnload);

        // 组件销毁时移除监听,避免内存泄漏
        return () => {
            window.removeEventListener('pagehide', handlePageUnload);
        };
    });
</script>

<h1>Welcome to SvelteKit</h1>
<p>Visit kit.svelte.dev to read the documentation</p>

方案2:使用navigator.sendBeacon(更稳定)

navigator.sendBeacon是浏览器专门为页面卸载场景设计的API,能确保请求被异步发送且不会被页面终止打断。如果后端可以兼容POST请求处理删除逻辑,推荐此方案:

  1. 修改+page.svelte:
<script>
    import { onMount } from 'svelte';

    onMount(() => {
        const handlePageUnload = () => {
            // 构造请求数据(无数据时可传空Blob)
            const requestData = new Blob([JSON.stringify({})], { type: 'application/json' });
            navigator.sendBeacon('/', requestData);
        };

        window.addEventListener('pagehide', handlePageUnload);

        return () => {
            window.removeEventListener('pagehide', handlePageUnload);
        };
    });
</script>

<h1>Welcome to SvelteKit</h1>
<p>Visit kit.svelte.dev to read the documentation</p>
  1. 修改+server.ts新增POST处理(和DELETE逻辑复用即可):
import { json } from "@sveltejs/kit";

export function DELETE(){
    console.log('delete');
    return json({message: 'delete'})
}

// 新增POST接口处理卸载请求
export async function POST() {
    console.log('delete via POST');
    // 复用DELETE的业务逻辑
    return json({message: 'delete via POST'})
}

内容的提问来源于stack exchange,提问作者Justin Chan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 08:52:50