Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > JavaScript
JavaScript Forum programmation JavaScript. Lire : Cours JavaScript, FAQ JavaScript, Toutes les FAQ JavaScript et Sources JavaScript
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/07/2011, 14h19   #1
Candidat au titre de Membre du Club
 
Inscription : décembre 2010
Messages : 45
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 45
Points : 10
Points : 10
Par défaut Position de souris et event

Bonjour,

Après un tas de recherches de scripts permettant d'obtenir la position de la souris, j'ai fini par en trouver un qui fonctionne, mais uniquement sous Chrome et IE (moi qui pensais que chrome fonctionnait comme FF).
En gros ca marche pas sous FF.

J'ai lu que cela pouvait venir de la gestion d'évènement par FireFox, mais je ne comprend pas car ce script semble bien calculer la présence ou non de l'objet event, le voici:

Code :
1
2
3
4
5
6
7
8
function getMousePosition(event)
// Retourne la position de la souris sours forme de tableau
// Utiliser getMousePosition(event)[0] et getMousePosition(event)[1]
{
	var e = event || window.event;
	var scroll = new Array((document.documentElement && document.documentElement.scrollLeft) || window.pageXOffset || self.pageXOffset || document.body.scrollLeft,(document.documentElement && document.documentElement.scrollTop) || window.pageYOffset || self.pageYOffset || document.body.scrollTop);;
	return new Array(e.clientX + scroll[0] - document.body.clientLeft,e.clientY + scroll[1] - document.body.clientTop);
}
Et voici comment je l'utilise (cela se trouve à l'interieur d'un code créant des points googleMaps)
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//Entete fonction
function createMarker(point, id, domaine) 
 
//Creation des points... (ok)
 
 
GEvent.addListener(marker, "mouseover", function() { 
var mouseInfo = document.getElementById('domaine'); //j'attrape ma div
mouseInfo.innerHTML = domaine ; //Je remplis le contenu de ma div (ok)
 
var mousePosition = getMousePosition(event); //Recuperation des coordonnées de la souris 
mouseInfo.style.left = mousePosition[0]+20; // Modification de la position de la div selon position souris
mouseInfo.style.top = mousePosition[1];
		} );
Si quelqu'un saurait me dire ce que ne va pas dans ma fonction getMousePosition (enfin je pense que ca vient de là) je lui en serait reconnaissant !
oni13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2011, 14h31   #2
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 807
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2008
Messages : 13 807
Points : 35 797
Points : 35 797
Voir : Comment récupérer les coordonnées de la souris ?

Citation:
moi qui pensais que chrome fonctionnait comme FF
Non, Chrome fonctionne comme Safari
__________________
Pas de question technique par MP !
Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, contactez-moi !
Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
Mon livre sur jQuery
Bovino est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/07/2011, 15h24   #3
Candidat au titre de Membre du Club
 
Inscription : décembre 2010
Messages : 45
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 45
Points : 10
Points : 10
Ok, mais ce script (qui s'ajoute au grand nombre de scripts que j'ai trouvé) ne fonctionne toujours pas sous FF, mais vu que l'exemple fonctionne, j'ai du faire une bêtise...

