Websocket:许多用户同时拖动一项

时间:2019-07-23 06:38:48

标签: jquery websocket drag-and-drop draggable drag

我正在使用jquery拖放,使用websocket拖放。当用户拖动拖放项时,它将自动在其他用户屏幕上更新。像这个视频一样:https://youtu.be/JHndS1ps_f0

我想要当用户拖动成员时,其他用户不能拖动该成员。这是我的代码:

var socket = new WebSocket('ws://' + window.location.host + '/ws');
var id_user = $(".id_user").attr('data-id');
    $(".item").draggable({
        revert: true,
        revertDuration: 0,
        drag: function( event, ui ) {
            var team_id_previous = $(this).attr('data-id-team');
            var member_id = $(this).attr('data-id-member');
            // Send to server
            socket.send(
                JSON.stringify({
                    team_id_previous: team_id_previous,
                    member_id: member_id,
                    user_id: id_user,
                    type: "drag"
                })
            );
        }
    });

从服务器监听味精:

socket.onmessage = function (e) {
        var msg = JSON.parse(e.data);
        var item = $("[data-id-member=" + msg.member_id + "][data-id-team=" + msg.team_id_previous + "]");
        if (msg.type === "drag" && msg.user_id != id_user) {
            item.draggable('disable');
            item.css("background-color", "gainsboro");
        }
};

如果我依次拖动,在此屏幕上拖动,然后在另一个屏幕上拖动,也可以将其禁用。但是,当许多人同时拖动一个成员时,等待时间几乎为0,那么两者都可以拖动。我该怎么办才能解决这个问题。谢谢。

1 个答案:

答案 0 :(得分:0)

通过记住每个可拖动对象的负责人来让服务器进行仲裁。当您收到一条拖动消息时,请查阅负责人的地图以检查是否有人在拖动它;如果不是当前用户,则发送回取消消息,否则广播拖动。此外,如果没有可拖动的相关拖动项,请输入当前用户(套接字ID)作为其拖动项。当拖动停止(或断开连接)时,请删除相关的负责拖动项。