[JS] problem ze stosowaniem this

0

Witam,
pisząc skrypty natknąłem sie na denerwujący problem. Podam przykład:

w pliku js mam:
funkcję:
id(){}
obiekt:

A = function(){} //konstruktor
A.prototype.id='value'; //przykładowy string
A.prototype.funkcyjka = function(){alert(id);}
A.prototype.dodajEvent = function(){
  document.body.attachEvent('onclick', this.funkcyjka);
}

taki skład mamy i teraz na stronce html w <script></script> piszemy sobie:

var costam = new A();
costam.dodajEvent();

i tera sprawdzamy:
costam.funkcyjka(); wyświetli 'value'

a kliknięcie które wywoła akcje onclick wyświetli treść funkcji id :-/
czyli jak dobijam sie do zmienna.metoda() this rzutuje na zmienną
a przez eventa this rzutuje na podstawową płaszczyzne całego kodu.

Zeby poprawnie działało drugie sprawdzenie trzeba w funkcyjka napisać: alert(this.costam.id);
a taki zapis jest raczej bezsensem.

Proszę o pomoc.

0
function addEvent( obj, type, fn )
{
	if (obj.addEventListener)
		obj.addEventListener( type, fn, false );
	else if (obj.attachEvent)
	{
		obj["e"+type+fn] = fn;
		obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
		obj.attachEvent( "on"+type, obj[type+fn] );
	}
}

function removeEvent( obj, type, fn )
{
	if (obj.removeEventListener)
		obj.removeEventListener( type, fn, false );
	else if (obj.detachEvent)
	{
		obj.detachEvent( "on"+type, obj[type+fn] );
		obj[type+fn] = null;
		obj["e"+type+fn] = null;
	}
}
0

Oki, rozwiązanie cross-browser :-) , stosując te funkcje robie tak:

A.prototype.dodajEvent = function(){
  addEvent(document.body,'click', this.funkcyjka);
}

ale to i tak nic nie zmienia, nadal takie samo zachowanie.

0

nom, tylko że tym razem na własne życzenie, bo nie "document.body" tylko "this"

0

No nie wiem, to ma podpiąc własnie do document.body a nie do samego siebie, ma nasłuchiwać kliknięć na całej strone. Jak dam this to jest jest błąd, że brak metody, co jest oczywiste w tym wypadku.

0

no to masz nie logiczną strukturę
chcesz żeby this w zdarzeniu onclick elementu body wskazywało na twój typ A ? bez-sen-su !

0

Chodzi o to by this wskazywało zawsze na dynamicznie zadeklarowany obiekt, metoda obiektu poprzez this ma zawsze wskazywać na ten obiekt. Z tego co widze to tutaj this wskazuje na właściciela wywołującego funkcje... :-| a jak sie przekaże to zmienia sie właściciel i przez to this jest interpletowany nie tak

0

widzę że piszesz jednocześnie bardzo brudny kod, pod jedną przeglądarkę i jednocześnie używasz prototypów i starasz się pisać pseudo poprawnie
chciałem napisać jak to możesz zrobić, ale przyglądając się bardziej temu kodowi dochodzę do tego żebyś zrobił to po prostu
zrób nawet tak jak piszesz na początku - "bez sensu" bo i tak cały kod masz bez sensu i nie widzę żebyś więcej instancji swojego obiektu miał zamiar używać w kodzie także ci to nie zaszkodzi

pozdro poćwicz

0

Pisze skrótowo, po co pakować kod cross-browser. Pozostałem przy packagingu i jak widać to ma swoje konsekwecje. Teraz wpadł mi pomysł by zamiast przypinać metody obiektów do eventów document.body obudować to jakoś by zachodać poprawność this-a.

0

Po 1.: Funkcja A.prototype.funkcyjka powinna wyglądać tak

A.prototype.funkcyjka = function(){alert(this.id);}

Ponieważ zmienna id nie jest nigdzie zdefiniowana, oprócz tej klasy. Dlatego używa się this.

2: Funkcja A.prototype.dodajEvent

A.prototype.dodajEvent = function(){
  var self = this;
  addEvent(document.body,'click',
   function() {
    self.funkcyjka.apply(self);

   });
}

Dlaczego tak ? Ponieważ w Twojej wcześniejszej wersji obiekt this w funkcji "funkcyjka" wskazywał na document.body, a nie na obiekt A ;) Dlatego tutaj trzeba dokładnie określić ( za pomocą funcji apply ) co ma być obiektem this w tej funkcji.

Dodam jeszcze, że w tej funkcji obiekt this zachowuje się normalnie, czyli odnosi się do document.body. Natomiast obiekt self, to jest instancja Twojego obiektu A.

0

Działa! Dokładnie o to mi chodziło :-) Your the boss! [green]

0

tylko jeszcze pytanko... jak zrobić w takim razie usunEvent?

1 użytkowników online, w tym zalogowanych: 0, gości: 1