déjà je l'ai un peu modifié pour qu'il retourne un tableau, c'est gênant?
Code :
1
2
3
4
5
6
7
8
9
10
function getMousePosition(e){
    if(e){
	var tab = [e.pageX, e.pageY];
        }
    else{
        var monBody = document.documentElement || document.body;
	var tab = [window.event.x + monBody.scrollLeft, window.event.y + monBody.scrollTop];
    }
return tab;
}
Ensuite c'est peut-ête que je n'utilise pas (je n'ai rien compris) ce
Code :
target.dispatchEvent("click");
Dans mon code je dois le placer ou du coup?
A la place de mouseover ici? Car ca n'a pas fonctionné
Code :
GEvent.addListener(marker, "mouseover", function() {
oni13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2011, 18h58   #4
Modérateur
 
Avatar de NoSmoking
 
Homme
Inscription : janvier 2011
Messages : 2 944
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 2 944
Points : 4 774
Points : 4 774
Bonjour,
il faut bien lire la FAQ pour voir que le fonction detectMouse() est mise sur l'événement du body onmousemove, ce qui veux dire que la fonction s'exécute en tâche de fond à chaque déplacement de la souris.

Te concernant, comme tu utilises l'API GoogleMap et que tu as mis un écouteur sur le mouseover d'un marker, il te suffit dans ce cas de récupérer la position de la mouse, mise à jour, à ce moment là.

Mais il y a mieux, tu peux récupérer, via l'API, la position de la mouse dans la map.

exemple :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<script type="text/javascript">
var oInfo;
function initialize() {
  if (GBrowserIsCompatible()) {
    var map = new GMap2(document.getElementById("map_canvas"));
    map.setCenter(new GLatLng(46.9041736, 2.350987), 6);
 
    GEvent.addListener(map, "mousemove", function( /*overlay,*/ data){
      if( data){
        // recup position
        var pos = map.fromLatLngToContainerPixel( data);
        // affichage
        oInfo = oInfo ? oInfo : document.getElementById('info');
        oInfo.innerHTML = 'X : ' +pos.x +'<br>Y : ' +pos.y;
      }
    });
  }
}
</script>
</head>
<body onload="initialize()" onunload="GUnload()">
  <div id="map_canvas" style="margin:auto;width: 600px; height: 600px"></div>
  <div id="info"></div>
</body>
</html>
je te laisse intégrer les insertions des différents fichiers

PS: il est temps de passer à la V3 de l'API
Citation:
Envoyé par Google Map
Note: The Google Maps Javascript API Version 2 has been officially deprecated as of May 19, 2010. The V2 API will continue to work as per our deprecation policy, but we encourage you to migrate your code to version 3 of the Maps Javascript API.
NoSmoking est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/07/2011, 20h51   #5
Candidat au titre de Membre du Club
 
Inscription : décembre 2010
Messages : 45
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 45
Points : 10
Points : 10
Oui j'ai bien remarqué que cela calculait la position à chaque mouvement de souris, je cherchais simplement à faire calculer la position au "mouseOver" de mon point et non au "onMouseMove" complet.

Je vais tester ce dernier script qui m'a effectivement l'air plus logique, je test ça demain sinon je reste sur un calcul avec onmousemove ça devrait fonctionner.

Merci
oni13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 12h10   #6
Candidat au titre de Membre du Club
 
Inscription : décembre 2010
Messages : 45
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 45
Points : 10
Points : 10
Ok, je n'ai pas utilisé le script de position dans la carte car j'utilise une div absolue.

Par contre, le script de l'exemple ne fonctionnait pas chez moi, plus particulierement la conditiond de présence de l'évènement:
je n'entrais jamais dans le else, j'ai donc mis:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function getMousePosition(e){
var nomnav = navigator.appName;
 
if(e){
     document.getElementById('zone').innerHTML = e.pageX+20 ;
     document.getElementById('zone1').innerHTML = e.pageY;
}
if (nomnav == 'Microsoft Internet Explorer')
{
 
	document.getElementById('zone').innerHTML = window.event.clientX + document.body.scrollLeft + 20;
	document.getElementById('zone1').innerHTML = window.event.clientY + document.body.scrollTop;
	}
}
De plus, utiliser la variable:
var monBody = document.documentElement || document.body;

ne fonctionnait pas, bizarre... j'ai donc fais sans et utilisé directement document.body


Voilà bon je sais pas pourquoi j'ai eu ces soucis, mais au cas ou quelqu'un les rencontre aussi :O.

merci encore pour votre aide
oni13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 12h15   #7
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 807
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2008
Messages : 13 807
Points : 35 797
Points : 35 797
Code :
if (nomnav == 'Microsoft Internet Explorer')
Attention, depuis la version 9 il me semble, la gestion des événements d'IE a été standardisée, ce qui signifie qu'avec IE >= 9, tu rentreras dans les deux conditions.
__________________
Pas de question technique par MP !
Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, contactez-moi !
Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
Mon livre sur jQuery
Bovino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 13h25   #8
Candidat au titre de Membre du Club
 
Inscription : décembre 2010
Messages : 45
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 45
Points : 10
Points : 10
Justement je suis sous IE9 et ça ne fonctionnait pas.
Car il rentre dans la première condition alors qu'il ne devrait pas (enfin il y rentre mais ça ne marche pas). Il semblerait donc que IE9 fonctionne comme le 8.

Ce n'est pas gênant qu'il rentre dans les 2 conditions, cela ne fera que remplacer le contenu de mon span.

Le code marche sous IE 9 et 8, chrome, firefox. (bug sur IE7)

A revérifier alors quand IE10 sera parmi nous... mais je ne vois pas quoi faire alors, à part vérifier la version de IE dans ma condition
oni13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 20h25   #9
Modérateur
 
Avatar de NoSmoking
 
Homme
Inscription : janvier 2011
Messages : 2 944
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 2 944
Points : 4 774
Points : 4 774
Citation:
Par contre, le script de l'exemple ne fonctionnait pas chez moi, plus particulierement la conditiond de présence de l'évènement:
visiblement tu n'as pas choisi la meilleur

Citation:
ne fonctionnait pas, bizarre... j'ai donc fais sans et utilisé directement document.body
tu as quoi comme DOCTYPE à ton document ?

Citation:
Ok, je n'ai pas utilisé le script de position dans la carte car j'utilise une div absolue.
je ne saisie pas le soucis, il suffit de rajouter les offsetLeft et offsetTop, de la DIV contenant la map, aux valeurs retournées par la fonction, qui elles sont relatives à la DIV contenant la map.
NoSmoking est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/07/2011, 00h21   #10
Candidat au titre de Membre du Club
 
Inscription : décembre 2010
Messages : 45
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 45
Points : 10
Points : 10
Eh bien pour la condition j'ai utilisé celle du tuto: if(e)... e étant le paramètre "event". Mais comme je l'ai remarqué, c'était simplement IE9 qui buguait

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

Ok pour offsetLeft et offsetTop mais à vrai dire c'est aussi que je n'arrivais pas à obtenir mes coordonnées (bonne ou pas) mais j'ai pas osé le dire
oni13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/07/2011, 13h52   #11
Membre chevronné
 
Homme Krusty
Inscription : mai 2009
Messages : 472
Détails du profil
Informations personnelles :
Nom : Homme Krusty
Localisation : France

Informations forums :
Inscription : mai 2009
Messages : 472
Points : 617
Points : 617
ie ne supporte pas pageX et page Y toutes versions confondu


pour etre compatible avec tous les navigateur

Code :
1
2
3
4
5
6
7
8
9
10
 
function getMousePosition(e){
 
var document_scroll=(navigator.vendor) ? document.body : document.documentElement;
 
e =(!e) ? window.event : s;
 
var posX =e.clientX + document_scroll.scrollLeft;
var posY =e.clientY + document_scroll.scrollTop;
}
__________________
programmer n'est pas connaitre tous les moindres détails d'un langage mais savoir exploiter sous toutes ses facettes ce que l'on connait.
mekal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/07/2011, 18h01   #12
Candidat au titre de Membre du Club
 
Inscription : décembre 2010
Messages : 45
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 45
Points : 10
Points : 10
Citation:
Envoyé par mekal Voir le message
ie ne supporte pas pageX et page Y toutes versions confondu


pour etre compatible avec tous les navigateur

Code :
1
2
3
4
5
6
7
8
9
10
 
function getMousePosition(e){
 
var document_scroll=(navigator.vendor) ? document.body : document.documentElement;
 
e =(!e) ? window.event : s;
 
var posX =e.clientX + document_scroll.scrollLeft;
var posY =e.clientY + document_scroll.scrollTop;
}
Le problème vient de e =(!e) ? window.event : s; car en gros IE9 prend ce test comme si il possédait l'event (car apparemment c'est le cas) mais justement il ne supporte pas pageX.
D'ou mon
Code :
if (nomnav == 'Microsoft Internet Explorer')
oni13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/07/2011, 18h17   #13
Membre chevronné
 
Homme Krusty
Inscription : mai 2009
Messages : 472
Détails du profil
Informations personnelles :
Nom : Homme Krusty
Localisation : France

Informations forums :
Inscription : mai 2009
Messages : 472
Points : 617
Points : 617
en regardant j'ai fait une erreur il y a un s qu'il faut remplacer par e

Code :
e =(!e) ? window.event : e;
pour en revenir a ie 9 il supporte les deux syntaxes mais il vaut mieux préférer la syntaxe ou l'evenement est mis en parametre car c'est celle qui est couramment employé on fait donc le teste qui est de savoir si (e) n'est pas null sa permet de choisir automatique la solution precedement cité et on a pas besoin de tester le navigateur car on fait la difference entre ie 6 7 8 et les autres navigateurs ie 9 ff chrome ...etc donc
Code :
if (nomnav == 'Microsoft Internet Explorer')
sert a rien.
__________________
programmer n'est pas connaitre tous les moindres détails d'un langage mais savoir exploiter sous toutes ses facettes ce que l'on connait.
mekal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/07/2011, 19h36   #14
Candidat au titre de Membre du Club
 
Inscription : décembre 2010
Messages : 45
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 45
Points : 10
Points : 10
Si IE9 supporte les 2 syntaxes, pourquoi ce code ne fonctionne-t-il pas?
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
function getMousePosition(e){
 
if(e){
     document.getElementById('zone').innerHTML = e.pageX+20 ;
     document.getElementById('zone1').innerHTML = e.pageY;
}
else
{
 
	document.getElementById('zone').innerHTML = window.event.clientX + document.body.scrollLeft + 20;
	document.getElementById('zone1').innerHTML = window.event.clientY + document.body.scrollTop;
	}
}
J'ai inséré ton fonction, mais la prise en compte du sroll ne fonctionne pas (enfin si, mais que sous chrome). j'imagine que cela vient de mon doctype c'est ca?

PS: Dsl je répond un peu tard mais bon j'ai pas pu plus tot.

http://grignan-adhemar-vin.fr/new/f/vignerons.php
oni13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/07/2011, 19h50   #15
Membre chevronné
 
Homme Krusty
Inscription : mai 2009
Messages : 472
Détails du profil
Informations personnelles :
Nom : Homme Krusty
Localisation : France

Informations forums :
Inscription : mai 2009
Messages : 472
Points : 617
Points : 617
comme ca

Code :
1
2
3
4
5
6
7
8
9
10
 
function getMousePosition(e){
 
var document_scroll=(navigator.vendor) ? document.body : document.documentElement;
 
e =(!e) ? window.event : e;
 
document.getElementById('zone').innerHTML =e.clientX + document_scroll.scrollLeft;
document.getElementById('zone1').innerHTML =e.clientY + document_scroll.scrollTop;
}
décapitage

Code :
var document_scroll=(navigator.vendor) ? document.body : document.documentElement;
cette ligne sert a différencier chrome et safari face aux autres navigateurs dans la gestion du scroll


Code :
e =(!e) ? window.event : e;
cette ligne sert a differencier Iinternet explorer 6 7 et 8 face aux autres navigateurs dans la gestion des evenement
__________________
programmer n'est pas connaitre tous les moindres détails d'un langage mais savoir exploiter sous toutes ses facettes ce que l'on connait.
mekal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/07/2011, 20h45   #16
Candidat au titre de Membre du Club
 
Inscription : décembre 2010
Messages : 45
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 45
Points : 10
Points : 10
Oui c'est exactement le code que j'ai inséré sur ma page (lien message précédent). La position de la souris fonctionne sur tous les navigateurs, mais pas la prise en compte du scroll. Donc le test de l'event marche, mais pas celui de différentiation pour le scrolling.

Cela ne fonctionne que sous chrome (et théoriquement safari)
oni13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/07/2011, 21h45   #17
Modérateur
 
Avatar de NoSmoking
 
Homme
Inscription : janvier 2011
Messages : 2 944
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : janvier 2011
Messages : 2 944
Points : 4 774
Points : 4 774
je te livre celle que j'utilise, la 259 éme donc
Code :
1
2
3
4
5
6
7
8
9
  //----------------------
  function getPosMouse( e){
    e = e || event;
    var dE = document.documentElement,
        dB = document.body;
    var mX = e.pageX || ( event.clientX +( dE && dE.scrollLeft || dB && dB.scrollLeft || 0) -( dE.clientLeft || 0));
    var mY = e.pageY || ( event.clientY +( dE && dE.scrollTop  || dB && dB.scrollTop  || 0) -( dE.clientTop  || 0));
    return({ x : mX, y : mY});
  }
mais pourquoi ne pas utiliser cette de la ?
NoSmoking est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/07/2011, 23h36   #18
Candidat au titre de Membre du Club
 
Inscription : décembre 2010
Messages : 45
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 45
Points : 10
Points : 10
Citation:
Envoyé par oni13 Voir le message

Par contre, le script de l'exemple ne fonctionnait pas chez moi, plus particulierement la conditiond de présence de l'évènement:
je n'entrais jamais dans le else, j'ai donc mis:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function getMousePosition(e){
var nomnav = navigator.appName;
 
if(e){
     document.getElementById('zone').innerHTML = e.pageX+20 ;
     document.getElementById('zone1').innerHTML = e.pageY;
}
if (nomnav == 'Microsoft Internet Explorer')
{
 
	document.getElementById('zone').innerHTML = window.event.clientX + document.body.scrollLeft + 20;
	document.getElementById('zone1').innerHTML = window.event.clientY + document.body.scrollTop;
	}
}
De plus, utiliser la variable:
var monBody = document.documentElement || document.body;

ne fonctionnait pas, bizarre... j'ai donc fais sans et utilisé directement document.body
Par "exemple" je voulais dire FAQ.
Cette fonction là marche niquel :O !
Elle prend en compte suffisamment de paramètres je pense, j'avais réussi à faire marcher mon script mais avec la condition qui "sert à rien" de repérage de IE.

Merci bien pour tout cela !
oni13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h33.


 
 
 
 
Partenaires

Hébergement Web