11548 sujets

JavaScript, DOM et API Web HTML5

Bonjour à toutes et à tous,

je fais un exercice sur les évènements qui fonctionne bien sur Internet Explorer 8.0 (je suis encore sous windows XP) et sous Firefox 11.0

Or à ma grande surprise, cela ne fonctionne pas sous opera 12.0, safari 5.1.5 et sous chrome 18.0. ? Et je ne sais pas pourquoi !

Qu'est-ce que j'ai oublié de faire ?

Voici le HTML :
<!DOCTYPE html>
<html>
<head>
<!-- ==== -->
<!-- Meta -->
<!-- ==== -->
<meta http-equiv="Content-Type"        content="text/html; charset=ISO-8859-1" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<meta http-equiv="Content-Style-Type"  content="text/css" />
<title>Drag and Drop</title>
<!-- ========== -->
<!-- JavaScript -->
<!-- ========== -->
<script src="Script.js" type="text/javascript"></script>
<!-- ====================== -->
<!-- Cascading Style Sheets -->
<!-- ====================== -->
<link href="Styles.css" rel="stylesheet" type="text/css" />
</head>

<body>
	<div>Cliquez et déplacer l'image ou le texte !</div>
	<div><img class="drag" src="Images/world.jpg" /></div>
	<div      class="drag" id="text">texte</div>
</body>
</html>


Voici le CSS :
.drag {
		position			: relative;
		cursor				: move;
		z-index				: 1;
}
#text {
		width				: 40px;
		font-size			: xx-large;
		font-weight			: bolder;
}


et pour terminer, le JAVASCRIPT :
window.onload = function ()
{
	document.onmousedown = DragDrop.Down;
	document.onmouseup   = DragDrop.Up;
}

/*************************/
/*                       */
/*     Drag and Drop     */
/*                       */
/*************************/

DragDrop = {

startX  : 0,			/* position de départ de la souris */
startY  : 0,

offsetX : 0,			/* position de la cible            */
offsetY : 0,

target  : null,			/* objet cible que l'on déplace    */
zIndex  : null,			/* mettre l'objet par dessus       */

/*===================================================*/
/*     On Clic sur le bouton Gauche de la Souris     */
/*===================================================*/

Down: function(e)
{
	e           = e        || window.event;
	this.target = e.target || e.srcElement;

	if (this.target.nodeType == 3)
		this.target = this.target.parentNode;

	/*-----------------------------------------*/
	/*     Identification du Bouton Gauche     */
	/*-----------------------------------------*/

	var test = false;
	
	if (this.target.className == "drag")
	{
		test = (window.event) ? (e.button == 1) : (e.button == 0);
	}

	if (test)
	{
		/*-----------------------------*/
		/*     Position du Curseur     */
		/*-----------------------------*/

		if (window.event)
		{
			this.startX = e.clientX;
			this.startY = e.clientY;
		}
		else
		{
			this.startX = e.pageX;
			this.startY = e.pageY;
		}

		/*------------------------------*/
		/*     Position de la cible     */
		/*------------------------------*/

		this.offsetX = (this.target.style.left) ? parseInt(this.target.style.left) : 0;
		this.offsetY = (this.target.style.top)  ? parseInt(this.target.style.top)  : 0;
	
		/*-----------------------------------------*/
		/*     On met la cible au premier plan     */
		/*-----------------------------------------*/

		this.zIndex              = (this.target.style.zIndex) ? this.target.style.zIndex : 1;
		this.target.style.zIndex = 100;

		/*-----------------------------------------*/
		/*                                         */
		/*-----------------------------------------*/

		document.body.focus();
		document.onmousemove = DragDrop.Move;

		/*----------------------------------------*/
		/*     Spécifique à Internet Explorer     */
		/*----------------------------------------*/

		if (document.all)
		{
			document.onselectstart   = function () { return false; };
			this.target.ondragstart  = function () { return false; };
		}

		return false;
	}
},

/*==================================================*/
/*     On relache le bouton Gauche de la Souris     */
/*==================================================*/

Up: function (e)
{
	if (this.target)
	{
		if (document.all)
		{
			document.onselectstart  = null;
			this.target.ondragstart = null;
		}

		this.target.style.zIndex = this.zIndex;
		document.onmousemove     = null;
		this.target              = null;
	}
},

/*==================================*/
/*     Déplacement de la Souris     */
/*==================================*/

Move: function (e)
{
	e = e || window.event;

	if (window.event)
	{
		var posX = e.clientX;
		var posY = e.clientY;
	}
	else
	{
		var posX = e.pageX;
		var posY = e.pageY;
	}

	this.target.style.left = (this.offsetX + posX - this.startX) + "px";
	this.target.style.top  = (this.offsetY + posY - this.startY) + "px";
}

};


