LABjs bug:脚本总是使用.script()来处理它们加载的序列

时间:2012-08-26 09:53:13

标签: javascript google-chrome labjs

当我用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.8.0.min.js,我的boserverd是:

  1. 它在IE8中运行正常,当simple.js完成下载后,立即执行。
  2. 在chrome 20中,simple.js从未执行过,直到jquery-1.8.0.min.js完成下载并执行。
  3. 这是一个错误吗?

    然后我在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 个答案:

答案 0 :(得分:0)

你有两个问题,所以让我分开来看看:

  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浏览器,因为它当时的DID工作方式。