11548 sujets

JavaScript, DOM et API Web HTML5

But : déplacer une grande carte avec la souris dans un div qui n'affiche qu'une petite partie de cette carte.

OK sous IE
+/- KO sous Firefox Smiley biggol :

onmousedown autorise le déplacement
onmousemove ... déplace la carte
onmouseup et onmouseout arrêtent le déplacement (appel de la même fonction)

Sous FF OK via onmouseout et KO via onmouseup alors que c'est la même fonction qui est appelée Smiley biggol Smiley biggol Smiley biggol

Voici le code :

	<script type="text/javascript">
  <!--
  var clickX = 0; // init X mouse position on mouse click.
  var clickY = 0;
  var X = 0;      // init X mouse position (used during drag).
  var Y = 0;
  var constX = 0; // init image position in the div before click.
  var constY = 0;
  var stopIt = true;
  
  function clickIt(e) { 
  // get the mouse position in the div when the user clicks.
    if (e.pageX) { // Netscape.
      realLeft = e.pageX;
      realTop = e.pageY;
    } else if (e.clientX) { // IE & Firefox.
      realLeft = e.clientX + (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft);
      realTop = e.clientY + (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop);
    }
    clickX = realLeft - X - constX; 
    clickY = realTop - Y - constY;
    stopIt = false; // to say to moveIt() that the image can be moved.
    return;
  } 
  
  function dropIt() { 
  // drop the background when user release the mouse button or quit the div.
    clickX = 0;
    clickY = 0;
    constX = -X; // store old background position.
    constY = -Y;
    stopIt = true;  // to say to moveIt() that the image can't be moved anymore.
    return;
  }
  
  function moveIt(e) { 
  // change background position in the div when the user moves the mouse.
    if (stopIt == false) {
      p = document.getElementById('mapNord').style;
      if (e.pageX) { 
        realLeft = e.pageX;
        realTop = e.pageY;
      } else if (e.clientX) {
        realLeft = e.clientX + (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft);
        realTop = e.clientY + (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop);
      }
      X = realLeft - constX - clickX; 
      Y = realTop - constY - clickY; 
      // limit the move to image width and height
      if (X > 0) X = 0;
      if (Y > 0) Y = 0;
      var w = 2509-640; // image width="2509" - div width=640 .
      var h = 1329-300; // image height="1329" - div height=300.
      if (X < -w) X = -w;
      if (Y < -h) Y = -h;
      // new background position
      var newpos = X + "px " + Y + "px";
      p.backgroundPosition = newpos;
    }
    return;
  } 
  // -->
  </script> 


Dans FF, la var stopIt semble ne pas être modifiée tant que l'event onmousemove est généré, or via une alert dans dropIt(), stopIt est bien mis à "true" lors du onmouseup !!?

Merci d'avance pour votre aide.
Bonjour,

dans
  constX = -X; // store old background position.

Tu récupères une variable string. Ne devrais-tu pas utiliser
-parseInt(X)
Merci pour ta réponse chmel,

Hélas, pas de changement (je m'y attendais mais il fallait effectivement tester Smiley cligne )
En fait, tout semble se passer comme si Firefox considérait la variable "stopIt" comme locale dans la fonction "moveIt(e)".

Une autre idée ?
Tu peut t'inspirer de ça ou j'ai pris en compte aussi les scrolls et IE5, NS6
Modifié par chmel (28 Nov 2005 - 15:43)
Trouvé !
La distraction est la mère de tous les problèmes.
En fait il n'y a pas d'erreur dans le code ci-dessus mais un bout de code d'un test précédent "oublié" en fin de page ... et incompris par IE
Un petit doigt qui appuya sur "PageDown" rendi visible la bêtise et honteux et confus son auteur. Smiley confused
Je jure mais un peu tard qu'on ne m'y prendra plus !

Le code ci-dessus fonctionne donc parfaitement.
Si quelqu'un pouvait tester sous Nestscape, ce serait sympa !
En attendant je mets un petit [Résolu]
Modifié par g41687 (29 Nov 2005 - 09:21)