problème de récursivité [javascript] - HTML/CSS - Programmation
Marsh Posté le 02-07-2007 à 14:26:34
normal, runslideshow n'est pas une fonction mais une méthode de ta classe initslideshow ( je trouve les noms particulierement mal choisis ).
Attention, en utilisant un settimeout tu vas sortir du contexte de ton objet, tu ne pourras donc pas utiliser this.runslideshow.
Mais bon, comme j'ai pas la moindre idée de ce que tu veux faire, je trouve que ça sent un peu le paté ton truc.
Marsh Posté le 02-07-2007 à 14:50:36
c'est juste pour faire défiller plusieurs banniere publicitaire sur une page
avec des vitesse différentes.
en ce qui concerne le choix des fonction ou methode, rien de bien grave pour l'instant
si tu as mieux, je suis preneur !
Marsh Posté le 02-07-2007 à 16:03:08
pas pour l'instant, je suis au boulot, j'ai pas les sources
mais il n'y en a pas plus pour la partie javascript.
il y a juste une image (pour les testes) avec un nom, le nom de l'image est var1 (premier argument de la classe initslideshow)
Marsh Posté le 02-07-2007 à 17:43:44
nan mais là c'est totalement n'importe quoi ce que tu as écrit.
var2, var3 sont initules mais par contre tu te sers de this.i et this.p qui sont pas initialisées, thispic sort de l'espace donc ça mène forcément à rien ...
Donc montre le vrai code ...
edit: mais à l'instinct je ferais quelque chose dans le genre:
Code :
|
non testé et garanti avec des erreurs!
Marsh Posté le 03-07-2007 à 12:15:30
merci pour ce code, il me parrait correct, je teste ca dès que possible, je te mettrais quand meme le code que j'utilisais !
Marsh Posté le 03-07-2007 à 12:49:18
anapajari a écrit : normal, runslideshow n'est pas une fonction mais une méthode de ta classe initslideshow ( je trouve les noms particulierement mal choisis ). |
Restons précis, on parle de prototype, pas de classe...
Marsh Posté le 03-07-2007 à 14:22:32
ReplyMarsh Posté le 03-07-2007 à 14:36:43
Voici le script que l'on m'a fournit pour faire ça,
la seul chose est que la personne fait une duplication compléte du script en changeant le nom des variables pour faire tourner 2 ou 3 bannières différentes :
Code :
|
Voici le code de mon script :
Code :
|
Marsh Posté le 04-07-2007 à 13:05:51
Dans ton setTimeout, change initslideshow.prototype.runslideshow() par obj.runslideshow() (ou obj2 selon la banière que tu veux utiliser).
Dans le corps de ton <body> tu crées les variables obj et obj2. C'est elles que tu dois utiliser pour faire référence aux objets (et pour les puristes , obj et obj2 contiennent bien une référence).
!!!!!!! Les ; manquent presque partout !!!!!!!!!! A corriger.
Marsh Posté le 04-07-2007 à 14:54:34
merci pour l'info !
Marsh Posté le 04-07-2007 à 15:07:51
marchera pas voir ma 1ere reponse.
Dans runslideshow tu es sur une méthode de ton objet, celui-ci est donc représenté par this et non par le nom de la variable y faisant référence. Pour faire ce que suggère bignose, il te faudrait connaitre le "nom" de la variable faisant référence à ton objet dans la méthode.
Perso je ferais le setTimeOut hors de runslideshow.
Code :
|
Marsh Posté le 04-07-2007 à 15:27:36
Le script mis précédemment est le code de base, comme dit dans les précédent post,"je suis à mon travail, je ne peux vous fournir le code initiale... " voila qui est fait
en ce qui concerne le code ci-dessus, il ne fonctionne qu'une fois !
l'image change bien au bout de 2 secondes, mais c'est tout !!
le script n'a pas l'air de continuer, aucune erreur dans la console javascript de firefox !
Marsh Posté le 04-07-2007 à 15:33:27
euh tu as bien mis setInterval comme moi ou, par le plus grand des hasards, tu ne l'aurais pas remplacer par un setTimeOut
Marsh Posté le 04-07-2007 à 15:42:02
tiens j'ai cette erreur qui apprait à chaque fois que le script est exécuté :
Code :
|
c'est cette ligne :
Code :
|
je ne comprend pas pourquoi :?:
mais sinon l'image change
merci anapajari
je part bosser, à plus tard
Marsh Posté le 04-07-2007 à 20:58:30
anapajari a écrit : marchera pas voir ma 1ere reponse. |
Seulement voila, des applications utilisant cette méthode pour faire tourner des dizaines d'objets de façon asynchrone dans un browser j'en ai déja fait pas mal... Alors je reconnais que c'est pas la méthode qu'on utiliserait avec des langages comme c++, c# ou java, mais ici on est en javascript et dans un browser. Il faut donc utiliser ce qu'on a sous la main.
Comme je l'ai déja dit dans un post précédent, en javascript tout ce qu'i n'est pas défini dans une fonction quelle qu'elle soit via le mot clé var est défini dans l'objet intrinsèque Global. Dès lors, et par conséquent, ceci fonctionne :
function truc()
{...}
function truc.prototype.run()
{...
setTimeout(A.run(), 1000);
...
}
var A = new truc();
Pourquoi ?
Parce que A est défini en dehors de toute fonction. Elle est donc créée dans l'objet Global. En utilisant setTimeout(A.run(), 1000), on s'adresse à la variable A définie dans l'objet Global (évidement, si on a défini une variable locale A, ça marchera pas). L'objet Global est unique tant qu'on ne ferme pas le browser. Tout ceci n'est qu'une propriété du langage javascript, rien de plus. Et c'est aussi une des ses faiblesses, car quand les gens ne déclarent pas leurs variables dans leurs fonctions via le mot clé var, ils ne se rendent souvent pas compte que ces variables se retrouvent toutes dans l'objet Global, avec tous les problèmes de collisions et de débugage que ça implique.
Encore une fois, je le répète (qu'on vienne pas me relancer là-dessue) c'est juste exploiter une propriété du javascript (qui est en fait simplement un moyen de faire du multi-thread), avec d'autres langages on fera évidement autrement.
Alors on dira, quel bordel ! Comment déguger un truc comme ça ? Et je répondrai : en ayant de bonnes habitudes de programmation, en appliquant des best practices de qualité, ça ne pose aucun problème. Les gens n'ayant aucune discipline de programmation auront de toute façon des problèmes, avec cette méthode ou avec une autre. Le code présenté ici par stef_doberman n'est en aucun cas de qualité suffisante pour pouvoir utiliser cette méthodologie efficacement, loin s'en faut. Mais le cas étant simple, ça ne pose pas de problème.
En tout cas, je déconseille totalement l'utilisation de setInterval, sauf à ceux à qui il reste encore quelques cheveux à s'arracher. Car là c'est vraiment indébugable (et je parle par expérience malheureusement).
Marsh Posté le 04-07-2007 à 22:57:48
Code :
|
Jmet pas la déco (et y'a d'autres manières de le faire), mais l'idée est là , on a aucunement besoin de saloper l'espace global pour faire ça
Marsh Posté le 05-07-2007 à 13:27:58
bignose a écrit :
setTimeout(A.run(), 1000); |
J'ai le droit de vomir?
En dehors de l'erreur sur la déclaration d'une méthode via prototype, ce que tu as écrit traduit une profonde incompréhension de la notion d'objet.
Cela cantonne l'utilisation du prototype "truc" au seul objet A.
Exemple:
Code :
|
ça n'a strictement rien à voir avec utiliser "une propriété du langage javascript", c'est juste faire n'importe quoi .
Et ça va totalement à l'encontre de ce que tu écris ensuite:
bignose a écrit : en ayant de bonnes habitudes de programmation, en appliquant des best practices de qualité, ça ne pose aucun problème. Les gens n'ayant aucune discipline de programmation auront de toute façon des problèmes, avec cette méthode ou avec une autre. |
enfin:
bignose a écrit : En tout cas, je déconseille totalement l'utilisation de setInterval, sauf à ceux à qui il reste encore quelques cheveux à s'arracher. Car là c'est vraiment indébugable (et je parle par expérience malheureusement). |
c'est vrai qu'il vaut mieux faire un méthode appelé via setInterval et dans cette méthode refaire un nouveau setInterval à chaque appel... totalement logique
Marsh Posté le 05-07-2007 à 18:36:20
sur ce coup, je suis d'accord avec anapajari
Marsh Posté le 02-07-2007 à 13:37:31
Bonjour,
j'ai créé une petite classe en javascript (rien de bien méchant ),
voila une partie du code
j'ai une erreur sous firefox dans la console d'erreur qui me dit que la fonction n'est pas trouvé !
je ne sais pas comment faire pour appeller récursivement la même fonction en gardant les parametres de celle-ci bien sur.
en faite suivant les pages, je pourrais être amené à instencier plusieurs fois cet classe avec des parametres différents !
---------------
Tout à commencé par un rêve...