2009-11-25 78 views
1

我使用基于this page的脚本标记长轮询技术实现Comet。继我的previous question后,我已经完成了所有工作,除了一个烦恼,只发生在Firefox。Firefox不执行一个动态加载的<script>元素,直到加载另一个元素

在初始页面加载我的Comet客户端的JavaScript发送两个请求到彗星服务器(在动态生成<script>标签被添加到DOM的形式):

  1. get_messages - 这是正在进行的调查来自应用程序的消息。
  2. initialise - 这是启动时的一次性请求。

这两个发生在同一时间 - 也就是说,他们两个的<script>标签存在于DOM相同。 (我可以在Firebug DOM检查器中看到它们)。服务器立即发送一些脚本作为对initialise请求的响应,但它不会发送任何请求给get_messages请求,除非实际上有消息,这可能需要一段时间。

在Firefox 3.5中<script>标记为initialise请求返回的脚本没有得到执行,直到其他<script>标记(get_messages)还加载!在Chrome 3和IE 8中,这种方式运行良好 - 只要收到脚本,脚本就会立即执行。

为什么Firefox会这样做,我该如何解决?我想我可以尝试通过在initialise响应的同时发送一个虚拟的“消息”来解决它在服务器上的问题,但这是相当黑客。如果可能,我想理解并正确解决此问题。

回答

3

对我来说似乎是加载顺序的问题。 Firefox始终确保排队的请求按请求的顺序执行。 IE做不是确保这一点(不知道关于Chrome)。无论如何,如果你不应该在初始化代码之后调用get_messages,那么你仍然希望在初始化函数的回调中触发该请求。无论如何,你都会这样做,因为其他浏览器也可能不一致。当然,IE6的加载顺序与其他浏览器的工作方式不同 - 在长轮询请求完成之前它不会继续加载DOM,因此,您只能等待较长的轮询时间间隔才能看到主DOM负载。

如果您需要详细信息,可以查看我们的JavaScript客户端的源代码,但是在构建ASP.NET Comet服务器WebSync时遇到了类似的问题。来源可以在这里查看:

http://sync.frozenmountain.com/client.ashx?debug=true 

搜索“ie6”查看一些解决方法。

+0

谢谢,这是有道理的。不幸的是,它并不能解决我的问题,因为get_messages请求会在任何给定的时间运行,并且可以随时发送新的订阅请求。 我不得不在原帖(还有一些)中提到的黑客攻击,这让它工作。我还没有在IE6中测试过,但幸运的是这是给内部用户使用的,IE6不受支持。 – EMP 2009-11-29 22:12:28

0

我不知道为什么会出现这种情况,但也许一个简单的解决方法是仅在初始化请求完成后添加get_messages <script>标记。 (我认为你有一些处理初始化请求响应的回调。)

相关问题