iframe中的彗星服务器数据是否正在积累?
我使用分块数据将[dos] something()[/ script]标签推入到我的慧星服务器的iframe中,但是脚本标签只能持续积累。 如何在每个脚本标签之后擦除它?
擦除脚本标记
PS:当你想擦拭脚本标签,可能会跟随iframe中的彗星服务器数据是否积累?
我相信你应该在某段时间后closures连接 ( 不好,请参阅iframe中的彗星服务器数据是否正在累积? ),这会自动释放与该请求相关联的内存。 那么你当然需要重新连接。 这个网页甚至说了其他的东西:
“页面stream”意味着浏览器几乎立即发现服务器的变化。 这就在浏览器中实时更新的可能性,并允许双向信息stream。 但是,这与标准的HTTP使用很不一样,这会导致一些问题。 首先,有不幸的内存影响,因为JavaScript不断累积,浏览器必须保留所有的页面模型。 在大量更新的丰富应用程序中,该模型将快速增长,并且在某个时候需要进行页面刷新,以避免硬盘交换或更糟糕的命运。
这build议重新加载页面,这也是一个选项。 但我认为closures连接(iframe)和重新连接也可能工作。
彗星有很多问题需要破解:
- 正如你可以从这个WIKI页面上读到的,它也存在“可靠的error handling方法以及不可能跟踪请求调用过程的状态”的问题。
- 此外,Internet Explorer需要发送一些垃圾来启动进程(请参阅http://cometdaily.com/2007/11/05/the-forever-frame-technique/ )
这就是为什么我再次推荐你使用socket.io(见下文),这将照顾所有这些废话。
Socket.io
我build议你使用socket.io ,这是非常好的产品。 它受到所有主stream浏览器的支持 。 正如你所看到的,它支持大量的传输(XHR,Websockets等),并select最好的浏览器提供最好的性能。
擦除脚本标记而不重新连接
当服务器打印块时,可以通过添加一些代码来删除脚本标记。
<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或Forever Iframe太麻烦了,因为阿尔弗雷德提到。 就我个人而言,我认为这种古典的方式使彗星看起来无恩和无魅力。
jQuerystream
我的build议是使用jQuery Stream ,它通过WebSocket和HTTP协议提供统一的双向通信接口。 这是一个轻量级的客户端JavaScript库,如jQuery。
jQuery Stream使用的增强的Iframe传输在许多方面与传统的不同,它只需要包含消息而不是text / html响应的text / plain响应,并在每次处理时清空响应。
根据一些用户的testing ,使用增强的Iframe传输的Internet Explorer 8对于几兆字节的消息没有问题(不同于使用XMLHttpRequest作为传输的Firefox,这真的很困难)。