2

编辑:这个问题可以总结如下:两个单独的 html 页面如何在不同的窗口中异步交换信息?


对于一个类项目,我必须构建一个基于 Web 的聊天客户端。教授提供了一个工作服务器。

我已经启动并运行了其中的一部分——任何连接的用户都可以向服务器发送消息,它将被转发给所有连接的用户并出现在他们的主聊天窗口中,类似于聊天室。

但是,客户端还需要具有发送/接收私人消息的选项。如果发送或接收私人消息,则会打开一个新窗口,显示仅用于与该用户通信的聊天界面。客户端向/从该用户发送/接收的任何未来私人消息都将显示在此窗口中,而不是主聊天室中。

完全不知所措。收到私信后,如何打开一个新窗口,然后继续与该窗口通信?如果通过主窗口的 websocket 连接从该用户接收到更多私人消息,则必须将它们发送到该窗口,如果从该窗口向其他用户发送消息,则必须通过主窗口的 websocket 连接中继它们。

如果可以做到的话,如何做到这一点?

4

3 回答 3

5

window.open返回window属于新打开的窗口的实例。如果在新窗口中打开的地址可以接受地属于同源策略,您可以修改它及其 DOM,就像您可以修改当前活动的窗口一样。

var w,
    someElement;
w = window.open('somepage.html', 'some window name', 'width=300,height=200');
someElement = w.document.getElementById('some-element-id');
于 2012-05-14T01:56:20.627 回答
0

我会这样处理它:

您的页面最初启动并使用 setTimeOut 类型函数对服务器进行 AJAX 调用,检查所有“公共”消息。当它想要发布消息时,它会执行另一个 AJAX 调用来发送公共消息。

我可能会向服务器添加另一个 AJAX 调用以询问“任何私人消息给我吗?” 服务器可以响应“是的,这是来自用户 ID 1234 的一个”。然后您可以使用 window.open 打开一个名为“FromUserID1234”或其他名称的窗口。存储该参考(使用一些 zzzzBow 的答案)。使用该参考,将来收到的任何私人消息,您都可以检查是否已经打开了私人消息窗口。如果是,请忽略它,如果不是,则创建一个。这也将允许您打开一个私人消息窗口,使用一段时间,关闭它,然后如果从同一用户收到另一个消息,它只会打开另一个窗口。

新窗口“FromUserID1234”然后使用 AJAX 与服务器通信,询问“您还有来自用户 ID 1234 的消息吗?”。服务器可以用新的响应,也可以发送消息。

抱歉,这本身不是确切的代码,但这是我开始定义问题的地方,然后只是构建通信接口以使这一切发生。

于 2012-05-14T02:17:54.103 回答
0

使用 SignalR。它专注于你想做的事情。快乐编码!:)

请参阅此链接:具有与 SignalR 的实时持久长期运行连接的异步可扩展 Web 应用程序

http://www.youtube.com/watch?v=1wh33W-09bk

于 2012-05-14T02:32:20.117 回答