У меня была похожая задача несколькими днями ранее, и вот как я это сделал.
Этот загрузчик работает как с префиксами file://
, так и с http://
и https://
, и является перекрестнымсовместимый с браузером.
Однако он не может загружать определенные классы или функции как модули из скриптов;он полностью загрузит весь скрипт и сделает его доступным для DOM.
// Loads a script or an array of scripts (including stylesheets)
// in their respective index order, synchronously.
// By Sayanjyoti Das @https://stackoverflow.com/users/7189950/sayanjyoti-das
var Loader={
queue: [], // Scripts queued to be loaded synchronously
loadJsCss: function(src, onl) {
var ext=src.toLowerCase().substring(src.length-3, src.length);
if(ext=='.js') {
var scrNode=el('script', null, null, null);
scrNode.type='text/javascript';
scrNode.onload=function() {onl();};
scrNode.src=src;
document.body.appendChild(scrNode);
}else if(ext=='css') {
var cssNode=el('link', null, null, null);
cssNode.rel='stylesheet';
cssNode.type='text/css';
cssNode.href=src;
document.head.appendChild(cssNode);
onl();
}
},
add: function(data) {
var ltype=(typeof data.src).toLowerCase();
// Load a single script
if(ltype=='string') {
data.src=data.src;
Loader.queue.splice(0, 1, data, Loader.queue[0]);
Loader.next();
}
// Load an array of scripts
else if(ltype=='object') {
for(var i=data.src.length-1; i>=0; i--) {
Loader.queue.splice(0, 1, {
src: data.src[i],
onload: function() {
if(Loader.next()==false) {
data.onload();
return;
}
Loader.next();
}
}, Loader.queue[0]);
}
Loader.next();
}
},
next: function() {
if(Loader.queue.length!=0 && Loader.queue[0]) {
var scr=Loader.queue[0];
// Remove the script from the queue
if(Loader.queue.length>1)
Loader.queue.splice(0, 2, Loader.queue[1]);
else
Loader.queue=[];
// Load the script
Loader.loadJsCss(scr.src, scr.onload);
}else return false;
}
};
Вышеприведенная функция очень мощная и элегантная ;это позволяет вам загружать один скрипт или массив скриптов синхронно (т. е. следующий скрипт не загружается до завершения предыдущей загрузки скрипта).Кроме того, загруженный сценарий может загружать больше сценариев, что задерживает очередь в родительском сценарии.
Кстати, здесь сценарий означает файл JavaScript или таблицу стилей CSS .
Вот как это использовать: -
// Load a single script
Loader.add({
src: 'test.js',
onload: function() {
alert('yay!');
}
});
// Load multiple scripts
Loader.add({
src: ['test1.js', 'test2.js', 'mystyles.css', 'test3.js'],
onload: function() {
alert('all loaded!');
}
});
Обратите внимание, что функция onload
в аргументах Loader вызывается при загрузке всех скриптов, а не когда один илизагружается один сценарий.
Вы также можете загрузить больше сценариев в загруженные сценарии, например, в test.js
, test1.js
и т. д. Таким образом, вы отложите загрузку следующего родительского сценария.и очередь в дочернем скрипте будет иметь приоритет.
Надеюсь, это поможет: -)