@+
Modifié par Artemus24 (22 Apr 2012 - 16:36)
Salut,

Un petit problème au niveau de ton test...
test = (window.event) ? (e.button == 1) : (e.button == 0);
Avec un petit code comme ça :
http://jsfiddle.net/2qrmu/3/
On peut faire des tests sur les valeurs de boutons sur les différents navigateurs et se dresser un petit tableau (ou liste ici) :
IE :
- window.event existe
- Clic gauche : 1
- Clic droit : 2
- Molette : 4
Firefox :
- window.event n'existe pas
- Clic gauche : 0
- Clic droit : 2
- Molette : 1
Chrome :
- window.event existe
- Clic gauche : 0
- Clic droit : 2
- Molette : 1
Opéra :
- window.event n'existe pas
- Clic gauche : 0
- Clic droit : 2
- Molette : Il ne semble pas détecter l'appui sur la molette...

Or, comme on peut le voir pour chrome, window.event existe et la valeur de son clic gauche est 0...
Donc test incomplet...

Pour Opéra, ton code fonctionne chez moi...
Modifié par Gothor (23 Apr 2012 - 16:32)
Salut

Exactement, ta condition (window.event) ? n'est pas la bonne pour faire distinction entre MSie et les autres navigateurs, window.event, n'est pas reconnu par firefox, c'est pour cela qu'il marche sur Firefox à l'addition de de IE.
Remplace la condition de test par une detection de ie, par exemple:
(navigator.appName == 'Microsoft Internet Explorer') ?

ou autre chose, selon ton choix.
a+
Bonjour Gothor,

merci de ton aide !
J'ai un ordinateur portable. Je peux soit cliquer, bouton gauche, bouton droit et un ascenseur.
J'ai refais les tests selon tes indications et je te communique mon tableau récapitulatif :
+==============+==============+===========================+
|              |              |          Boutons          |
|  Navigateur  | window.event |---------------------------|
|              |              |  Clic  | Gauche | Droite  |
+==============|==============|===========================+
| MSIE 8.0     |    Existe    |    1   |    1   |    2    |
| FF 11.0      | N'existe pas |    0   |    0   |    2    |
| Chrome 18.0  |    Existe    |    0   |    0   |    2    |
| Safari 5.1.5 |    Existe    |    0   |    0   |    2    |
| Opera 12.0   |    Existe    |    0   |    0   |    2    |
+==============+==============+===========================+


Donc OUI, mon test est faux et je comprends mieux pourquoi cela ne fonctionnait que sur MSIE 8.0 et Firefox.

En fait, j'ai mis cela à la place (ci-dessous), mais ça ne me plait pas du tout, mais au moins cela fonctionne.
test = (e.button == 1) || (e.button == 0);

As-tu une suggestion à me faire concernant ce test afin qu'il ne soit pas trop rigide ?
Du genre, à ne pas faire :
--> si MSIE 8.0 faire e.button ==1
--> si firefox faire e.button == 0
--> si chrome faire e.button == 1
--> si safara faire e.button == 1
--> si opera faire e.button == 1

