OVH Cloud OVH Cloud

javascript et dépendances

14 réponses
Avatar
unbewusst.sein
supposons que dans chacun de mes fichiers de script js, j'ai une
variable, ou autre function, déclarant de quel autre script celui-ci
dépend, du genre :

var depend=['location','cookie'];

ou plutôt, afin que ça marche, qqsoit les scripts dans <head /> :

depend.concat('location','cookies');

ensuite j'aurais une routine qui, à partir de depend, "calculerait" les
fichiers effectifs nécessaires, supposons que le résultat serait une
Array() du genre :

needed=['/index_js/styles.js','/index_js/location.js',/index_js/cookies.
js'];

suffirait-il alors d'écrire dans le document par :

document.write("<script src='/index_js/styles.js'...");
pour chaque fichier nécessaire et il ne me resterait plus qu'à gérer
l'init de la page ???
--
Artaban de Médée

10 réponses

1 2
Avatar
Thibault TAILLANDIER

suffirait-il alors d'écrire dans le document par :

document.write("<script src='/index_js/styles.js'...");
pour chaque fichier nécessaire et il ne me resterait plus qu'à gérer
l'init de la page ???


Oui, j'ai du eu une architecture du genre ou je loadais dynamiquement
certains fichiers JS en fonction de l'architecture qui hébergeait le site.
tu peux, dans un fichier JS faire :
document.write("<script src='truc/fichier.js'
type='text/javascript'></script>");
et tu devrais avoir l'effet escompté.

Note que ceci doit etre fait dans un .js et non pas dans une balise
<script></script> de HTML, sinon ton
<script>
document.Write("<script src='...'></script>");
alert('toto');
</script>
est interprété comme fermant la balise script et toto ne s'affichera jamais.


--
Thibault Taillandier
"In a world without fences or walls, who needs gates and windows ?"

Avatar
unbewusst.sein
Thibault TAILLANDIER wrote:

Oui, j'ai du eu une architecture du genre ou je loadais dynamiquement
certains fichiers JS en fonction de l'architecture qui hébergeait le site.
tu peux, dans un fichier JS faire :
document.write("<script src='truc/fichier.js'
type='text/javascript'></script>");
et tu devrais avoir l'effet escompté.

Note que ceci doit etre fait dans un .js et non pas dans une balise
<script></script> de HTML, sinon ton
<script>
document.Write("<script src='...'></script>");
alert('toto');
</script>
est interprété comme fermant la balise script et toto ne s'affichera jamais.


OK merci beaucoup, yapuka ;-)

"dans le temps" (+ de 5ans), je ne me souviens + à cause de quel
navigateur il fallait écrire :

document.write("<scr" + "ipt...");

donc en séparant la chaine "script" en deux pour éviter un bug de
navigateur, c'est tjs d'actualité ???
--
Artaban de Médée

Avatar
Laurent vilday
supposons que dans chacun de mes fichiers de script js, j'ai une
variable, ou autre function, déclarant de quel autre script celui-ci
dépend, du genre :

var depend=['location','cookie'];

ou plutôt, afin que ça marche, qqsoit les scripts dans <head /> :

depend.concat('location','cookies');

ensuite j'aurais une routine qui, à partir de depend, "calculerait" les
fichiers effectifs nécessaires, supposons que le résultat serait une
Array() du genre :

needed=['/index_js/styles.js','/index_js/location.js',/index_js/cookies.
js'];

suffirait-il alors d'écrire dans le document par :

document.write("<script src='/index_js/styles.js'...");
pour chaque fichier nécessaire et il ne me resterait plus qu'à gérer
l'init de la page ???


Les document.write c'est pas beau, et je suis même pas certain que ça
marche dans toutes les DTD.

Pas testé à fond, mais je ferais ça :

var is_ie = false;
/*@cc_on is_ie = true; @*/

/**
* Charge un fichier javascript en l'insérant dans le tag HEAD et
* en déclenchant éventuellement une fonction au chargement
* @param url {string} Url source du fichier à charger
* @param callback {object} Function déclenchée au chargement
* (optional)
* @param scope {object} Contexte d'exécution forcé du callback
* (optional)
* @param arbitrary {object} Objet arbitraire transmis en paramètre
* à la fonction de callback (optional)
* @public
*/
function loadback(url, callback, scope, arbitrary)
{
var
listener = is_ie ? "onreadystatechange" : "onload",
script = document.createElement("script");

// certains prétendent que c'est "application/javascript"
// mais je sais pas trop en fait ... :/
script.type = "text/javascript";
script.src = url;
if ( callback )
{
script[listener] = function()
{
if ( is_ie && ! (
/loaded|complete/.test(window.event.srcElement.readyState) ) )
{
return;
}
callback.call(scope ? scope : this, arbitrary);
script[listener] = null;
};
}
document.getElementsByTagName("head")[0].appendChild(script);
}

// charge le fichier monJS.js
loadback('monJS.js');

// charge le fichier et alert au démarrage
loadback('monJS.js', function() { alert('loaded'); });

// charge et change le contexte d'exécution du callback
function myobj()
{
this.myMethod = function()
{
alert('myMethod');
};
return this;
}
var instance = new myobj();
loadback('monJS.js', instance.myMethod, instance);

// charge, change le contexte et transmet une variable
function myobj()
{
this.myMethod = function(leMessage)
{
alert(leMessage);
};
return this;
}
var inst = new myobj();
loadback('monJS.js', inst.myMethod, inst, 'Contenu');

--
laurent

Avatar
unbewusst.sein
Laurent vilday wrote:


Les document.write c'est pas beau, et je suis même pas certain que ça
marche dans toutes les DTD.


Oui, oui, entièrement d'accord, j'aurais fait ça aussi en créant des
noeuds...

Pas testé à fond, mais je ferais ça :

var is_ie = false;
/*@cc_on is_ie = true; @*/

/**
* Charge un fichier javascript en l'insérant dans le tag HEAD et
* en déclenchant éventuellement une fonction au chargement
* @param url {string} Url source du fichier à charger
* @param callback {object} Function déclenchée au chargement
* (optional)
* @param scope {object} Contexte d'exécution forcé du callback
* (optional)
* @param arbitrary {object} Objet arbitraire transmis en paramètre
* à la fonction de callback (optional)
* @public
*/
function loadback(url, callback, scope, arbitrary)
{
var
listener = is_ie ? "onreadystatechange" : "onload",
script = document.createElement("script");

// certains prétendent que c'est "application/javascript"


j'ai tjs mis text, rien n'a râlé pour l'instant )))

// mais je sais pas trop en fait ... :/
script.type = "text/javascript";
script.src = url;
if ( callback )
{
script[listener] = function()
{
if ( is_ie && ! (
/loaded|complete/.test(window.event.srcElement.readyState) ) )
{
return;
}
callback.call(scope ? scope : this, arbitrary);
script[listener] = null;
};
}
document.getElementsByTagName("head")[0].appendChild(script);
}

// charge le fichier monJS.js
loadback('monJS.js');

// charge le fichier et alert au démarrage
loadback('monJS.js', function() { alert('loaded'); });

// charge et change le contexte d'exécution du callback
function myobj()
{
this.myMethod = function()
{
alert('myMethod');
};
return this;
}
var instance = new myobj();
loadback('monJS.js', instance.myMethod, instance);

// charge, change le contexte et transmet une variable
function myobj()
{
this.myMethod = function(leMessage)
{
alert(leMessage);
};
return this;
}
var inst = new myobj();
loadback('monJS.js', inst.myMethod, inst, 'Contenu');


ouais, OK, merci, c'est pas très sorcier finalement ;-)
--
Artaban de Médée

Avatar
ASM

est interprété comme fermant la balise script et toto ne s'affichera
jamais.


Ça alors ! je ne m'en étais jamais aperçu !

pourtant ceci fonctionne chez moi :

<script type="text/javascript">
document.write('<script type="text/javascript">'+
'function toto(t){alert(t);} </script>');
toto('toto');
</script>


c'est donc ton document.write('</script>');
qui met la panique chez toi.

(toujours échapper le '/' en JS)
--
Stephane Moriaux et son (moins) vieux Mac déjà dépassé

Avatar
ASM

document.write("<scr" + "ipt...");

donc en séparant la chaine "script" en deux pour éviter un bug de
navigateur, c'est tjs d'actualité ???


OUI
mais en fait c'est l'écriture de '/' qui pose pb dans <....>
il ne suffit donc que de l'échapper

</script>

valable pour les autres aussi </h2> ... etc.

(bon, ca a l'air de poser moins de blèmes si on HTML-ise.)

--
Stephane Moriaux et son (moins) vieux Mac déjà dépassé

Avatar
ASM
Laurent vilday wrote:

// certains prétendent que c'est "application/javascript"


j'ai tjs mis text, rien n'a râlé pour l'instant )))


En tous cas avec la nouvelle norme-mode mon IE connaît pas et zappe le JS.
FF 2 la connait.


PS : au fait Laurent, avec quoi ponds-tu ce beau code ?
(sa documentation en en-tete)
--
Stephane Moriaux et son (moins) vieux Mac déjà dépassé


Avatar
ASM
var
listener = is_ie ? "onreadystatechange" : "onload",
script = document.createElement("script");

script[listener] = function()
{


Ha! oui ! astucieux, mais avec quel IE et-ce sensé fonctionner ?

j'ai tenté :

popup = window.open('test.html');
popup[listener] = function() { alert('vu'); }

Mon IE (Mac) reste muet ...

--
Stephane Moriaux et son (moins) vieux Mac déjà dépassé

Avatar
unbewusst.sein
ASM wrote:

OUI
mais en fait c'est l'écriture de '/' qui pose pb dans <....>
il ne suffit donc que de l'échapper

</script>


OK, merci, la mémoire me revient...
--
Artaban de Médée

Avatar
unbewusst.sein
ASM wrote:


En tous cas avec la nouvelle norme-mode mon IE connaît pas et zappe le JS.
FF 2 la connait.


Ben, en y réfléchissant bien, j'ai qqfois de pbs avec Opera qui
apparemment a du mal à chrger les scripts externes...
--
Artaban de Médée

1 2