J'utilise plusieurs plugins, widgets personnalisés et quelques autres bibliothèques de JQuery. par conséquent, j'ai plusieurs fichiers .js et .css. J'ai besoin de créer un chargeur pour mon site car le chargement prend un certain temps. ce sera bien si je peux afficher le chargeur avant d'importer tous les:
<script type="text/javascript" src="js/jquery-1.6.2.min.js"></script>
<script type="text/javascript" src="js/myFunctions.js"></script>
<link type="text/css" href="css/main.css" rel="stylesheet" />
...
....
etc
J'ai trouvé plusieurs tutoriels qui me permettent d'importer une bibliothèque JavaScript de manière asynchrone. par exemple, je peux faire quelque chose comme:
(function () {
var s = document.createElement('script');
s.type = 'text/javascript';
s.async = true;
s.src = 'js/jquery-ui-1.8.16.custom.min.js';
var x = document.getElementsByTagName('script')[0];
x.parentNode.insertBefore(s, x);
})();
pour une raison quelconque, lorsque je fais la même chose pour tous mes fichiers, les pages ne fonctionnent pas. J'essaie depuis si longtemps d'essayer de trouver où se situe le problème, mais je ne le trouve tout simplement pas. J'ai d'abord pensé que c'était probablement parce que certaines fonctions javascript dépendaient des autres. mais je les ai chargés dans le bon ordre en utilisant la fonction de temporisation quand l'un est terminé, j'ai continué avec le suivant et la page se comporte toujours bizarrement. par exemple je ne peux pas cliquer sur les liens etc ... les animations fonctionnent quand même ..
Quoi qu'il en soit
Voici ce à quoi j'ai pensé ... Je pense que les navigateurs ont un cache, c'est pourquoi il faut beaucoup de temps pour charger la page pour la première fois et la prochaine fois c'est rapide. donc ce que je pense faire est de remplacer ma page index.html par une page qui charge tous ces fichiers de manière asynchrone. quand ajax a fini de charger tous ces fichiers, redirigez vers la page que je prévois d'utiliser. lors de l'utilisation de cette page, le chargement ne devrait pas prendre longtemps car les fichiers doivent déjà être inclus dans le cache du navigateur. sur ma page d'index (page où les fichiers .js et .css sont chargés de manière asynchrone) je ne me soucie pas des erreurs. Je vais simplement afficher un chargeur et rediriger la page une fois terminé ...
Cette idée est-elle une bonne alternative? ou devrais-je continuer à essayer d'implémenter les méthodes de manière asynchrone?
ÉDITER
la façon dont je charge tout asynchrone est comme:
importScripts();
function importScripts()
{
//import: jquery-ui-1.8.16.custom.min.js
getContent("js/jquery-1.6.2.min.js",function (code) {
var s = document.createElement('script');
s.type = 'text/javascript';
//s.async = true;
s.innerHTML=code;
var x = document.getElementsByTagName('script')[0];
x.parentNode.insertBefore(s, x);
setTimeout(insertNext1,1);
});
//import: jquery-ui-1.8.16.custom.min.js
function insertNext1()
{
getContent("js/jquery-ui-1.8.16.custom.min.js",function (code) {
var s = document.createElement('script');
s.type = 'text/javascript';
s.innerHTML=code;
var x = document.getElementsByTagName('script')[0];
x.parentNode.insertBefore(s, x);
setTimeout(insertNext2,1);
});
}
//import: jquery-ui-1.8.16.custom.css
function insertNext2()
{
getContent("css/custom-theme/jquery-ui-1.8.16.custom.css",function (code) {
var s = document.createElement('link');
s.type = 'text/css';
s.rel ="stylesheet";
s.innerHTML=code;
var x = document.getElementsByTagName('script')[0];
x.parentNode.insertBefore(s, x);
setTimeout(insertNext3,1);
});
}
//import: main.css
function insertNext3()
{
getContent("css/main.css",function (code) {
var s = document.createElement('link');
s.type = 'text/css';
s.rel ="stylesheet";
s.innerHTML=code;
var x = document.getElementsByTagName('script')[0];
x.parentNode.insertBefore(s, x);
setTimeout(insertNext4,1);
});
}
//import: jquery.imgpreload.min.js
function insertNext4()
{
getContent("js/farinspace/jquery.imgpreload.min.js",function (code) {
var s = document.createElement('script');
s.type = 'text/javascript';
s.innerHTML=code;
var x = document.getElementsByTagName('script')[0];
x.parentNode.insertBefore(s, x);
setTimeout(insertNext5,1);
});
}
//import: marquee.js
function insertNext5()
{
getContent("js/marquee.js",function (code) {
var s = document.createElement('script');
s.type = 'text/javascript';
s.innerHTML=code;
var x = document.getElementsByTagName('script')[0];
x.parentNode.insertBefore(s, x);
setTimeout(insertNext6,1);
});
}
//import: marquee.css
function insertNext6()
{
getContent("css/marquee.css",function (code) {
var s = document.createElement('link');
s.type = 'text/css';
s.rel ="stylesheet";
s.innerHTML=code;
var x = document.getElementsByTagName('script')[0];
x.parentNode.insertBefore(s, x);
setTimeout(insertNext,1);
});
}
function insertNext()
{
setTimeout(pageReadyMan,10);
}
}
// get the content of url and pass that content to specified function
function getContent( url, callBackFunction )
{
// attempt to create the XMLHttpRequest and make the request
try
{
var asyncRequest; // variable to hold XMLHttpRequest object
asyncRequest = new XMLHttpRequest(); // create request object
// register event handler
asyncRequest.onreadystatechange = function(){
stateChange(asyncRequest, callBackFunction);
}
asyncRequest.open( 'GET', url, true ); // prepare the request
asyncRequest.send( null ); // send the request
} // end try
catch ( exception )
{
alert( 'Request failed.' );
} // end catch
} // end function getContent
// call function whith content when ready
function stateChange(asyncRequest, callBackFunction)
{
if ( asyncRequest.readyState == 4 && asyncRequest.status == 200 )
{
callBackFunction(asyncRequest.responseText);
} // end if
} // end function stateChange
et la partie étrange est que tout le travail du style plus toutes les fonctions javascript. la page est gelée pour une raison quelconque ...