在加载另一个</script>之前,Firefox不会执行一个动态加载的<script>元素

时间:2009-11-25 21:58:02

标签: javascript ajax firefox dom comet

我正在使用脚本标记长轮询技术实现Comet,基于this page。继我的previous question之后,我已经完成了所有工作,除了一个烦恼,只发生在Firefox中。

在初始页面加载时,我的Comet客户端JavaScript向Comet服务器发送两个请求(以动态生成的<script>标记的形式附加到DOM):

  1. get_messages - 这是对来自应用程序的消息的持续轮询。
  2. initialise - 这是启动时的一次性请求。
  3. 这两个发生在同一时间 - 也就是说,它们的<script>标签同时存在于DOM中。 (我可以在Firebug DOM检查器中看到它们。)服务器立即发送一些脚本作为对initialise请求的响应,但它不发送get_messages请求的任何内容,直到实际出现消息,这可能需要一段时间。

    在Firefox 3.5中,<script>请求的initialise标记中返回的脚本在其他<script>标记(get_messages)也加载之前不会执行!在Chrome 3和IE 8中,这很好用 - 脚本会在收到后立即执行。

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

2 个答案:

答案 0 :(得分:3)

我觉得这是一个加载顺序的问题。 Firefox始终确保排队的请求按请求的顺序执行。 IE确实 NOT 确保这一点(不确定Chrome)。

无论如何,如果你不应该在初始化代码之后调用get_messages,你仍然希望在初始化函数的回调中触发该请求。无论如何,您都希望这样做,因为其他浏览器也可能不一致。 IE6肯定与其他浏览器在加载顺序方面的工作方式不同 - 在长轮询请求完成之前它不会继续加载DOM,所以你不得不等待你的长轮询间隔只是为了看到主要DOM负载。

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

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

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

答案 1 :(得分:0)

我不确定为什么会发生这种情况,但也许一个简单的解决方法是只在初始化请求完成后添加get_messages <script>标记。 (我假设你有一些回调来处理初始化请求的响应。)