我使用分块数据将 [script]dosomething()[/script] 标签推送到我的彗星服务器的 iframe 中,但脚本标签只会继续永远累积。如何在每个脚本标签后擦除它?
2 回答
擦除脚本标签
PS:当您想擦除脚本标签时,可能要遵循iframe 中的彗星服务器数据是否只是累积?
我相信您应该在一段时间后关闭连接(不好,请参阅iframe 中的彗星服务器数据是否只是累积? ),这会自动释放与该请求相关的内存。然后,您当然需要重新连接。此页面甚至还说了其他内容:
“页面流式传输”意味着浏览器几乎立即发现服务器更改。这开启了在浏览器中实时更新的可能性,并允许双向信息流。然而,它与标准的 HTTP 使用有很大的不同,这会导致几个问题。首先,存在不幸的内存影响,因为 Javascript 不断积累,浏览器必须在其页面模型中保留所有这些。在具有大量更新的丰富应用程序中,该模型将快速增长,并且在某些时候需要刷新页面以避免硬盘驱动器交换或更糟糕的命运。
这建议重新加载页面,这也是一个选项。但我认为关闭该连接(iframe)并重新连接也可能有效。
Comet 有很多问题需要解决:
- 正如您可以从这个 WIKI 页面中看到的那样,它还存在“可靠的错误处理方法,以及无法跟踪请求调用过程的状态”的问题。
- Internet Explorer 还需要发送一些垃圾来启动该过程(请参阅http://cometdaily.com/2007/11/05/the-forever-frame-technique/)
这就是为什么我再次建议您使用 socket.io(见下文)来处理所有这些废话。
套接字.io
我建议您改用socket.io,这是非常好的产品。所有主流浏览器都支持它。如您所见,它支持大量传输(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>
但是,隐藏的 iframe 或永远的 iframe 太烦人了,不能像 Alfred 提到的那样使用。就个人而言,我认为这种经典的方式让彗星看起来很不优雅,没有魅力。
jQuery 流
我的建议是使用jQuery Stream,它提供了统一的基于 WebSocket 和 HTTP 协议的双向通信接口。它是一个轻量级的客户端 JavaScript 库,例如 jQuery。
jQuery Stream 使用的增强型 Iframe 传输在许多方面与经典传输不同,它需要仅包含消息的文本/纯文本响应而不是文本/html 响应,并且每次处理时都会清空响应。
根据一些用户的测试,使用增强型 Iframe 传输的 Internet Explorer 8 对几兆字节的消息没有问题(不像 Firefox 使用 XMLHttpRequest 作为传输,这真的很吃力)。