繁体   English   中英

Firefox不执行一个动态加载的程序<script> element until another is loaded

[英]Firefox doesn't execute one dynamically loaded <script> element until another is loaded

基于此页面 ,我正在使用脚本标签长轮询技术实现Comet。 在上一个问题之后,除了一个烦人的问题 ,我已经全部解决了,这仅在Firefox中发生。

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

  1. get_messages这是对来自应用程序的消息的持续轮询。
  2. initialise -这是启动时的一次性请求。

这两个同时发生-也就是说,它们的<script>标记都在DOM中同时存在。 (我可以在Firebug DOM检查器中看到它们。)服务器立即发送一些脚本作为对initialise请求的响应,但是直到有实际消息出现之前,它不会为get_messages请求发送任何内容。

在Firefox 3.5中,在initialise另一个<script>标记(对于get_messages )之前,不会执行在<script>标记中返回的用于initialise请求的<script> 在Chrome 3和IE 8中,它可以正常工作-脚本一收到就立即执行。

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

在我看来是一个加载顺序的问题。 Firefox始终确保排队的请求按请求的顺序执行。 IE 保证本(不知道关于Chrome)。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM