One more "Stack overflow at line: 0":-/

mono_neurone Messages postés 48 Date d'inscription mercredi 10 décembre 2003 Statut Membre Dernière intervention 29 juin 2009 - 24 avril 2009 à 10:48
mono_neurone Messages postés 48 Date d'inscription mercredi 10 décembre 2003 Statut Membre Dernière intervention 29 juin 2009 - 29 juin 2009 à 22:56
Salut à tous.
J'ai beau chercher je ne vois pas d'ou vient le probleme avec mon bout de code.
En gros j'ai une fonction récursive (appelé sur le onload de chaque image) que j'appele pour charger une image apres l'autre. De temps a autre je reçois un stack overflow que je ne m'explique pas.
Comme il y a plus d'idées dans X tetes que dans une ...
Voici mon bout de code:
  try
  {
    var ImgPathArr = new Array(
      'Btns/BtnAccueilNB.gif',
      'Btns/BtnContactNB.gif',
      'Btns/BtnGalerieNB.gif',
      'Btns/BtnLiensNB.gif',
      'Btns/BtnNewsNB.gif',
      'Btns/BtnPrestaNB.gif',
      'Btns/BtnAccueilCLR.gif',
      'Btns/BtnContactCLR.gif',
      'Btns/BtnGalerieCLR.gif',
      'Btns/BtnLiensCLR.gif',
      'Btns/BtnNewsCLR.gif',
      'Btns/BtnPrestaCLR.gif',
      'Img/bord.png',
      'Img/DegraDEntete.gif',    
      'Img/LesJongleriesDeNoar.gif',
      'Img/PostIt.png',
      'Img/LeftUpCorner.png',
      'Img/LeftDownCorner.png',
      'Img/RightUpCorner.png',
      'Img/RightDownCorner.png',
      'Img/CircacroLogo.gif',
      'Img/GipsyCircusLogo2.gif',
      'Img/homesymbol.gif'
    );
    Preload(ImgPathArr,0,(ImgPathArr.length - 1));
  }
  catch(err)
  {
    alert("Main section error : " + err);
  }
  
  /*FUNCTIONS*/
  function Preload(ImgPathArr, ImgIdx, ImgIdxMax)
  {
    try
    {
      if (ImgIdx <= ImgIdxMax)
      {
        var objImage = new Image();
        objImage.onload=function(){Preload(ImgPathArr, (ImgIdx + 1), ImgIdxMax);};
        objImage.onerror=function(){Preload(ImgPathArr, (ImgIdx + 1), ImgIdxMax);};
        // preload the image file
        objImage.src=ImgPathArr[ImgIdx];
      }
      else
      {
        GoToMain();
      }
    }
    catch(err)
    {
      alert("Preload error : " + err);
    }
  }


  function GoToMain()
  {
    try
    {
      var WidthTab = new Array(600,800,1024,1152,1280,1440,1680,1920);
      var i = WidthTab.length - 1;
      var res = false;
      
      while ((i > 0) &amp;&amp; (res == false))
      {
        if (screen.width >= WidthTab[i])
        {
          window.location.replace("main.php?page=Accueil&amp;res=" + WidthTab[i]);
          res = true;
        }
        else
        {
          res = false;
        }
        i = i - 1;
      }
    }
    catch(err)
    {
      alert("GoToMain error : " + err);
    }
  }


Please Help

30 réponses

Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 16
24 avril 2009 à 12:42
Bonjour,
à priori, à l'oeil, comme ça, sans tester.... ça devrait baigner
même si je t'avoue que je pense que tu te compliques la vie
        : par exemple : t'es sûr d'avoir besoin de tous ces try/catch ?
t'es sûr que cela vient du pré chargement ?
       oui : ça tombe bien, c'est totalement inutile, voire
              nuisible : sucre tout ! ;o)
      non : donc du test de la taille de l'écran ?
              j'aurais fait "plus simplement", mais ça devrait baigner
              à retenter quand le preload sera sucré... ;o)
