OVH Cloud OVH Cloud

tester la définition d'une fonction

13 réponses
Avatar
Florian Sinatra
Bonsoir,
j'aimerais savoir s'il est possible en JS de tester si une fonction est
déjà définie (l'équivalent de function_exists() en PHP). J'ai beaucoup
de peine à trouver des sites consistants en matière de JS (tutos ou
référence) à part le Mozilla Developer Center.

Sinon, y a-t-il un moyen pour ajouter une fonction à window.onload ?
Par exemple soit :
window.onload = function(){ foo(); }

puis plus loin j'aimerais ajouter bar(); normalement je ferais :
window.onload = function(){ foo(); bar(); }

mais si je ne connais pas la présence dans window.onload de foo() tout
en voulant la préserver ?

D'avance merci.

10 réponses

1 2
Avatar
O.L.
Bonsoir,
j'aimerais savoir s'il est possible en JS de tester si une fonction est
déjà définie (l'équivalent de function_exists() en PHP).


function test() { /*...*/ }
if((typeof test) == 'function') alert('function test() exists !');
else alert('function test() does not exist');


Sinon, y a-t-il un moyen pour ajouter une fonction à window.onload ?
Par exemple soit :
window.onload = function(){ foo(); }

puis plus loin j'aimerais ajouter bar(); normalement je ferais :
window.onload = function(){ foo(); bar(); }

mais si je ne connais pas la présence dans window.onload de foo() tout
en voulant la préserver ?


Tu pourrais essayer de stocker dans un tableau les fonctions que tu
souhaites faire appeller lors du onload :

var functionsToRun = new Array();
var funcN = 0;
function RunOnload() {
for(i=0; i<funcN; i++) {
f = functionsToRun[i];
f();
}
}
window.onload = RunOnload;


function foo() { ... }
function bar() { ... }

functionsToRun[funcN++] = foo;
functionsToRun[funcN++] = bar;

--
Olivier Ligny
Créateur web free-lance / www.cyber-tamtam.net

Avatar
Dr John Stockton
JRS: In article , dated Sun, 13 Aug 2006
21:02:31 remote, seen in news:fr.comp.lang.javascript, Florian Sinatra
posted :
Bonsoir,
j'aimerais savoir s'il est possible en JS de tester si une fonction est
déjà définie (l'équivalent de function_exists() en PHP). J'ai beaucoup
de peine à trouver des sites consistants en matière de JS (tutos ou
référence) à part le Mozilla Developer Center.


FunctionFooEstDefinee = "function" == typeof foo
FooNEstPasDefinee = "undefined" == typeof foo


--
© John Stockton, Surrey, UK. ?@merlyn.demon.co.uk Turnpike v4.00 IE 4 ©
<URL:http://www.jibbering.com/faq/>? JL/RC: FAQ of news:comp.lang.javascript
<URL:http://www.merlyn.demon.co.uk/js-index.htm> jscr maths, dates, sources.
<URL:http://www.merlyn.demon.co.uk/> TP/BP/Delphi/jscr/&c, FAQ items, links.

Avatar
Florian Sinatra
Merci beaucoup, c'est parfait !
Avatar
Dr John Stockton
JRS: En article , datee Mon,
14 Aug 2006 12:19:25 remote, vu en news:fr.comp.lang.javascript, O. L.

Tu pourrais essayer de stocker dans un tableau les fonctions que tu
souhaites faire appeller lors du onload :

var functionsToRun = new Array();
var funcN = 0;
function RunOnload() {
for(i=0; i<funcN; i++) {
f = functionsToRun[i];
f();
}
}
window.onload = RunOnload;


function foo() { ... }
function bar() { ... }

functionsToRun[funcN++] = foo;
functionsToRun[funcN++] = bar;


Pour stocker dans un tableau, ceci est plus court :-

functionsToRun = [foo, bar, ... ]


Dans RunOnLoad,

for (i=0; i<funcN; i++) functionsToRun[i]()


Pour RunOnLoad,

function RunOnLoad() {
foo(); bar(); ... }

--
© John Stockton, Surrey, UK. ?@merlyn.demon.co.uk Turnpike v4.00 IE 4 ©
<URL:http://www.jibbering.com/faq/>? JL/RC: FAQ of news:comp.lang.javascript
<URL:http://www.merlyn.demon.co.uk/js-index.htm> jscr maths, dates, sources.
<URL:http://www.merlyn.demon.co.uk/> TP/BP/Delphi/jscr/&c, FAQ items, links.

Avatar
O.L.
JRS: En article , datee Mon,
14 Aug 2006 12:19:25 remote, vu en news:fr.comp.lang.javascript, O. L.

Tu pourrais essayer de stocker dans un tableau les fonctions que tu
souhaites faire appeller lors du onload :

var functionsToRun = new Array();
var funcN = 0;
function RunOnload() {
for(i=0; i<funcN; i++) {
f = functionsToRun[i];
f();
}
}
window.onload = RunOnload;


function foo() { ... }
function bar() { ... }

functionsToRun[funcN++] = foo;
functionsToRun[funcN++] = bar;


Pour stocker dans un tableau, ceci est plus court :-

functionsToRun = [foo, bar, ... ]


Oui mais non, car le but c'est d'ajouter des fonctions à la volée, à
partir de différents endroits du script. Donc à un instant t on ne sait
pas quelles sont les fonctions déjà définies, ni celles qui restent
peut être à venir. On ajoute juste une fonction au tableau, avec
functionsToRun[funcN++] = maFonction();
Sinon c'est sûr que ça serait trop facile ;)


Pour RunOnLoad,

function RunOnLoad() {
foo(); bar(); ... }


Non puisque lorsque l'on écrit le script on ne sait pas quelles seront
les fonctions à appeler lors du Onload ! C'est défini lors de
l'exécution du script, pas lors de son écriture ...
Ou alors c'est que j'ai mal compris ce que voulait Florian :-X


--
Olivier Ligny
Créateur web free-lance / www.cyber-tamtam.net


Avatar
ASM
JRS: En article , datee Mon,
14 Aug 2006 12:19:25 remote, vu en news:fr.comp.lang.javascript, O. L.

Tu pourrais essayer de stocker dans un tableau les fonctions que tu
souhaites faire appeller lors du onload :

function foo() { ... }
function bar() { ... }


functionsToRun = [foo, bar, ... ]


Oui mais non, car le but c'est d'ajouter des fonctions à la volée, à
partir de différents endroits du script.


et alors ?

il suffit d'avoir
functionsToRun = [foo, bar, ... ];
tout à la fin des scripts

Donc à un instant t on ne sait
pas quelles sont les fonctions déjà définies,


elles sont forcément définies une fois la page chargé.
(tout a été lu et mis en mémoire par le navigateur)

ni celles qui restent peut-être à venir.


Je doute qu'on puisse introduire une fonction (son script) depuis le
serveur après le chargement de la page.
Donc les fonctions sont là ou pas, pas de 1/2 mesure.

On ajoute juste une fonction au tableau, avec
functionsToRun[funcN++] = maFonction();


ce qui revient quasi au même que ce que donné plus haut, non ?
(idée d'un tableau des fonctions à utiliser)

Sinon c'est sûr que ça serait trop facile ;)


Pourquoi ne pas vouloir que ce soit facile ?

Pour RunOnLoad,

function RunOnLoad() {
foo(); bar(); ... }


Non puisque lorsque l'on écrit le script on ne sait pas quelles seront
les fonctions à appeler lors du Onload !


Ou bien tu ne sais pas ce que tu veux
(pour ne pas savoir ce dont tu auras besoin d'avance)
Ou bien le script des fonctions JS est écrit par une appli automatique
(côté serveur je suppose ?)
Ou bien les scripts de fonction sont utilisés différemment à chaque
chargement de la page par un script actif au chargement.
Dans ce dernier cas c'est ce script actif qui définit les fonctions à
activer (comme tu le dis : on les stoque dans l'ordre dans l'array
functionsToRun) après chargement :

onload = function() {
for(var i=0;i<functionsToRun.length;i++)
functionsToRun[i];
}

C'est défini lors de
l'exécution du script, pas lors de son écriture ...
Ou alors c'est que j'ai mal compris ce que voulait Florian :-X


C'est peut-être aussi qu'on comprend mal ce que tu veux faire.
(est-ce la bonne méthode ?)


--
Stephane Moriaux et son [moins] vieux Mac



Avatar
O.L.
JRS: En article , datee Mon,
14 Aug 2006 12:19:25 remote, vu en news:fr.comp.lang.javascript, O. L.

Tu pourrais essayer de stocker dans un tableau les fonctions que tu
souhaites faire appeller lors du onload :

function foo() { ... }
function bar() { ... }


functionsToRun = [foo, bar, ... ]


Oui mais non, car le but c'est d'ajouter des fonctions à la volée, à partir
de différents endroits du script.


et alors ?

il suffit d'avoir
functionsToRun = [foo, bar, ... ];
tout à la fin des scripts

Donc à un instant t on ne sait pas quelles sont les fonctions déjà
définies,


elles sont forcément définies une fois la page chargé.
(tout a été lu et mis en mémoire par le navigateur)

ni celles qui restent peut-être à venir.


Je doute qu'on puisse introduire une fonction (son script) depuis le serveur
après le chargement de la page.
Donc les fonctions sont là ou pas, pas de 1/2 mesure.

On ajoute juste une fonction au tableau, avec functionsToRun[funcN++] =
maFonction();


ce qui revient quasi au même que ce que donné plus haut, non ?
(idée d'un tableau des fonctions à utiliser)

Sinon c'est sûr que ça serait trop facile ;)


Pourquoi ne pas vouloir que ce soit facile ?

Pour RunOnLoad,

function RunOnLoad() {
foo(); bar(); ... }


Non puisque lorsque l'on écrit le script on ne sait pas quelles seront les
fonctions à appeler lors du Onload !


Ou bien tu ne sais pas ce que tu veux
(pour ne pas savoir ce dont tu auras besoin d'avance)
Ou bien le script des fonctions JS est écrit par une appli automatique
(côté serveur je suppose ?)
Ou bien les scripts de fonction sont utilisés différemment à chaque
chargement de la page par un script actif au chargement.
Dans ce dernier cas c'est ce script actif qui définit les fonctions à activer
(comme tu le dis : on les stoque dans l'ordre dans l'array functionsToRun)
après chargement :

onload = function() {
for(var i=0;i<functionsToRun.length;i++)
functionsToRun[i];
}

C'est défini lors de l'exécution du script, pas lors de son écriture ...
Ou alors c'est que j'ai mal compris ce que voulait Florian :-X


C'est peut-être aussi qu'on comprend mal ce que tu veux faire.
(est-ce la bonne méthode ?)


Moi je ne veux rien faire, c'est Florian qui a initié ce topic ! :-D
Je ne sais pas quel est le contexte de son application, mais
apparamment il avait besoin de pouvoir ajouter des onload à la volée.

--
Olivier Ligny
Créateur web free-lance / www.cyber-tamtam.net




Avatar
ASM
JRS: En article , datee





[..]

C'est peut-être aussi qu'on comprend mal ce que tu veux faire.
(est-ce la bonne méthode ?)


Moi je ne veux rien faire,


Ha ?

c'est Florian qui a initié ce topic ! :-D


C'est pas toi Florian ?

Aussi si ton mailleur de news pouvait dire en haut que c'est ASM ou
Florian qui a causé le dernier au lieu de citer O.L. systématiquement
on saurait peut-être où on en est ?

Je ne sais pas quel est le contexte de son application, mais apparamment
il avait besoin de pouvoir ajouter des onload à la volée.


Bon, alors il en fera ce qu'il peut s'il s'y retrouve.

--
Stephane Moriaux et son [moins] vieux Mac




Avatar
O.L.
JRS: En article , datee





[..]

C'est peut-être aussi qu'on comprend mal ce que tu veux faire.
(est-ce la bonne méthode ?)


Moi je ne veux rien faire,


Ha ?

c'est Florian qui a initié ce topic ! :-D


C'est pas toi Florian ?

Aussi si ton mailleur de news pouvait dire en haut que c'est ASM ou Florian
qui a causé le dernier au lieu de citer O.L. systématiquement
on saurait peut-être où on en est ?


Je voudrais bien !
Mon newsreader c'est "MesNews" mais depuis quelques semaines (mois ?)
il ne cite plus la personne à laquelle on répond :(
Une idée ?

--
Olivier Ligny
Créateur web free-lance / www.cyber-tamtam.net





Avatar
O.L.
O.L. a émis l'idée suivante :
JRS: En article , datee





[..]

C'est peut-être aussi qu'on comprend mal ce que tu veux faire.
(est-ce la bonne méthode ?)


Moi je ne veux rien faire,


Ha ?

c'est Florian qui a initié ce topic ! :-D


C'est pas toi Florian ?

Aussi si ton mailleur de news pouvait dire en haut que c'est ASM ou Florian
qui a causé le dernier au lieu de citer O.L. systématiquement
on saurait peut-être où on en est ?


Je voudrais bien !
Mon newsreader c'est "MesNews" mais depuis quelques semaines (mois ?) il ne
cite plus la personne à laquelle on répond :(
Une idée ?


C'est bon j'ai (re)trouvé la bonne option de config pour les citations
!! :)
Désolé pour tous ces désagréments ^^ ;)

--
Olivier Ligny
Créateur web free-lance / www.cyber-tamtam.net






1 2