Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Доступ к свойству класса в event handler'e DOM-елемента (https://javascript.ru/forum/events/8528-dostup-k-svojjstvu-klassa-v-event-handler%27e-dom-elementa.html)

Cisco 31.03.2010 12:07

Доступ к свойству класса в event handler'e DOM-елемента
 
Добрый день. Нетривиальная задача:
<div id="div-test">
	Click me
</div>

пример 1:
function Test(id)
{	
	this._var = 5;
	
	$(id).click(this.onclick); // вешаем обработчик с помощью jquery
}

Test.prototype.onclick = function()
{	
	alert(this._var); // 'undefined'
}

var t = new Test("#div-test");


Само собой, при клике на div'е я получаю 'undefined' ибо this в контексте вызова ссылается на DOM елемент.

Этот пример 2:
function Test(id)
{	
	this._var = 5;
	
	var _var = this._var;
	
	var onclick = function()
	{		
		alert(_var); // 5
	}
	
	$(id).click(onclick);
}

var t = new Test("#div-test");
...
var t2 = new Test("#some-id");

плох тем, что при создании нового t2 объекта мы получим еще одну копию var onclick обработчика. Я прав?

Есть ли возможность оставить описание обработчика прототипом и "достучаться" до this._var ?

Kolyaj 31.03.2010 12:17

http://javascript.ru/tutorial/object/thiskeyword

Cisco 31.03.2010 12:44

Как часто у меня бывает, после постинга проблемы чуток подумал и нашел решение :):

function Test(id)
{	
	this._var = 5;
	
	var obj = this;
	
	$(id).click(
		function() {
			Test.prototype.onclick.call(obj /* экземпляр Test */, this /* нажатый элемент*/ );
		}
	);
}

Test.prototype.onclick = function(el)
{	
	alert(el); // нажатый элемент
	alert(this._var);  // 5
}

var t = new Test("#div-test");

Kolyaj 31.03.2010 12:55

Цитата:

Сообщение от Cisco
Test.prototype.onclick.call(obj /* экземпляр Test */, this /* нажатый элемент*/ );

obj.onclick(this);


Часовой пояс GMT +3, время: 15:19.