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 ...
la source
document.head.appendChild
, mais il y a quelques problèmes de niche avec l'ajout de scripts au<head>
; rien qui empêcherait le chargement et l'exécution des scripts.document.write
avant le chargement du document, le script sera exécuté de manière synchrone lors du chargement de la page et n'inclura pas de comportement de rappel asynchrone à lui seul. Si vous créez un élément de script et l'ajoutez à la page, vous aurez alors accès pour ajouter des écouteurs d'événements à déclencher de manière asynchrone. tl; dr: cela dépend de la façon dont vous chargez le script avec JS.Le nouvel attribut «async» de HTML5 est censé faire l'affaire. «différer» est également pris en charge dans la plupart des navigateurs si vous vous souciez d'IE.
async - Le HTML
différer - Le HTML
Lors de l'analyse du nouveau code du bloc d'annonces AdSense, j'ai remarqué que l'attribut et une recherche m'ont conduit ici: http://davidwalsh.name/html5-async
la source
async
oudefer
cela bloquera le rendu pendant le chargement. Le réglage luiasync
dira de ne pas bloquer et d'exécuter le script dès que possible. Le réglage luidefer
dira de ne pas bloquer mais d'attendre avec l' exécution du script jusqu'à ce que la page soit terminée. En général, ce n'est pas un problème d'exécuter des scripts dès que possible tant qu'ils n'ont pas de dépendances (par exemple jQuery). Si un script a des dépendances sur un autre, utilisezonLoad
pour l'attendre.J'ai chargé les scripts de manière asynchrone (html 5 a cette fonctionnalité) lorsque tous les scripts ont été chargés, j'ai redirigé la page vers index2.html où index2.html utilise les mêmes bibliothèques. Étant donné que les navigateurs ont un cache une fois que la page est redirigée vers index2.html, index2.html se charge en moins d'une seconde car il a tout ce dont il a besoin pour charger la page. Dans ma page index.html, je charge également les images que je prévois d'utiliser afin que le navigateur place ces images dans le cache. donc mon index.html ressemble à:
une autre bonne chose à ce sujet est que je peux placer un chargeur dans la page et lorsque le chargement de la page est terminé, le chargeur disparaîtra et dans un cache de millisecondes la nouvelle page fonctionnera.
la source
Exemple de google
la source
Plusieurs remarques:
s.async = true
n'est pas très correct pour le doctype HTML5, c'est corrects.async = 'async'
(en fait l'utilisationtrue
est correcte , merci à amn qui l'a souligné dans le commentaire ci-dessous)Puisqu'il y a une raison récente de charger des fichiers de manière asynchrone, mais dans l'ordre, je recommanderais une manière un peu plus fonctionnelle par rapport à votre exemple (supprimer
console.log
pour une utilisation en production :)):la source
s.async = true
est correct . La propriétéasync
est spécifiée explicitement comme un booléen dans la recommandation HTML 5 du W3C à w3.org/TR/html5/scripting-1.html#attr-script-async . Vous confondez l'async
attribut avec laasync
propriété exposée par les objets implémentant l'HTMLScriptElement
interface DOM. En effet, lorsque vous manipulez l'attribut correspondant de l'élément via quelque chose commeElement.setAttribute
, vous devez l'utiliserelement.setAttribute("async", "async")
car tous les attributs HTML sont avant tout du texte.Grâce à HTML5, vous pouvez désormais déclarer les scripts que vous souhaitez charger de manière asynchrone en ajoutant "async" dans la balise:
Remarque: l'attribut async est uniquement destiné aux scripts externes (et ne doit être utilisé que si l'attribut src est présent).
Remarque: Il existe plusieurs manières d'exécuter un script externe:
Voir ceci: http://www.w3schools.com/tags/att_script_async.asp
la source
Je compléterais la réponse de zzzzBov par un contrôle de la présence de callback et autoriserais le passage d'arguments:
la source
Voici une excellente solution contemporaine au chargement de script asynchrone bien qu'elle ne traite que le script js avec async false .
Il y a un excellent article écrit sur www.html5rocks.com - Plongez dans les eaux troubles du chargement de scripts .
Après avoir examiné de nombreuses solutions possibles, l'auteur a conclu que l'ajout de scripts js à la fin de l'élément body est la meilleure façon d'éviter de bloquer le rendu de page par les scripts js.
Dans le même temps, l'auteur a ajouté une autre bonne solution alternative pour les personnes qui désespèrent de charger et d'exécuter des scripts de manière asynchrone.
Étant donné que vous avez nommé quatre scripts,
script1.js, script2.js, script3.js, script4.js
vous pouvez le faire en appliquant async = false :Maintenant, Spec dit : Téléchargez ensemble, exécutez dans l'ordre dès que tous les téléchargements.
Firefox <3.6, Opera dit: Je n'ai aucune idée de ce qu'est ce truc «asynchrone», mais il se trouve que j'exécute les scripts ajoutés via JS dans l'ordre dans lequel ils sont ajoutés.
Safari 5.0 dit: Je comprends «async», mais je ne comprends pas le définir sur «faux» avec JS. J'exécuterai vos scripts dès leur arrivée, dans n'importe quel ordre.
IE <10 dit: Aucune idée de «async», mais il existe une solution de contournement en utilisant «onreadystatechange».
Tout le reste dit: je suis votre ami, nous allons le faire par le livre.
Maintenant, le code complet avec la solution de contournement IE <10:
la source
Une des raisons pour lesquelles vos scripts pourraient se charger si lentement est si vous exécutiez tous vos scripts pendant le chargement de la page, comme ceci:
au lieu de:
Ce deuxième bit de script attend que le navigateur ait complètement chargé tout votre code Javascript avant de commencer à exécuter l'un de vos scripts, faisant croire à l'utilisateur que la page s'est chargée plus rapidement.
Si vous cherchez à améliorer l'expérience de l'utilisateur en diminuant le temps de chargement, je n'irais pas pour l'option "écran de chargement". À mon avis, ce serait beaucoup plus ennuyeux que de simplement charger la page plus lentement.
la source
Je vous suggère de jeter un œil à Modernizr . C'est une petite bibliothèque légère que vous pouvez charger de manière asynchrone votre javascript avec des fonctionnalités qui vous permettent de vérifier si le fichier est chargé et d'exécuter le script dans l'autre que vous spécifiez.
Voici un exemple de chargement de jquery:
la source
J'ai écrit un petit article pour vous aider, vous pouvez en lire plus ici https://timber.io/snippets/asynchronously-load-a-script-in-the-browser-with-javascript/ , mais j'ai joint la classe d'assistance ci-dessous. Il attendra automatiquement le chargement d'un script et retournera un attribut de fenêtre spécifié une fois qu'il le fera.
L'utilisation est comme ceci:
la source
Vous trouverez peut-être cet article wiki intéressant: http://ajaxpatterns.org/On-Demand_Javascript
Il explique comment et quand utiliser une telle technique.
la source
Eh bien,
x.parentNode
renvoie l'élément HEAD, donc vous insérez le script juste avant la balise head. C'est peut-être ça le problème.Essayez à la
x.parentNode.appendChild()
place.la source
Découvrez ce https://github.com/stephen-lazarionok/async-resource-loader . Il a un exemple qui montre comment charger JS, CSS et plusieurs fichiers en un seul coup.
la source
Vous pouvez utiliser LABJS ou RequreJS
Les chargeurs de scripts comme
LABJS
,RequireJS
amélioreront la vitesse et la qualité de votre code.la source
Avez-vous envisagé d'utiliser Fetch Injection? J'ai lancé une bibliothèque open source appelée fetch-inject pour gérer des cas comme ceux-ci. Voici à quoi pourrait ressembler votre chargeur en utilisant la lib:
Pour une compatibilité ascendante, tirez parti de la détection des fonctionnalités et du retour à l'injection XHR ou aux éléments DOM de script, ou simplement en ligne les balises dans la page en utilisant
document.write
.la source
Voici ma solution personnalisée pour éliminer le JavaScript bloquant le rendu:
En bref, il charge tous vos scripts de manière asynchrone, puis les exécute en conséquence.
Repo Github : https://github.com/mudroljub/js-async-loader
la source
No 'Access-Control-Allow-Origin' header is present on the requested resource
Voici une petite fonction ES6 si quelqu'un veut l'utiliser dans React par exemple
la source
Je suggérerais de commencer par minimiser les fichiers et de voir si cela vous donne une augmentation de vitesse suffisamment importante. Si votre hôte est lent, essayez de mettre ce contenu statique sur un CDN.
la source