Cordialement [mon Site] [M'écrire] Bul
0
mono_neurone Messages postés 48 Date d'inscription mercredi 10 décembre 2003 Statut Membre Dernière intervention 29 juin 2009
24 avril 2009 à 13:33
Bonjour Bul3,

Ben oui selon moi aussi ca devrait tourner! lol
Bah je me complique la vie ... si on veut. Mon but est d'afficher une page html sur laquelle tu peux choisir (avec des liens) quelle résolution tu veux pour le site (pour ceux qui ont désactivé javascript). Pour ceux dont javascript est actif, ils sont redirigés automatiquement sur le site avec la bonne résolution. J'essaye de contenter tout le monde quoi ;-).
Tant que j'y étais, je me suis dit que j'allais précharger quelques unes des images de l'interface du site (pour ceux sans javascript:préchargement avec tag html + css et pour ceux avec :préchargement javascript).
Mais avant de rediriger les visiteurs sur mon site, je veux que les images aient fini de loader ! D ou le récursif sur l'évènement onload.
C'est un peu plus compliqué que de balancer les liens simplement dans l'image.src mais bon... ;-) Ca correspond mieux à ce que je veux faire.
Concernant les try catch, c'était surtout pour resortir des erreurs éventuelles liées à mon stack overflow. Je pense que je les virerai apres.