Par contre, je ne comprends pas notre divergence en ce qui concerne opéra ?
J'ai testé si j'avais la dernière version et c'est bien le cas !
Je suis sous windows XP et voici ce que me donne opéra :
À propos d'Opera
Informations sur la version
Version
12.00 alpha 
Révision
1328 
Plate-forme
Win32 
Système
Windows XP 
XHTML+Plug-in Vocal
Plug-in non chargé 
Identification du navigateur

Opera/9.80 (Windows NT 5.1; U; Edition Next; fr) Presto/2.10.269 Version/12.00


As-tu fait une mise à jour de ton navigateur opéra ?

Cordialement !
Artémus24.
@+
Artemus24 a écrit :

En fait, j'ai mis cela à la place (ci-dessous), mais ça ne me plait pas du tout, mais au moins cela fonctionne.
test = (e.button == 1) || (e.button == 0);



Ta condition risque de faire fonctionner le drag, pour le bouton "Middle" de la souris (e.button->1), sur tout les navigateurs à part le MSIE qui lui attribut la valeur 4 (e.button->4)
Bonsoir à toutes et à tous,

@ unami : je suis entièrement d'accord avec ta remarque !

Je sais que ce n'est pas propre.
En fait, je voudrais tester uniquement Firefox et je ne me souviens plus du "if" qui est spécifique à firefox.
Pour Internet Explorer, on fait if (document.all).

Si tu as une suggestion à me faire, je suis preneur !

@+
Artemus24 a écrit :

As-tu une suggestion à me faire concernant ce test afin qu'il ne soit pas trop rigide ?
Du genre, à ne pas faire :
--&gt; si MSIE 8.0 faire e.button ==1
--&gt; si firefox faire e.button == 0
--&gt; si chrome faire e.button == 1
--&gt; si safara faire e.button == 1
--&gt; si opera faire e.button == 1


Je crois pas que tu as besoin de reconnaitre, seulement FireFox, mais tu as besoinde reconnaitre MSIE, car ce que tu as écris la haut est erroné et doit être substitué par:

--&gt; si MSIE 8.0 faire e.button ==1 (Voilà ton exception)
--&gt; si firefox faire e.button == 0
--&gt; si chrome faire e.button == 0
--&gt; si safara faire e.button == 0
--&gt; si opera faire e.button == 0

a écrit :
Pour Internet Explorer, on fait if (document.all).


Il y en a pleine d'autres.

Bonne courage
Bonjour unami,

voici c'est exacte, je me suis planté pour mon exemple.
Par contre, le tableau que j'ai donné ci-dessus est juste !
Je n'ai plus les yeux en face des trous, ce soir.

Donc selon toi, le mieux est de faire le test suivant :
test = (document.all) ? (e.button == 1) : (e.button == 0);


@+
Modifié par Artemus24 (23 Apr 2012 - 19:50)
Bonjour,

Dans l'idéal, il faut bien entendu éviter d'utiliser navigator.appName (détection de navigateur), et préférer la détection de fonctionnalité.

Mais se baser sur document.all n'est ici pas une bonne idée puisque le support de cette fonctionnalité n'a aucun rapport avec la valeur de event.button. Un navigateur peut choisir d'implémenter document.all tout en attribuant les valeurs définies par le W3C pour event.button. Il me semble d'ailleurs qu'Opera implémente ou a implémenté document.all.

