11548 sujets

JavaScript, DOM et API Web HTML5

Bonjour.

j'ai vu 2/3 poste a ce sujet sur le forum, mais je n'ai pas du saisir la subtilité de la chose..

Donc, a priori c'est un probleme d'heritage, en utilisant un AddEvent, je perd le this.
ex:



function montest(){ 	
	
	this.FireOnLoad.call(this)	
	this.FireOnResize.call(this)
	this.addEvent(window, "load", this.FireOnLoad,false)
	this.addEvent(window, "resize", this.FireOnResize,false)	
}

montest.prototype={	

	FireOnLoad:function(){	
		alert(this)
		//ici je recuepre bien le this	
	},
	
	FireOnResize:function(){
		alert(this)	// 
		// << ici je recupere window.
	},

	addEvent: function(element, eventType, doFunction, useCapture){		
		if (element.addEventListener) {		
			element.addEventListener(eventType, doFunction, useCapture);
			return true;			
		} else if (element.attachEvent) {		
			var r = element.attachEvent('on' + eventType, doFunction);
			return r;			
		} else {		
			element['on' + eventType] = doFunction;				
		}		
	}
	
		
}



le this.FireOnLoad.call(this) me permet bien e recuperer le this dans ma methode FireOnLoad()

mais par contre dans pas dans la methode FireOnResize()



est ce que quelqu'un a une idée?
Modifié par dvbxyz (09 Sep 2007 - 13:29)
Modérateur
Bonjour dvbxyz, Smiley smile

arf... Quand je dis qu'il ne faut pas coder avec des this... Smiley langue

Le meilleur moyen de te rendre compte de ce que représente le this est de le nommer explicitement...

... et, pour ton constructeur, il faut l'appeler avec new, ce qui a pour effet de recentrer le this sur l'objet.

Pour obtenir ce que tu cherches, tu peux réécrire cela comme ça :
function Montest() {};

Mp = Montest.prototype =
{
	initialize: function()
	{
		Mp.fireOnLoad();
		Mp.fireOnResize();
		Mp.addEvent(window, "load", Mp.fireOnLoad,false);
		
		return;
	},

	fireOnLoad: function()
	{	
		return alert(Mp);	
	},

	fireOnResize: function()
	{
		return alert(Mp);
	},

	addEvent: function(element, eventType, doFunction, useCapture)
	{
		return element.addEventListener ?
			element.addEventListener(eventType, doFunction, useCapture):			
			element.attachEvent ?
				element.attachEvent('on' + eventType, doFunction):
				element['on' + eventType] = doFunction;
	}
}

var Test = new Montest;
Test.initialize();

Modifié par koala64 (07 Sep 2007 - 19:43)
Un autre moyen serait d'utiliser une fonction spéciale qui permet d'indiquer le contexte d'objet, autrement dit quel this utiliser dans la fonction appelée.

Pour faire ça, il faut remplacer l'appel qui rate : objet.fonction(arguments)
Par : objet.fonction.apply(objet, arguments)

Le plus difficile est d'assurer le passage des arguments.... sinon ce serait facile.
Merci pour ces réponses.
koala64 ta methode ca marche niquel...
Modifié par dvbxyz (08 Sep 2007 - 16:34)
Modérateur
ok. Smiley smile

Ben, si tu considères le problème comme résolu, n'hésite pas à l'ajouter dans le titre de ton sujet ; ça peut servir à d'autres. Smiley cligne

-> Voir la règle 5 pour plus d'infos.