11548 sujets

JavaScript, DOM et API Web HTML5

Bonjour à tous !

Après avoir consulté les deux tutoriaux suivants ainsi que quelques pages sur le Web, je me permet de me tourner vers vous :
La-gestion-des-evenements-en-JavaScript
JavaScript-organiser-son-code-en-modules

Voici mon code JS qui permet de gérer mes événements.

var elt = getElement('eventTable');
if(elt.addEventListener)
{
	elt.addEventListener('mousemove', mousemove_event, false);
	elt.addEventListener('mousedown', startSelection, false);
	elt.addEventListener('mouseup', endSelection, false);
}
else if(elt.attachEvent)
{
	elt.attachEvent('onmousemove', mousemove_event);
	elt.attachEvent('onmousedown', startSelection);
	elt.attachEvent('onmouseup', endSelection);
}


Je souhaiterais utiliser l'événement "ondblclick"... mais cet événement rentre, bien entendu, en conflit avec l'événement "onmousedown".

Visiblement il faudrait, lorsqu'un double clic est effectué, que je puisse détacher le gestionnaire d'événement "onmousedown" grâce à removeEventListener et detachEvent (pour IE).

Mon problème est que je ne sais pas comment implémenter ceci... Arf !

En espérant avoir été clair, je vous remercie d'avance pour votre aide !
Modifié par Alphonse (30 Oct 2007 - 14:14)
Salut Alphonse,

d'après mes connaissances, pour qu'un événement dbclick soit capté, il faut passer par : mousedown, mouseup, click, mousedown, mouseup, click, dbclick. Et, toujours d'après mes connaissances, l'événement dbclick est forcément déclenché en fin de chaine, si, bien sur, le temps entre chaque click entre dans la configuration de ton OS...

Donc, encore une fois d'après mes connaissances, un dbclick sera toujours précédé de deux mousedown. Maintenant je ne suis pas sur que ça t'aide Smiley rolleyes
a écrit :
d'après mes connaissances, un dbclick sera toujours précédé de deux mousedown


C'est ce que je pense aussi, c'est pour cela qu'il faut que je détache ce gestionnaire d'événement. Je pense avoir trouvé comment faire et implémenter ceci. J'essayerai dès que j'en aurai l'occasion et je vous tiendrai au courant !
Encore moi,

Bon, j'ai fait ceci :


var elt = getElement('eventTable');
addEvent(elt, 'mousedown', test_1, false);
addEvent(elt, 'mouseup', test_2, false);
addEvent(elt, 'dblclick', test_4, false);

function test_1() {
	setTimeout('alert(1)', 5000);
}

function test_2() {
	setTimeout('alert(2)', 5000);
}

function test_4() {
	var elt = getElement('eventTable');
	removeEvent(elt, 'mousedown', test_1);
	removeEvent(elt, 'mouseup', test_2);

	alert(4);

	addEvent(elt, 'mousedown', test_1, false);
	addEvent(elt, 'mouseup', test_2, false);
}

function addEvent(obj, eventType, functionToCall, useCaption) {
	if(obj.addEventListener)
		obj.addEventListener(eventType, functionToCall, useCaption);
	else if(obj.attachEvent)
		obj.attachEvent('on'+eventType, functionToCall);
}

function removeEvent(obj, eventType, functionToCall) {
	if(obj.removeEventListener)
		obj.removeEventListener(eventType, functionToCall, false);
	else if(obj.detachEvent)
		obj.detachEvent('on'+eventType, functionToCall);
}


Ce qui est curieux, c'est lorsque je fait le double click, il est censé retiré le gestionnaire d'événement (voir fonction test_4();) du mousedown et du mouseup mais sans succès.

Après alert(4); dans la fonction test_4(); j'ai remis le addEvent() sur le mousedown et le mouseup car j'ai l'impression (et j'en suis sûr) que le removeEvent() supprime l'écoute de ces deux événements jusqu'à ce que la page (et du coup le fichier JS) soit rechargée. Donc, on est obligé de faire comme ceci si on ne veut pas recharger obligatoirement la page.

Bref, comme je l'ai dit plus haut, je suis un peu perdu sur la manière d'implémenter ceci...
Comme ça je dirai que c'est parce que les timer sont déclenchés. Les alert restent donc dans le pipe malgré le removeEventListener qui je suis persuadé, lui, fonctionne.
Ze Nenex a écrit :
Comme ça je dirai que c'est parce que les timer sont déclenchés. Les alert restent donc dans le pipe malgré le removeEventListener qui je suis persuadé, lui, fonctionne.


C'est fort bien possible, je te remercie de cette précision à laquelle je n'avais pas pensé ! Smiley cligne