代码之家  ›  专栏  ›  技术社区  ›  EMP

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

  •  1
  • EMP  · 技术社区  · 15 年前

    我正在使用脚本标记长轮询技术实现Comet,基于 this page . 从我的 previous question ,除了一个烦人的事情,我已经把它都处理好了,这只发生在火狐中。

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

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

    这两种情况同时发生——也就是说, <脚本& GT; 它们的标记同时存在于DOM中。(我可以在Firebug DOM检查器中看到它们。)服务器立即发送一些脚本作为对 初始化 请求,但它不发送 GETX消息 请求直到有消息,这可能需要一段时间。

    在Firefox 3.5中,脚本返回到 <脚本& GT; 标签 初始化 直到另一个请求 <脚本& GT; 标签(用于 获取\u消息 )同时加载!在Chrome3和IE8中,这个功能很好——脚本一收到就执行。

    为什么火狐会这样做?我该如何修复?我想我可以尝试在服务器上解决这个问题,同时发送一个虚拟的“消息” 初始化 回答,但这真是一个骇客。如果可能的话,我想理解并妥善解决这个问题。

    2 回复  |  直到 15 年前
        1
  •  3
  •   Jerod Venema    15 年前

    在我看来,这是一个装货单的问题。火狐总是确保排队的请求按照请求的顺序执行。工业工程协会 不是 确保这一点(不确定铬)。

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

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

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

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

        2
  •  0
  •   inklesspen    15 年前

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