在卸载/卸载前使用 Javascript 发送帖子请求。那可能吗? [复制]

Posted

技术标签:

【中文标题】在卸载/卸载前使用 Javascript 发送帖子请求。那可能吗? [复制]【英文标题】:Sending a post Request with Javascript on unload/beforeunload. Is that possible? [duplicate] 【发布时间】:2014-02-09 06:56:28 【问题描述】:

补充:我不能使用 jQuery。我使用的是 Siemens S7 控制单元,它有一个微型网络服务器,甚至无法处理 80kB 的 jQuery 文件,所以我只能使用本机 javascript。从这个链接Ajax request with JQuery on page unload 我知道我需要使请求同步而不是异步。这可以用原生 Javascript 来完成吗?

我从这里复制了代码:JavaScript post request like a form submit

我想知道是否可以在使用 jquery beforeunload 或 unload 关闭窗口/选项卡/离开站点时调用它。应该可以吧?

function post_to_url(path, params, method) 
    method = method || "post"; // Set method to post by default if not specified.

    // The rest of this code assumes you are not using a library.
    // It can be made less wordy if you use one.
    var form = document.createElement("form");
    form.setAttribute("method", method);
    form.setAttribute("action", path);

    for(var key in params) 
        if(params.hasOwnProperty(key)) 
            var hiddenField = document.createElement("input");
            hiddenField.setAttribute("type", "hidden");
            hiddenField.setAttribute("name", key);
            hiddenField.setAttribute("value", params[key]);

            form.appendChild(hiddenField);
         
    

    document.body.appendChild(form);
    form.submit();

【问题讨论】:

【参考方案1】:

这是一种方法:

<body onunload="Exit()" onbeforeunload="Exit()">
    <script type="text/javascript">
        function Exit()
        
            Stop();
            document.body.onunload       = "";
            document.body.onbeforeunload = "";
            // Make sure it is not sent twice
        
        function Stop()
        
            var request = new XMLHttpRequest();
            request.open("POST","some_path",false);
            request.setRequestHeader("content-type","application/x-www-form-urlencoded");
            request.send("some_arg="+some_arg);
        
    </script>
</body>

请注意,请求可能必须是同步的(使用async=false 调用request.open)。

另一个值得注意的注意点:

如果客户端突然终止(例如,浏览器以“结束进程”或“关机”关闭),则不会触发onunload事件和onbeforeunload,并且不会发送请求到服务器。

【讨论】:

现在是blocked in Chrome。对于简单的用例(即从主要浏览器发布分析),您现在可以使用 navigator.sendBeacon()。 注意:MDN docs 明确建议反对使用sendBeaconbeforeunloadunload 事件

以上是关于在卸载/卸载前使用 Javascript 发送帖子请求。那可能吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Javascript Websockets在页面卸载时断开连接

react组件卸载前的钩子

要求卸载前关闭 Winforms 应用程序

如何在卸载前停用“Autodesk.VisualClusters”扩展?

如何在卸载开始前执行程序?

关闭 Chrome 窗口未在卸载事件处理程序中使用 sendBeacon 发送数据