J'ai jeté un coup d'oeil chez jQuery : si event.which est définie, ils laissent cette propriété telle quelle (dans ce cas la valeur n'est pas ambiguë). Sinon, ils la redéfinissent de la façon suivante : "(button & 1 ? 1 : (button & 2 ? 3 : (button & 4 ? 2 : 0)))". Cela suppose que seul IE ne supporte pas event.which mais je pense que l'on peut faire confiance aux développeurs de jQuery à ce sujet. Les futurs navigateurs devraient implémenter event.which, je pense que c'est donc la meilleure façon de procéder.
test = (event.which ? (event.which == 1) : (event.button == 1));

Modifié par Julien Royer (07 May 2012 - 15:16)
Bonsoir Julien,

merci de ta participation !
Je ne sais pas si on te l'a dit, mais avec ton livre sur la tête, tu me fais penser à Géo Trouve Tout en plein travail !

http://premiumorange.com/renard/motivation/imageMo/Trouvetout2.jpg

Si j'ai bien compris, j'utilise document.all pour identifier uniquement MSIE.
Tu me dis que ce n'est pas très judicieux à cause d'opera.
Il vaut mieux utiliser pour les évènements, la fonction event.which qui retourne la valeur de la touche enfoncé.

Et bien sûr, cette fonction me permet d'identifier le navigateur.
Elle ne fonctionne pas pour MSIE alors qu'elle existe pour les autres navigateur.

Ce ne serait-il pas plus judicieux de tester ainsi :
test = event.which ? (event.button == 0) : (event.button == 1);

J'ai fait le test et cela fonctionne très bien.
Merci.
@+
Modifié par Artemus24 (07 May 2012 - 23:59)
Artemus24 a écrit :
Je ne sais pas si on te l'a dit, mais avec ton livre sur la tête, tu me fais penser à Géo Trouve Tout en plein travail !

On ne me l'avait jamais dit !
Artemus24 a écrit :
Si j'ai bien compris, j'utilise document.all pour identifier uniquement MSIE.
Tu me dis que ce n'est pas très judicieux à cause d'opera.
Il vaut mieux utiliser pour les évènements, la fonction event.which qui retourne la valeur de la touche enfoncé.

Et bien sûr, cette fonction me permet d'identifier le navigateur.
Elle ne fonctionne pas pour MSIE alors qu'elle existe pour les autres navigateur.

Ce ne serait-il pas plus judicieux de tester ainsi :
test = event.which ? (event.button == 0) : (event.button == 1);

J'ai fait le test et cela fonctionne très bien.

Non, tu n'as pas bien compris.

Ton code ne fonctionnera pas sur la prochaine version d'IE si celui-ci supporte event.which.

Comme les valeurs d'event.which sont cohérentes sur toutes les implémentations, on les utilise si elles sont disponibles. Sinon, on part du principe que l'on est sous IE et on interprète la seule valeur que l'on a à notre disposition, event.button.

Utiliser un test sur document.all ou event.which pour décider ce que l'on va faire, c'est de la détection de navigateur, mais moins fiable que du vrai code qui est fait pour cela.
Modifié par Julien Royer (08 May 2012 - 14:54)
Bonjour Julien Royer,

à vrai dire, je ne comprends plus très bien ce que tu me dis.

Je reprends mon problème. Je dois identifier le bouton gauche de la souris sur tous les navigateurs. Après quelques péripéties, j'arrive à la conclusion qu'il y a que deux versions :

--> sous MSIE, on teste event.button == 1
--> sur les autres navigateurs, on teste event.button == 0

Donc comment dois-je faire pour identifier le bouton gauche de ma souris, si je ne dois pas utiliser l'identification du navigateur ?

@+
Regarde attentivement le code que j'ai donné et fais une recherche sur les valeurs de event.which... Tu trouveras par exemple ceci : http://www.quirksmode.org/js/events_properties.html#button

event.which est donc la propriété à utiliser pour avoir une valeur cohérente sur tous les navigateurs (1 pour le bouton gauche). Seul IE ne la supporte pas ; dans ce cas, on utilise donc event.button (1 pour le bouton gauche).
Bonjour Julien Royer,

je comprends bien mieux l'usage du event.which !

Mais je note que le event.which est :
which is an old Netscape property.

Que dois-je comprendre par là ?
Que cette vieille propriété de Netscape sera adopté par Microsoft ?
Ou est-ce que cette fonctionnalité va disparaitre ?

@+
Modifié par Artemus24 (09 May 2012 - 11:50)
Effectivement, on peut se poser la question ; il faudrait creuser pour en savoir plus.

Mais on peut raisonnablement espérer que les futurs navigateurs choisiront d'implémenter event.which étant donné que event.button est inutilisable.