0

我正在将一个手动写入脚本标签的应用程序迁移到一个使用 YUI3 加载程序来管理脚本依赖项的应用程序。我遇到了不应加载两次的脚本(如 jQuery)的问题,因为在某些情况下,遗留代码会将脚本放在页面上,然后 YUI 加载器稍后会再次加载它。有没有办法防止这种情况发生?看起来加载器应该能够在注入新标签之前查询与它要创建的具有相同 src 的脚本标签。

4

2 回答 2

0

事实证明,这样做的一种方法是主动调用 Y.add() 模块名称。这适用于本身没有用 Y.add() 定义的模块(例如 jQuery 插件)。但是,如果您对使用 Y.add() 定义的模块执行此操作,则会出现潜在的竞争情况。例如,考虑以下序列:

  1. 运行模块 A 的脚本(调用 Y.add('A', ...))
  2. YUI 在运行回调之前开始加载模块 A 的需求
  3. Y.add('A') 再次调用空回调(通知 YUI A 的脚本文件在页面上)
  4. YUI 由于异步加载尚未返回,YUI 将空回调作为 A 的定义

解决方法是使用以下脚本:

var preloadedModules = ['a', ... ]; // list of module scripts already on the page
    , noop = function (Y) { }, version = '@VERSION@', i, len, moduleName;
for (var i = 0, len = preloadedModules.length; i < len; ++i) {
    moduleName = preloadedModules[i];
    if (!YUI.Env.mods[moduleName]) { // avoids overwriting YUI module definitions
        YUI.add(moduleName, noop, version);
    }
}
于 2013-10-28T18:27:33.363 回答
0

大约 3 / 4 的视频 你将看到如何加载不是为 YUI 编写的外部模块并通知加载器它已经加载,因此它不会尝试执行两次。基本上,您监视加载程序的 onProgress 事件,当它触发时,您调用 YUI.add() 并使用您要为模块指定的名称,然后加载程序将该模块标记为已加载。

于 2013-10-05T16:57:47.963 回答