【问题标题】:Sending a post Request with Javascript on unload/beforeunload. Is that possible? [duplicate]在卸载/卸载前使用 Javascript 发送帖子请求。那可能吗? [复制]
【发布时间】: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();
}

【问题讨论】:

    标签: javascript http-post


    【解决方案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 事件
    猜你喜欢
    • 2017-09-01
    • 2021-11-04
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 2011-05-21
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多