Bref, sans les try catch c'est la meme galere et j'ai pas plus d'info sur l'erreur.
La fonction pour la résolution est OK (quand je la mets en commentaire j'ai toujours le stack overflow), c'est donc pas ca.
Pour le préchargement : il passe 2 fois sur 3 sans mettre de stack overflow.
Je pense donc plutot à une erreur d'allocation/désallocation de resource liée au temps d'execution des fonctions preload les unes par rapport aux autres.Quand je mets moins d'images j'ai moins de stack overflow ! Pourtant comme j'ai mis ca dans l'event onload ca ne doit pas s'executer en parallèle!...
En plus en mettant des alert j'ai remarqué que ca se passe apres le chargement de la derniere image mais avant la redirection. Et entre les 2 y a rien qui est fait !!!
J 'y comprends rien

Si t'as des idées  ...
0
Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 16
24 avril 2009 à 13:49
>>sans les try catch c'est la meme galere et j'ai pas plus d'info sur l'erreur


Navigateurs |Quelques Explications |----

Chrome, contrôler page actuelle / Options pour développeurs
/ Console Javascript, ----

FireFox, Outils / Console d'erreurs
et mieux : télécharger FireBug, ----

Internet
Explorer, activer le deboggage : Outils/options Internet/Avancés
dans la liste, sous "Navigation" : décocher
o Afficher une notification de chaque erreur de script
o Désactiver le débogage de Scripts (Internet Explorer)
et mieux (pour IE < 8) : télécharger le Debogger IE
voir aussi : DebugBar et Companion JS, ----

K-Meleon, utils / Cons, ----

Opera, utils / Asole d'erreurs, ----

Safari, Debug / Show JavaScript Console
° modifier Fichier com.apple.Safari.plist situé dans le
répertoire : Support:\Documents and Settings\utilisateur
\Application Data\Apple Computer\Safari\Preferences\
y ajouter <key>IncludeDebugMenu</key>
----

avec certains : pas à pas possible , mais comme c  'est
peut-être une histoire de timeOut ( voir ci dessous )
l'erreur ne sera pas déclenchée !

>>En plus en mettant des alert j'ai remarqué que ca se passe apres le chargement
>>de la derniere image mais avant la redirection.
j'aurais bien parié sur la dernière image ( au nez ! )
je n'ai rien testé/contrôlé/ ni regardé sérieusement de ton script !

il y a peut-être ( sûrement ) une explication

peut-être une histoire de timeOut, mais comme je pense qu'un
préchargement est nocif, je ne vais pas regarder beaucoup plus loin !

@+
0
mono_neurone Messages postés 48 Date d'inscription mercredi 10 décembre 2003 Statut Membre Dernière intervention 29 juin 2009
24 avril 2009 à 14:34
Merci pour le tableau avec les browser ! Excellent
Vais me garder ca sous le coude.
Ok je vais continuer à chercher.

Juste une question : pourquoi tu penses que le préchargement est nocif ?
Si c'est des grosses images d'accord mais si ce n'est que quelques images d'une 10aine de ko chacunes ?
On voit presque pas la différence (temps pour l'affichage de la page) et ca donne un meilleur rendu à l'affichage (ex les coins arrondis qui arrivent par la suite ...)
J'aimerais avoir ton idée sur la question.
En tous cas merci quand meme d'etre penché sur mon prob

A+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 16
24 avril 2009 à 14:48
>>pourquoi tu penses que le préchargement est nocif ?
si tu ne fais pas de préchargement, la page s'affiche, est disponible immédiatement,
   les images : au fur et à mesure, à leur rythme ( enfin au rythme de la connexion )
si tu fais un préchargement, ta page n'est affichée, n'est accessible que lorsque
   toutes les images sont téléchargées, même celles qu'on ne consultera jamais (!!!)
   temps d'attente insupportable à la connexion, et inutile ( sauf cas précis qui
   existent peut-être mais j'aimerais voir ).
moi qui n'ai qu'un modem 56k je peux te dire que ce genre d'inutilitaire me
  font quitter le site avant la fin et que je n'y reviens plus.
0
mono_neurone Messages postés 48 Date d'inscription mercredi 10 décembre 2003 Statut Membre Dernière intervention 29 juin 2009
24 avril 2009 à 15:12
Oui je peux comprendre (surtout avec un 56k).
Dans mon cas, toutes les images que je charge sont de petites images (apres verif elles font entre 1ko et 7ko) destinées au "look" de la page d'accueil . Autrement dit : toutes les images chargées seront utilisées!
Et pour les plus grosses images qui seront affichées, je les laisse en dehors du préchargement expret (à cause de ce temps d'attente).
Maintenant c'est vrai que ne voir qu'une page blanche pendant des plombes c'est pas agréable mais je pense quand meme que dans mon cas, pour qq images légères, l'idée n'est pas mauvaise.
Apres c'est chacun son point de vue
0
Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 16
24 avril 2009 à 15:28
c'est comme tu le sens....
attendre ou pas, perso, je préfère "ne pas attendre" !
"pour moi", rien ne justifie un préchargement,
mais c'est comme tu dis :
chacun fait comme il sent, et les vaches seront bien gardées.
@+
0
Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 16
25 avril 2009 à 11:20
néanmoins... ce qu'utilisent en général les autres "préloader"
( mais tout aussi nocifs ! ) : un Array.

var I = new Array();
et dans la fonction, en incrémentant une variable k :
   I[k] = new Image();
   I[k].onload =function()  { rappel de la fonction };
   I[k].src = l'image à charger[k];

pour tenter de t'expliquer :
sans préload : la page est immédiatement disponible
                    les images se chargent/s'affichent
avec préload, les images sont chargées, plus lentement que sans, puisque javascript en plus
                   puis il faudra les afficher, en allant les chercher dans le cache si le
                         navigateur juge que c'est mieux que sur le site
                   la page n'est disponible ( visible même ) à la fin du préchargement
@+
0
XtremDuke Messages postés 626 Date d'inscription samedi 28 septembre 2002 Statut Membre Dernière intervention 18 mai 2009 4
28 avril 2009 à 09:51
@Bultez :

Suivant ce qu'on veut faire, un préchargement d'image peut être nécessaire afin d'éviter des effets de bord.

Exemple :

http://joof-api.net/demos/smartbox/

"avec préload, les images sont chargées, plus lentement que sans, puisque javascript en plus"

>> Je n'ai pas remarqué de differences.

"puis il faudra les afficher, en allant les chercher dans le cache si le navigateur juge que c'est mieux que sur le site"

>> Il n'y a rien à faire. Le navigateur gère ça tout seul comme un grand.
0
Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 16
28 avril 2009 à 11:02
>>éviter des effets de bord.
bien entendu XTremDuke, tu as raison...
c'est de la provoq que de dire que c'est toujours inutile.
mais, je ne pense pas que ce soit le cas ici
>>Je n'ai pas remarqué de differences.
certes, ça ne doit pas être facilement chronométrable, mais comme il y a des instructions en plus !
>>Il n'y a rien à faire. Le navigateur gère ça tout seul comme un grand.
certes... mais il le gère, donc : du temps.
@+
0
mono_neurone Messages postés 48 Date d'inscription mercredi 10 décembre 2003 Statut Membre Dernière intervention 29 juin 2009
28 avril 2009 à 12:15
Re,

>> Bul3 : attendre ou pas, perso, je préfère "ne pas attendre" ... "pour moi", rien ne justifie un préchargement...
J'ai bien compris ton point de vue mais comme je te l'expliquais précédement ce temps d'attenre sera presque nule puisque les images concernées sont vraiment toutes petites. Le but est purement esthétique: je voudrais au moins que mes bords arrondis et les dégradés apparaissent directement à l'affichage de la page.
>> ce qu'utilisent en général les autres "préloader" ( mais tout aussi nocifs ! ) : un Array
J'ai regardé un peu à cette soluce mais elle est pratiquement identique à la mienne et après implémentation, l'erreur subsiste. Mais je ne renonce pas ;-). Je la trouverai cette erreur lol.
Merci aussi pour l'explication, j'avais bien compris le principe. Cela dit, une fois de plus, pour de toutes petites images et un temps d'attente infime si pas inexistant, je pense pouvoir me permettre cette petite "fantaisie" ;-)
Merci pour vos réponses en tous cas. Ca fait plaisir de ne pas se sentir abandonné ;-)

A+
0
Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 16
28 avril 2009 à 12:41
    var ImgPathArr = new Array(
      'Btns/BtnAccueilNB.gif',
      'Btns/BtnContactNB.gif',
      'Btns/BtnGalerieNB.gif',
      'Btns/BtnLiensNB.gif',
      'Btns/BtnNewsNB.gif',
      'Btns/BtnPrestaNB.gif',
      'Btns/BtnAccueilCLR.gif',
      'Btns/BtnContactCLR.gif',
      'Btns/BtnGalerieCLR.gif',
      'Btns/BtnLiensCLR.gif',
      'Btns/BtnNewsCLR.gif',
      'Btns/BtnPrestaCLR.gif',
      'Img/bord.png',
      'Img/DegraDEntete.gif',   
      'Img/LesJongleriesDeNoar.gif',
      'Img/PostIt.png',
      'Img/LeftUpCorner.png',
      'Img/LeftDownCorner.png',
      'Img/RightUpCorner.png',
      'Img/RightDownCorner.png',
      'Img/CircacroLogo.gif',
      'Img/GipsyCircusLogo2.gif',
      'Img/homesymbol.gif'
    );
    var k=-1;
    var I = new Array();
   Preload();
    function Preload()
    {    k++;
        if ( k<ImgPathArr.length )
        {    I[k] = new Image();
            I[k].onload =function()  { Preload(); };    
            I[k].src = ImgPathArr[k];
        }
    }
    
    pas testé, il reste peut-être des erreurs, "mais pas loin",
    ( et on peut améliorer/simplifier... ! )
    et pas de raisons que ça ne baigne pas, sauf mes erreurs

   
0
XtremDuke Messages postés 626 Date d'inscription samedi 28 septembre 2002 Statut Membre Dernière intervention 18 mai 2009 4
28 avril 2009 à 12:46
@mono :

Es-tu sûr que le préchargement vaut le coup dans ta situation ? En générale on utilise cette méthode pour des images lourdes et non pour des éléments du décor.
Si tu veux utiliser cet effet d'affichage sans attente, alors tu ne dois afficher ton document qu'une fois tes images préchargées. Est-ce bien ça que tu veux?
0
mono_neurone Messages postés 48 Date d'inscription mercredi 10 décembre 2003 Statut Membre Dernière intervention 29 juin 2009
28 avril 2009 à 13:46
@ Bul3 :
Merci je vais tester ca! J'avais a peu pret testé le meme code hier (apres avoir vu ton post) mais ce ne coute rien de réessayer ;-). On doit pas etre loin de la soluce effectivement mais pourquoi ca plantouille je ne me l'explique pas clairement.
@ XtremDuke :
Oui c'est bien cela que je veux faire: afficher ma page une fois quelques images légères chargées. C'est des petites images du style coins arrondis etc. Du "design" quoi. Mais je trouve ca tres moche quand ca charge et qu'il a 4 gros trous en attendant les images de mes coins arrondis.
C'est pour ca que je veux faire un preload récursif sur l'event onload pour chacune de mes images et une fois le dernier load terminé, rediriger l'utilisateur sur la "véritable" première page du site.
Il y a une autre méthode que ce que je fais pour arriver au meme résultat ? Une méthode plus propre ?
0
XtremDuke Messages postés 626 Date d'inscription samedi 28 septembre 2002 Statut Membre Dernière intervention 18 mai 2009 4
28 avril 2009 à 13:51
Bah alors oui pourquoi pas mais signale avant de charger tes images que tu t'appretes à les charger sinon l'utilisateur qui se connect via gsm (par exemple) sur ta page rique d'avoir une page blanche et de se demander pourquoi rien ne s'affiche.
0
Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 16
28 avril 2009 à 14:04
>>>avoir une page blanche et de se demander pourquoi rien ne s'affiche.
c'est entr'autres l'un des problèmes de
ces preload utilisés à tort et à travers
>>qui se connect via gsm
avec un modem 56k : même punition !
0
Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 16
28 avril 2009 à 14:09
et en adsl, c'est... inutile ( pour le moins )
mais bon....
0
mono_neurone Messages postés 48 Date d'inscription mercredi 10 décembre 2003 Statut Membre Dernière intervention 29 juin 2009
28 avril 2009 à 14:25
@ XtremDuke :
Oui je compte en effet faire une espèce de "splash screen" pour faire un peu patienter les users qui auraient une petite bande passante. De plus ce splash screen me permetra, pour les utilisateurs n'ayant pas javascript actif, de déterminer la largeur de l'ecran avec une question du style "Combien de balles s'affichent a votre ecran?". Selon le nombre j'aurai une idée de la résolution a adopter par la suite pour l'affichage... Mieux que rien ;-)
Puis peut etre un petit texte de bienvenue on vera.

@Bul3:
je ferai attention promis, je chargerai pas 5Mo d'images avant d'afficher ma page principale .
Pour l'adsl... je suis pas tout a fait d'accord. J'ai une connec adsl avec une bande passante qui n'est pas extraordinaire du fait de mon éloignement avec la centrale. Du coups, meme avec l'adsl mes pages ne s'affichent pas instantanément . C'est mieux que du 56k quand meme mais c'est loin de la véritable rapidité d'une ligne adsl. Et comme je ne pense pas etre le seul dans le cas ... surtout en Belgique (pays de prédilection de la connection pourrie!) ...
0
Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 16
28 avril 2009 à 14:40
>>pays de prédilection de la connection pourrie!
tu ne sais pas ce qui se passe dans nos belles provinces françaises !
perso, j'ai 56k car 10€ / mois, sinon, je ne peux que du 512k en non
dégroupé pour 30€ ! ça ne vaut pas le coup...
0
XtremDuke Messages postés 626 Date d'inscription samedi 28 septembre 2002 Statut Membre Dernière intervention 18 mai 2009 4
28 avril 2009 à 14:59
Allez Bul3, tu fais une croix sur un resto et tu te paies un débit pratiquement 10 fois superieur :)
0
Rejoignez-nous