Il est possible de si le symbole est un symbole que vous pouvez tester dans chaque script ou si chaque script peut exécuter un appel de fonction une fois le chargement terminé.
Chargement du script est facile, comme je suis sûr que vous savez: (. Vous verrez des gens à annexant head
au lieu, n'a pas d'importance, et body
est facile à trouver)
var script = document.createElement('script');
script.src = /* ... the source path ... */;
document.body.appendChild(script);
Mais le plus difficile est de savoir quand il a été téléchargé et exécuté. Les seules façons de le faire sont d'interroger pour voir si un nouveau symbole global défini par le script a été défini, ou en demandant au script de vous rappeler activement quand le chargement est terminé (a'la JSONP). De toute façon, une fois que vous avez détecté le symbole ou obtenu le rappel, vous passez au chargement du script suivant.
Voici un croquis rapide et sale de le faire sur la base de la recherche d'un symbole mondial (une propriété sur l'objet window
):
// The scripts to load
var scriptList = {
scripts: [
{
file : 'some-script.js',
callback: function() {
// do some code here
},
symbol : "someSymbol",
timeout : 30000 // We know this one is slow, give it 30 seconds
},
{
file : 'another-script.js',
callback: function() {
// do some code here
},
symbol : "anotherSymbol"
},
// ...
]
};
// Triggering the load
loadScripts(scriptList);
// Library routines to do the load
function loadScripts(list)
{
var index, timeout;
// Start with the first one (loadNextScript starts with an increment)
index = -1;
loadNextScript();
// This function loads the next script in the list; if there are no
// more, it simply returns
function loadNextScript()
{
var script;
// Are there more?
++index;
if (index < list.length)
{
// Yes, append a `script` element
script = document.createElement('script');
script.src = list.file;
document.body.appendChild(script);
// Determine when to time out
timeout = new Date() + (list[index].timeout || 20000); // Time out in Xms, default 20 seconds
// Start polling
setTimeout(pollForScript, 0); // Async, but almost immediately (4-10ms on most browsers)
}
}
// This function polls to see if the current script has loaded yet by
// checking for a global symbol it defines.
function pollForScript()
{
var result;
// Has it been too long?
if (new Date() > timeout)
{
// Yes
result = "timeout";
}
else
{
// Has the symbol been defined?
if (typeof window[list[index].symbol] !== "undefined")
{
// Yes
result = "loaded";
}
else
{
// Nope, keep waiting
setTimeout(pollForScript, 250); // Check every quarter-second
}
}
// Did we get a result?
if (result)
{
// Yes, do the callback telling it of the result
try {
list[index].callback(result);
}
catch (e) {
}
// Load the next script
loadNextScript();
}
}
}
** Hors-sujet **: Les virgules ballants après la dernière propriété dans votre littéraux d'objet vont être un problème pour vous dans certains navigateurs, les détails: http://blog.niftysnippets.org/2010 /09/literal-improvement.html –
J'ai placé cette virgule pour indiquer qu'il y aura plus que ces scripts à charger, de toute façon je vous remercie pour votre commentaire, aussi pour le poste, mais je ne pense pas que placer le temps d'attente est un bon idée, comme je prévois de faire quelque chose qui fonctionne universellement, peu importe le code de rappel qu'il contient .. –