在卸载/卸载前使用 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 明确建议反对使用sendBeacon
与beforeunload
和unload
事件以上是关于在卸载/卸载前使用 Javascript 发送帖子请求。那可能吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
Javascript Websockets在页面卸载时断开连接