【发布时间】:2011-07-09 22:49:21
【问题描述】:
我使用分块数据将 [script]dosomething()[/script] 标签推送到我的彗星服务器的 iframe 中,但脚本标签只会继续永远累积。如何在每个脚本标签后擦除它?
【问题讨论】:
标签: node.js comet long-polling server-push
我使用分块数据将 [script]dosomething()[/script] 标签推送到我的彗星服务器的 iframe 中,但脚本标签只会继续永远累积。如何在每个脚本标签后擦除它?
【问题讨论】:
标签: node.js comet long-polling server-push
P.S:当你想擦除脚本标签时,可能要关注Does comet server data in the iframe just accumulate?
我相信你应该close the connection after sometime(不好,请参阅Does comet server data in the iframe just accumulate?)它会自动释放与该请求相关的内存。然后,您当然需要重新连接。 This page 还说了别的:
“页面流”是指浏览器 几乎发现服务器变化 立即地。这打开了 实时更新的可能性 浏览器,并允许 双向信息流。 然而,它与 标准 HTTP 使用,这导致 几个问题。首先,有 不幸的记忆影响, 因为Javascript保持 积累,浏览器必须 将所有这些保留在其页面模型中。 在具有大量 更新,该模型将会增长 很快,在某些时候一页 刷新将是必要的,以便 避免硬盘交换,或更糟 命运。
这建议重新加载页面,这也是一个选项。但我认为关闭该连接(iframe)并重新连接也可能有效。
Comet 有很多问题需要解决:
这就是为什么我再次建议您使用 socket.io(见下文)来处理所有这些废话。
我建议您改用socket.io,这是非常好的产品。它是supported by all major browsers。如您所见,它支持多种传输方式(XHR、Websockets 等)并选择浏览器上可用的最佳传输方式以获得最佳性能。
【讨论】:
您可以通过在服务器打印块时添加一些代码来删除每次执行的脚本标签。
<script type="text/javascript">
// Calls your message handler
app.handle("Hello World");
// Removes this script element
var scripts = document.getElementsByTagName("script"),
elem = scripts[scripts.length - 1];
elem.parentNode.removeChild(elem);
</script>
压缩版
<script type="text/javascript">
app.handle("Hello World");
(function(){var a=document.getElementsByTagName("script"),a=a[a.length-1];a.parentNode.removeChild(a)})();
</script>
但是,正如 Alfred 提到的那样,隐藏 iframe 或永久 iframe 太烦人了。就我个人而言,我认为这种经典的方式让彗星看起来既不优雅又没有魅力。
我的建议是使用jQuery Stream,它提供了统一的基于WebSocket和HTTP协议的双向通信接口。它是一个轻量级的客户端 JavaScript 库,例如 jQuery。
jQuery Stream 使用的增强型 Iframe 传输在许多方面与经典传输不同,它要求仅包含消息的文本/纯文本响应而不是文本/html 响应,并且每次处理时都会清空响应。
根据某位用户test的说法,使用增强型Iframe传输的Internet Explorer 8对于几兆字节的消息是没有问题的(不像Firefox使用XMLHttpRequest作为传输,这真的很吃力)。
【讨论】: