11548 sujets

JavaScript, DOM et API Web HTML5

Salut !

Avec IE7, la fonction cloneNode duplique également les évènements posés dynamiquement (via attachEvent, donc) sur l'élément source.

Est-ce qu'il est possible de le forcer a ignorer ces évènements ?
Salut,

J'en doute, par contre, tu dois pouvoir supprimer les évenement à la volée.
Autre chose, je te suggère d'utiliser addEvent de quirksmode
Difficile de les supprimer, les fonctions attachées aux évènements sont générées dynamiquement donc, de se fait, anonyme Smiley ohwell

Je gères moi-même la compatibilité. Au niveau du code, je définies moi-même addEventListener si cette fonction n'existent pas. Ainsi, le jour où IE gèrera addEventListener, il n'y aura strictement rien à modifier.
Ca permet en prime de garder une programmation objet plus propre.
Gatsu35 a écrit :
Accessoirement il y a des choses qui sont très bien gérées

http://www.quirksmode.org/blog/archives/2005/10/_and_the_winner_1.html

Bof... Même l'auteur de ces fonctions, John Resig, déconseille de les utiliser :
a écrit :
I don't really recommend that anyone actually try and use that function.

Pour la question d'origine, je ne crois pas que tu puisses supprimer les gestionnaires d'événements si tu n'as plus de références vers les fonctions.
Modifié par Julien Royer (12 Jul 2007 - 14:29)
Modérateur
lu',

Concernant la fonction addEvent de Quirksmode, tout dépend de ce qu'on cherche ; on peut parfaitement s'en passer sans qu'on ait à considérer cela comme moins propre...

Pour cloneNode, il n'y a pas 36000 solutions... Soit on lance la méthode avant d'affecter un gestionnaire sur l'élément à cloner, soit on désactive le gestionnaire.

MacIntoc a écrit :
Difficile de les supprimer, les fonctions attachées aux évènements sont générées dynamiquement donc, de se fait, anonyme Smiley ohwell
Je ne saisis pas ce que tu veux dire... Smiley sweatdrop On peut très bien faire une référence vers une fonction nommée...

exemple:
var oO =
{
	'message': 'coucou',

	connect: function(oElem, sEvType, fn, bCapture)
	{
		return document.addEventListener ?
			oElem.addEventListener(sEvType, fn, bCapture):
			oElem.attachEvent ?
				oElem.attachEvent('on' + sEvType, fn):
				false;
	},

	init: function()
	{
		return oO.connect(window, 'load', oO.show, false);
	},

	show: function()
	{
		return oO.alerte(oO['message']);
	},

	alerte: function(msg)
	{
		return alert(msg);
	}
};

oO.connect(window, 'load', oO.init, false);
Je n'ai aucune fonction anonyme là-dedans...
Modifié par koala64 (12 Jul 2007 - 15:28)
Julien Royer>C'est bien ce qu'il me semble aussi Smiley decu

koala64>C'est justement un évènement posé sur l'élément à cloner qui déclenche son clonage. Donc difficile de cloner l'élément avant de poser l'évènement si je pose pas l'évènement qui lance son clonage Smiley lol

Concernant la génération des fonctions, j'utilise plutôt un truc du genre :

var f1=function(element){
    ...
    ...
    ...
}

var f2=function(element){
    ...
    ...
    ...
}

var setEvent=function(evt, fonction){
    this.attachEvent(evt, function(){fonction(event.srcElement.parentNode.parentNode)});
}

var setmode=function(condition){
    if(!element.setEvent) element.setEvent=setEvent;
    element.setEvent(evt, condition?f1:f2);
}

Modifié par MacIntoc (12 Jul 2007 - 16:07)
Modérateur
Raison de plus pour nommer explicitement le gestionnaire de manière à pouvoir le désactiver sur le clone. (via removeEventListener et detachEvent)

Par exemple, tu remplaces :
this.attachEvent(evt, function(){fonction(event.srcElement.parentNode.parentNode)});

par :
this.attachEvent(evt, affecte);

var affecte = function()
{
     return fonction(event.srcElement.parentNode.parentNode);
};
En fait, il y a une coquille avec cette solution.

C'est dans f1 et f2 que le clonage, et donc la suppression de l'évènement, intervient.
Si je définis affecte à l'extérieur de setEvent, f1 et f2 perdent la valeur de la variable fonction définie dans setEvent puisque la variable fonction est détruite a la fin de l'exécution de setEvent.
Si je définis affecte a l'intèrieur de setEvent, IE perd this lors de l'exécution de f1 ou f2 puisque affecte est détruit à la fin de l'exécution de setEvent.

En revanche, en stockant les fonctions attaché à l'évènement dans l'objet DOM représentant la balise, je pourrais tout récupérer à tous moments. Ce qui m'embêtes, c'est que je trouves pas ça super propre. J'essaierais demain pour vérifier que ça fonctionne bien.