Firefox 不对动态脚本注入执行“异步”加载?

Posted

技术标签:

【中文标题】Firefox 不对动态脚本注入执行“异步”加载?【英文标题】:Firefox doesn't do "asynchronous" load on dynamic script injection? 【发布时间】:2011-05-31 10:56:29 【问题描述】:

我有 2 个 js 函数,request() 和 response()。 请求向 DOM 注入动态脚本标签,从服务器加载一些“脚本”。 来自服务器的脚本设置为调用 response()。

现在,如果我立即一个接一个地进行 5 次调用,并且如果第一个仍在等待,那么接下来的 4 次调用仍在进行,响应返回(我从 Firebug 看到),但没有调用 response()直到第一个返回。 这仅在 Firefox 中发生。 :(

为什么这不进行函数调用?

PS:

    如果第一个请求被延迟,我 不在乎结果,我要 最后一个要加载的和 毫不拖延地调用响应.. 我尝试了将 dataType 设置为 'jsonp' 的 $.ajax、脚本标签的纯 javascript 样式插入和 $.getScript。 FF 似乎没有什么能很好地工作:(

编辑:对于那些要求代码示例的人:

function request()

    var URL = 'http://xxx.xxx.xxx.xxx/cgi-bin/response.php?callback=?';
    callHandle = $.getScript(URL);



function response(data)

      alert(data);

请求函数调用服务器的php脚本,代码如下:

$data = $_GET['callback']; //using just to identify request uniquely.
sleep(rand(1,10));
echo "response(".$data.")";

现在,如果第一个请求需要 10 秒,第二个请求需要 2 秒,则应为第二个请求回调响应。但它正在获得响应,而不是警报,它正在等待第一个请求在 Firefox 中完成。为什么会这样?

【问题讨论】:

如何通过request()将脚本标签注入DOM? 请贴一些代码。没有它就很难猜出哪里出了问题。 用代码编辑了原始问题。 【参考方案1】:

我见过同样的事情:Firefox 按照脚本元素附加到文档的顺序处理返回响应(使用 document.createElement('script') 完成的 JavaScript 包含并将它们附加到 Head-Node) .从程序员的角度来看,这简化了编程。但是,我认为您应该将此视为此浏览器(版本)的实现细节,而不是保证。 Google chrome 以任何(意外)顺序执行包含的脚本。

在查看 Firefox 4 和 html5 合规性 (http://hsivonen.iki.fi/script-execution/) 时,此行为已被称为“旧的 firefox 行为”

旧的 firefox 行为

脚本插入的外部非异步, 中执行的非延迟脚本 为了将它们插入 文件。

您是否尝试过使用 document.write 插入脚本?

【讨论】:

【参考方案2】:

除非出于教育原因,否则我建议使用专门处理这些浏览器特性的库。例如:http://code.google.com/p/controljs/

【讨论】:

以上是关于Firefox 不对动态脚本注入执行“异步”加载?的主要内容,如果未能解决你的问题,请参考以下文章

js异步加载

js判断异步引入的js文件是否加载完毕

通过动态创建的脚本标签异步加载 JavaScript 的 CORS 问题

动态加载js

判断JS是否加载完成

在 div 容器内动态调用异步脚本