2010-11-27 3 views
1

J'ai une page Web créée par un script php qui, lors du chargement, contiendra 0 à N éléments div. Pour chaque div, je lance un code javascript spécifique qui manipule les données pertinentes pour ce div. L'un des éléments de ce code est de créer un élément img et de définir son attribut 'src' sur une certaine URL d'une image de taille connue (mais variable). Ceci est fait pour la mise en cache. Ces images ne sont pas supposées être affichées dans la mise en page initiale - mais chacune doit apparaître après une certaine entrée de l'utilisateur (survol de la souris) - donc j'essaie de mettre les images en cache pour qu'elles ne soient pas longues à apparaître.Comment exécuter plusieurs codes javascript internes de manière asynchrone et ne pas bloquer?

Le chargement des images de parcours prend du temps - et chaque fois qu'une image charge les blocs de code résultant en des temps de chargement élevés. un exemple:

<div id="i1"> 
<script type="text/javascript"> 
    /* run code relevant to 'i1', and amongst other things load some image 
     into a detached img element for later use. let's call this code 'bcode' */ 
</script> 
<div id="i2"> 
<script type="text/javascript"> 
    /* run 'bcode' for i2 */ 
</script> 

<div id="...and so on"> 

Pour essayer d'avoir le code exécuté de manière asynchrone, j'ai essayé ceci:

<div id="i1"> 
(function() { 
    var asyncScriptElement = document.createElement('script'); 
    asyncScriptElement.async = true; 
    var scriptText = document.createTextNode ('here I put all of the relevant "bcode"'); 
    asyncScriptElement.appendChild (scriptText); 
    document.getElementById ('Img_1_2').appendChild (asyncScriptElement); 
}()); 

Il fonctionne sous FF (toujours pas assez vite), et il ne fonctionne évidemment pas sous IE. Avez-vous des suggestions sur la façon d'y parvenir? Notez également, que je n'ai pas vraiment besoin d'obtenir quelque chose d'un autre php externe (c'est-à-dire d'utiliser XMLHttpRequest) - j'ai toutes les données dont j'ai besoin dans ce php. J'ai juste besoin d'un moyen de débloquer le chargement des images ...

Répondre

0

Je voudrais envelopper vos scripts dans une page HTML (éventuellement générée par PHP) et le télécharger comme iframe pour assurer le même comportement pour n'importe quel navigateur.

Il existe d'autres options plus élégantes avec des avantages et des inconvénients; here vous pouvez trouver une comparaison des options viables, la compatibilité du navigateur et un arbre de décision agréable.

+0

vais-je pouvoir js référence les variables du document externe de l'intérieur du js qui seront dans les iframes? –

+0

Non. Vous pouvez inclure des paramètres supplémentaires dans iframe src et utiliser ces paramètres via PHP ou JS dans l'iframe. – lbz

+0

@Yuval, @ibz Si vos iframes sont sur le même domaine (même origine) vous avez un accès complet à tout dans les deux objets fenêtre. – xj9

0

Javascript est mono-thread et fonctionne toujours de manière synchrone.

Il existe des extensions du navigateur pour contourner ce problème, notamment le concept de Javascript Workers dans Mozilla

+0

C'est vrai, mais il y a un certain nombre de façons de faire l'exécution parallèle de différents codes Javascript dans la même page. Mozilla Javascript Workers et HTML5 Web Workers sont d'excellentes solutions que nous espérons pouvoir adopter dans un proche avenir. – lbz

+0

Ce n'est pas tout à fait exact mais je m'égare. – xj9

Questions connexes