【问题标题】:Serializing/mirroring JavaScript mouse/touch events序列化/镜像 JavaScript 鼠标/触摸事件
【发布时间】:2011-11-22 22:01:37
【问题描述】:

我想通过理想地序列化并将它们从浏览器 A 发送到浏览器 B 来镜像两个浏览器之间的 JavaScript 鼠标/触摸事件。 鼠标事件对象似乎包含循环引用,因此不可序列化。

我最终想要实现的是在远程浏览器中引发与本地浏览器相同的事件。

鉴于事件引用了本地 DOM 对象,很可能使用鼠标或触摸事件不是可行的方法。任何提示/想法表示赞赏。

【问题讨论】:

  • 你到底想在这里完成什么?可以使用weinrejs-test-driver 等远程工具来完成吗?
  • 这不是为了测试。我想将用户的手势从一台设备发送到另一台设备。如果用户 A 在运行 Safari 的 iPad 前,我想将触摸手势发送到另一个浏览器。传输层很简单,我只需要找到可以通过网络发送的 JavaScript 构造。

标签: javascript touch mouseevent


【解决方案1】:

您可能需要做的是确定要传输的属性、变量等的子集。将它们存储在可以序列化的对象文字中。由于您将自己构建对象,因此您可以控制循环引用。

对于您的事件,您需要为需要捕获的任何内容设置事件侦听器。

我可能会建议研究 Backbone.js 之类的东西。它提供了一些有趣的功能,例如可能对您有所帮助的键/值观察。

此外,这听起来像是 node.js 非常适合的应用程序。由于它还支持 Backbone,您可以想象创建一个客户端和服务器 js 环境,在事件、变量等方面相互镜像。当 iPad 上的用户执行更新客户端模型的操作时,这些更改可以序列化并发送到节点服务器。然后它将更新其客户端模型的内部表示,并使用诸如 socket.io 之类的东西将这些更改推送到其他客户端。

【讨论】:

  • +1 用于提出 WebSockets - 实际上这正是我想要实现的。我使用 Kaazing WebSocket 服务器而不是 node.js 来执行超高性能任务......不过,谢谢你的想法!
【解决方案2】:

在我看来你有两个不同的问题:

  1. 如何捕获和序列化鼠标事件。这很简单。
  2. 如何在另一个上下文中重新创建这些鼠标事件。这很棘手。

即使不使用像 jQuery 这样的库,捕获鼠标事件也相当简单(尤其是如果,正如您所暗示的,您可以确定客户端将使用的浏览器)。你需要做的就是监听事件,获取你需要的信息,然后通过你的传输层发送,例如

document.body.addEventListener('click', function(e) {
    sendToOtherBrowser({ type: 'click', pageX: e.pageX, pageY: e.pageY });
}, false);

我不知道对于大多数活动,您需要的不仅仅是活动类型和地点。更难的部分是获取此事件数据并在其他地方重新创建它。为此,正如我认为您注意到的那样,您需要:

  1. 同时捕获e.target
  2. 为 DOM 元素提供一个可序列化的唯一 ID
  3. 将 ID 与您的活动数据一起发送
  4. 在其他浏览器中使用唯一 ID 获取对 DOM 元素的引用
  5. 使用myUniqueElement.dispatchEvent 之类的内容重新创建事件

我想说 (2) 和 (4) 是这里比较棘手的部分 - 您可以查看 these related questions 以获得想法。对于(5),你可以看看event simulation examples here

说了这么多,我不知道这对触摸事件有什么作用——它可能不像鼠标事件那么容易(已经不那么容易了)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-03
    • 2013-08-13
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多