如果页面上有任何用户,则锁定表单

时间:2018-05-16 15:04:55

标签: javascript php jquery

我正在创建一个类似队列的页面,其中只有一个人应该能够一次编辑有关特定数据库条目的信息。

让我们说用户在页面profile.php?id=1上 - 只有加载此页面的第一个人才能对其进行更改。

我已尝试使用JavaScript / jQuery执行此操作,但遇到了问题。

在页面加载时,我向一个PHP文件发送一个AJAX请求,该文件实际上为特定ID设置了一个表格单元格为true。然后,我使用beforeunload事件在卸载页面时将此单元格设置为false。通过这种具体实现,存在一个问题。关闭选项卡时不会触发beforeunload事件,或者触发该事件并且AJAX请求没有时间完成。这是一个很大的问题,因为用户可能会加载页面,看到没有任何可编辑的内容,然后关闭选项卡而不考虑它,从而无限期地锁定页面,直到我手动反转数据库中的锁定 - 我会不想强迫人们不按照他们想要的方式使用他们的浏览器。

这是我的代码:

$( document ).ready(function() {

    var locked = <?=json_encode($data['in-review']);?>;

    if(locked) {
        $('input').attr('disabled', true);
        $('#delete-model-button').attr('disabled', true);
    $('#uidfield').attr('disabled', true);
        $('#submitbutton').attr('disabled', true).text("This model is in review by another reviewer.");
    } else {
        $.ajax({
            url: 'process/in-review.php',
            type: 'POST',
            data: {uid: $("#uidfield").val(), value: 1},
            success: function (result) {
                console.log("Model Locked in Review");
            }
        });

        $(window).on('beforeunload', function() {
            $.ajax({
                url: 'process/in-review.php',
                type: 'POST',
                data: {uid: $("#uidfield").val(), value: 0},
                success: function (result) {
                    console.log("Model Unlocked");
                }
            });
        });

    }

});

正如您所看到的,如果用户加载到已经被审查锁定的页面,则根本不会调用beforeunload进程,因为这将允许用户解锁另一个用户可能正在处理的表单。

如果用户关闭其标签页或浏览器,我该如何有效地解锁这些页面?

如果重要,请点击此处in-review.php页面

<?php

include('db.php');

$uid = $_POST['uid'];
$value = $_POST['value'];

$db->run("UPDATE `devices` SET `in-review`=? WHERE `uid`=?", [$value, $uid]);

- 编辑:

This被评为重复问题,但我不同意这一点。那个问题特别要求&#34; 可以使用卸载事件来可靠地激活ajax请求吗?&#34; - 我已经知道答案是&#34; &#34;,因为那是我正在使用的方法,我也知道它确实是完全用于关闭标签/浏览器,因此我的问题不是这是否是我想要做的可靠方法(我已经知道它不是),我要求一个不同的我可以用来做这个的方法。

1 个答案:

答案 0 :(得分:1)

您是否尝试在synchronous事件中调用Ajax beforeunload

$(window).on('beforeunload', function() {
    $.ajax({
        url: 'process/in-review.php',
        type: 'POST',
        async: false,
        data: {uid: $("#uidfield").val(), value: 0},
        success: function (result) {
            console.log("Model Unlocked");
        }
    });
});

这里的问题是浏览器需要保持与服务器的连接,直到请求完成。 当用户单击应用程序中的其他页面时,表示与服务器的连接处于活动状态且操作可以完成,并且在浏览器/选项卡关闭时,与服务器的关闭将丢失。

这可能适用于某些情况,即您的服务器足够快以在完成浏览器关闭之前响应,即在窗口对象中销毁