在 onbeforeunload 事件中将请求发送回服务器

发布于 2025-01-07 05:45:04 字数 876 浏览 4 评论 0原文

当用户在我的应用程序中编辑记录时,我跟踪他们已将其“锁定”,以防止其他用户编辑它,直到第一个用户关闭窗口(或保存)。

我正在尝试将请求发送回服务器以解锁记录,但它在 Firefox 中不起作用。 onbeforeunload 事件在脚本中调用,但它不会将请求发送回服务器。 有什么想法吗?

<body>
<script>
    window.onbeforeunload = function (e) {
        doUnlock();
    }

function doUnlock() {
    if (navigator.appName == 'Microsoft Internet Explorer') {
        // works in IE (with an IFRAME)
        utilFrame.location.href = "/unlock.do?recordId=" + recordId;
    } else if (navigator.appName == 'Netscape') {
        // None of this works....
        //window.location.href = "/unlock.do?recordId=" + recordId;
        var req = newXMLHttpRequest();
        req.open("GET", "/unlock.do?recordId=" + recordId, true);
        req.send();
    } else {
        // Works for chrome
        window.open("/unlock.do?recordId=" + recordId);
    }
}

</script>

When a user edits a record in my application I track that they have it 'locked' to prevent another user from editing it until the first user closed the window (or saves).

I'm trying to send the request back to the server to unlock the record but it's not working in Firefox. The onbeforeunload event is called in script but it's not sending back the request to the server.
Any ideas?

<body>
<script>
    window.onbeforeunload = function (e) {
        doUnlock();
    }

function doUnlock() {
    if (navigator.appName == 'Microsoft Internet Explorer') {
        // works in IE (with an IFRAME)
        utilFrame.location.href = "/unlock.do?recordId=" + recordId;
    } else if (navigator.appName == 'Netscape') {
        // None of this works....
        //window.location.href = "/unlock.do?recordId=" + recordId;
        var req = newXMLHttpRequest();
        req.open("GET", "/unlock.do?recordId=" + recordId, true);
        req.send();
    } else {
        // Works for chrome
        window.open("/unlock.do?recordId=" + recordId);
    }
}

</script>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

沫离伤花 2025-01-14 05:45:04

newXMLHttpRequest 之间添加一个空格。

页面卸载时,任何挂起的 (AJAX) 请求都会被*取消。如果您必须在卸载时向服务器发送 AJAX 请求,请使用同步请求(不推荐!!!):

    var req = new XMLHttpRequest();
    req.open("GET", "/unlock.do?recordId=" + recordId, false); // false
    req.send();

我不推荐同步请求,因为用户界面会阻塞,直到请求完成为止。完成的。这对用户来说不太友好。

Add a space between new and XMLHttpRequest.

On page unload, any pending (AJAX) requests are *cancelled. If you have to send an AJAX request to the server on unload, use a synchronous request (not recommended!!!):

    var req = new XMLHttpRequest();
    req.open("GET", "/unlock.do?recordId=" + recordId, false); // false
    req.send();

I do not recommend the synchronous request, because the user interface blocks until the request has finished. That's not very user-friendly.

如若梦似彩虹 2025-01-14 05:45:04

您应该考虑使用基于时间的锁。当用户开始编辑记录时,使用时间戳将其锁定。每 30 秒从用户发送一次 ping,表明记录仍应被锁定。如果60秒内没有ping则解锁记录。

You should look into using a time based lock. When a user starts editing a record lock it with a timestamp. Every 30 seconds send a ping from the user that the record should still be locked. If there is no ping for 60 seconds unlock the record.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文