我试图实现我从24Ways.org上的一篇旧文章中找到的资产/依赖项加载器。你们大多数人可能会熟悉它。这是从这篇文章由基督教海尔曼:如何在需求下加载相关文件+检查它们是否加载?
http://24ways.org/2007/keeping-javascript-dependencies-at-bay
我修改了脚本加载CSS文件以及。现在已经非常接近我想要的了。但是我仍然需要做一些检查,看看资产是否已经完全加载。
只是想知道,如果你们有什么想法:)
这里就是我的剧本目前看起来像:
var assetLoader = {
assets: {
products: {
js: 'products.js',
css: 'products.css',
loaded: false
},
articles: {
js: 'articles.js',
css: 'articles.css',
loaded: false
},
[...]
cycle: {
js: 'jquery.cycle.min.js',
loaded: false
},
swfobject: {
js: 'jquery.swfobject.min.js',
loaded: false
}
},
add: function(asset) {
var comp = assetLoader.assets[asset];
var path = '/path/to/assets/';
if (comp && comp.loaded == false) {
if (comp.js) {
// load js
var js = document.createElement('script');
js.src = path + 'js/' + comp.js;
js.type = 'text/javascript';
js.charset = 'utf-8';
// append to document
document.getElementsByTagName('body')[0].appendChild(js);
}
if (comp.css) {
// load css
var css = document.createElement('link');
css.rel = 'stylesheet';
css.href = path + 'css/' + comp.css;
css.type = 'text/css';
css.media = 'screen, projection';
css.charset = 'utf-8';
// append to document
document.getElementsByTagName('head')[0].appendChild(css);
}
}
},
check: function(asset) {
assetLoader.assets[asset].loaded = true;
}
}
基督教解释了他的非常详细的文章此方法。我不想再迷惑你们与我的英文不好:P
这里有一个如何我运行该脚本的例子:
...
// load jquery cycle plugin
if (page=='tvc' || page=='products') {
if (!assetLoader.assets.cycle.loaded) {
assetLoader.add('cycle');
}
}
// load products page assets
if (!assetLoader.assets.products.loaded) {
assetLoader.add('products');
}
...
这种做法很有问题,虽然。 Coz资产异步加载,这意味着products.js
内的一些代码依赖于jquery.cycle.js
的代码可能会在jquery.cycle.js
甚至加载之前继续运行,从而导致错误。
虽然我很清楚脚本可以附加一个onload事件,但我真的不知道如何实现它到我的脚本。任何人都在意帮助我?请...:P
你可能是对有关CSS,他们的总大小组合和gzip压缩的是大约30 KB。也许我正在优化这个。 我会看看那些你找到的参考。多谢。 我也在这里找到了一个可能有用的线程。发现一些有趣的链接:) http://stackoverflow.com/questions/2043799/javascriptlazy-loading-and-dependency-resolution – RZKY 2010-04-08 03:30:13