【问题标题】:Drag and drop With Socket io使用 Socket io 拖放
【发布时间】:2021-12-04 00:38:03
【问题描述】:

我正在使用 node、express 和 socket io 创建一个多人纸牌游戏。我无法将一名玩家的拖放操作传递到连接的另一名玩家的屏幕上。

基本上我使用这个函数来处理客户端的 drop 事件。我得到移动卡的 ID,然后将其附加到移动的放置区

function handleBoxDrop(e) {
    const id = e.dataTransfer.getData('text');
    let dropzone = e.target;
    socket.emit('drop', id);

    socket.on('drop', (id) => {
      let temp = document.getElementById(id);
      dropzone.appendChild(temp);
    });

    e.dataTransfer.clearData();
  }

在服务器端我使用了这个:

o.on('connection', (socket) => {
  console.log('a user connected');
  socket.on('drop', (id) => {
    io.emit('drop', id);
  });
});

但是当我移动卡片时,卡片在其他浏览器上没有移动或移动到错误的位置。我不知道我做错了什么,请帮忙。谢谢:)

【问题讨论】:

    标签: javascript node.js express socket.io drag-and-drop


    【解决方案1】:

    您需要将 socket.on 函数移到句柄放置函数之外

    function handleBoxDrop(e) {
       '''your code'''
    }
    
    socket.on('drop', e => {
       '''append to dropzone'''
    })
    

    socket.on 方法创建一个监听器,并且只需要创建一次。您可以在实例化套接字对象后立即调用它。

    const socket = websocket()
    socket.on('drop', e => {})
    

    【讨论】:

    • 如果我将 socket.on 移到句柄 drop 函数之外,那么我将无法访问 e.target(dropzone) 来 appendChild
    • 事件目标应该是您要移动的对象。如果您有一个放置区,则应将其存储为放置函数范围之外的变量。如果您有多个放置区,您也应该通过 Web 套接字传递您想要使用的放置区。每次调用此函数时,都会为“drop”事件创建一个新的 even 监听器。这会导致问题,你只需要一个
    • 你太棒了。谢谢。我在 socket.emit() 中传递了 dropzone id,就像我为卡 id 所做的那样,这就成功了。不知道为什么我从来没想过。谢谢人
    猜你喜欢
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    • 1970-01-01
    • 2015-03-23
    • 1970-01-01
    相关资源
    最近更新 更多