Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Prototype] Array au comportement étrange

    2 avril 2009 à 22:00:47

    Bonjour, je sèche complètement sur ce code:
    function event_handler_dir(){
    	dir = new Array('nord-ouest', 'nord', 'nord-est', 'ouest', 'est', 'sud-ouest', 'sud', 'sud-est');
    	for(var i=0; i < dir.length; i++){
    		Event.observe('rose_'+dir[i], 'mouseover', function(){dr(dir[i]);});
    		Event.observe('rose_'+dir[i], 'click', function(){fd(dir[i]);});
    		Event.observe('rose_'+dir[i], 'mouseout', rd);
    	}
    }
    


    Evidemment, je suis ici parce que ça ne marche pas.
    Aucune erreur JS avec firefox.
    Quelques tests: les fonctions appelées (dr, rd, et fd) fonctionnent bien, juste que l'argument passé par l'array est "undefined" dans ces fonctions.
    Lorsque j'affiche dir[i], je vois les directions, donc tout va bien, mais dans les fonctions appelées, l'argument est indéfini...
    Bref, je sèche vraiment.

    merci d'avance si vous avez un idée.
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      2 avril 2009 à 22:20:04

      ouais normal en fait. essaie avec
      Event.observe('rose_'+dir[i], 'mouseover', (function () {
          return function(){dr(dir[i]);}
      })());
      Event.observe('rose_'+dir[i], 'click', (function () {
          return function(){fd(dir[i]);}
      })());
      


      J'ai un peu la flemme d'expliquer mais si tu est curieux documente toi sur les closures et le fait que le code javascript est interprété à l'exécution et non à la compilation.

      ( edit ) bon un minimum quand meme, touts tes appels sont équivalents à function () {fd(dir[8])} . Tous sans exceptions, il faut le code d'au dessus pour avoir fd(dir[0]), fd(dir[1]) et compagnie :)
      • Partager sur Facebook
      • Partager sur Twitter
        3 avril 2009 à 13:42:34

        Je déteste répondre ça, mais ça marche pas ^^ , même chose :/
        J'ai cherché un peu sur les closures, mais j'ai rien trouvé de précis.
        Le truc que je pige pas, c'est que la fonction est bien appelée, mais que l'argument est nul. En gros je ne sais pas quel est le troisième argument de Event.observe dans mon cas. Il faudrait mettre une fonction avec un argument fixé, mais si j'ai bien compris, le dir[i] n'est pas interprêté ? bref, je nage un peu là ^^
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          3 avril 2009 à 13:55:17

          Event.observe('rose_'+dir[i], 'mouseover', (function (dir) {
              return function(){dr(dir);}
          })(dir[i]));
          Event.observe('rose_'+dir[i], 'click', (function (dir) {
              return function(){fd(dir);}
          })(dir[i]));
          


          Mes souvenirs sont vieux là dessus. Là ça passe non ?
          • Partager sur Facebook
          • Partager sur Twitter
            3 avril 2009 à 18:07:26

            Ca passe, merci beaucoup. Et il me semble que je comprend comment ça marche.

            J'ai aussi un autre problème: je galère pour avoir un quelconque JS compatible avec mon IE6. Je dis "mon" IE6, parce que depuis que j'ai installé IE8, mon le IE6 de multiple IEs merde vraiment: je ne peux plus remplir une balise input de texte, chaque erreur javascript donne une erreur 84 (erreur du programme IE) et des trucs qui ne sont pas sensés bugger, comme la Ajax.request de prototype, qui est compaible IE6 il me semble, plantent...

            En tout cas, merci pour ton aide :)
            • Partager sur Facebook
            • Partager sur Twitter

            [Prototype] Array au comportement étrange

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown