Я пытаюсь реализовать загрузчик ресурсов / зависимостей, который я нашел в старой статье на 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