LABjs错误:脚本总是使用.script()来执行加载的序列

LABjs bug : scripts always excuted the sequence they are loaded using .script()

本文关键字:执行 加载 script 脚本 错误 LABjs      更新时间:2023-09-26

当我用LABjs做一些测试用例时,我遇到了一些问题,下面是代码:

$LAB.script('http://code.jquery.com/jquery-1.8.0.min.js')
    .script('http://id.qq.com/js/10001/simple.js');

根据API的描述,jquery-1.8.0.min.js和simple.js的执行顺序没有保证。我用fiddler阻止了jquery-1.80.min.js,我的服务器是:

  1. 它在IE8中运行得很好,当simple.js下载完成后,它立即执行了
  2. 在chrome20中,simple.js在jquery-1.8.0.min.js完成下载并执行之前从未执行过

是虫子吗?

然后我在chrome 20中做了另一个测试,代码是:

var script = document.createElement('script');
script.type = 'text/cache';
script.src = 'http://code.jquery.com/jquery-1.8.0.min.js';
document.head.appendChild(script);

jquery-1.8.0.min.js在我运行这段代码时没有开始下载,是问题吗?

以下是api描述:http://labjs.com/documentation.php#script

您有两个问题,让我分别回答:

  1. 如果"jquery.js"在Chrome 20中被阻止,为什么"simple.js"不运行,而在IE8中却能正常工作?

    嗯,我不完全知道为什么会这样。这可能不是LABjs中的错误,但可能是Chrome的一个怪癖。根据规范,它应该按ASAP顺序运行,这意味着"simple.js"不应该等待"jquery.js"。除了浏览器有怪癖/错误之外,唯一的其他解释是,如果你在代码中的某个地方设置了$LAB.setGlobalDefaults({AlwaysPreserveOrder:true}),因为这会导致阻塞行为,就像在两者之间有wait()一样。

    为了排除这种情况,您可以将代码段更改为$LAB.setOptions({AlwaysPreserveOrder:false}).script(...)...以显式禁用自动wait()行为吗?

  2. 如果脚本元素的type属性不是可识别的有效类型,Webkit(大致为Chrome 11'ish)将停止获取脚本元素。因此,"text/cache"应该被忽略,并且不能在Chrome 20(以及除IE<=9之外的所有其他浏览器)中开始下载,因为这就是规范所说的。在LABjs的源代码中看到这种技术的地方,它实际上被用作最后一种情况下的回退,它只适用于那些真正旧的/遗留的webkit浏览器,因为它在很久以前就可以工作了。