gpt4 book ai didi

javascript - 使用 socket.io 发送鼠标点击事件

转载 作者:行者123 更新时间:2023-11-30 15:51:15 24 4
gpt4 key购买 nike

我正在尝试使用 socket.io 和 node.js 从客户端向服务器发出鼠标单击事件。问题是发出后,我发送的词典没有作为一个整体发送。这是我的代码:

客户端:

document.addEventListener('click', function(event){
console.log("event sent", event.target,event);
var target = event.target;
var myClick = {id: target, event: event};
console.log(myClick);
socket.emit('myClick', myClick);
})

socket.on('myClick', function(data){
console.log("event received", data);
document.querySelectorAll(data.id).dispatchEvent(data.event);
});

在正文上注册点击事件后,控制台会记录此信息:

event sent <body>​…​</body>​ 
MouseEvent {isTrusted: true, screenX: 1145, screenY: 499, clientX: 1040, clientY: 398…}
Object {id: body, event: MouseEvent}

其他页面在收到事件后记录:

event received Object {id: Object, event: Object}

但是,扩展 Object 给了我们这个:

event: Object
isTrusted: true
__proto__: Object
id: Object
__proto__: Object
__proto__: Object

所以它没有接收到整个事件并且 id 没有事件目标。

服务器端:

io.sockets.on('connection', function (socket) {
console.log("socket connected");
console.log(socket);
socket.on('myClick', function (data) {

console.log("myClick in server.js");
console.log(socket);
console.log(data);
socket.broadcast.emit('myClick', data);
});
});

当服务器在“myClick”上接收到某些内容时,它会打印出以下内容:

myClick in server.js
{ id: {}, event: { isTrusted: true } }

如您所见,目标是空的,应该是完整事件对象的只有 isTrusted 值。有没有人遇到过这个问题?任何帮助,将不胜感激。我尝试这样做的方式是基于 this Stack Overflow 回答,但他们使用的是 jQuery 而我只使用 Javascript。

最佳答案

socket.io 尝试将您传递给它的参数转换为 JSON。 DOM 对象等一些东西无法转换为 JSON,并且要么触发错误,要么导致东西被忽略。因此,您不能发送 event.target。它是一个 DOM 对象,您不能将 DOM 对象发送到您的服务器。您必须发送可以转换为字符串的内容。例如,您可以发送 event.target.id

我建议您做的是,与其尝试发送包含许多无法发送的内容(例如 DOM 对象)的整个 event 对象,不如创建一个新对象并仅复制您实际需要发送的属性。并且,确保您发送的内容不包含 DOM 对象,并且不包含任何循环引用或其他无法转换为 JSON 的内容。

我不确切地知道您需要 event 对象的哪些属性,但总体思路如下:

document.addEventListener('click', function(event){
// create new object with just the things we need from the event object
// this must contain only things that can be converted into JSON
var clickData = {
id: event.target.id,
timeStamp: event.timeStamp,
type: event.type,
clientX: event.clientX,
clientY: event.clientY
};
socket.emit('myClick', clickData);
});

关于javascript - 使用 socket.io 发送鼠标点击事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39296328/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com