Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 31.03.2010, 12:07
Новичок на форуме
Отправить личное сообщение для Cisco Посмотреть профиль Найти все сообщения от Cisco
 
Регистрация: 31.03.2010
Сообщений: 2

Доступ к свойству класса в 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 ?

Последний раз редактировалось Cisco, 31.03.2010 в 12:11.
Ответить с цитированием
  #2 (permalink)  
Старый 31.03.2010, 12:17
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

http://javascript.ru/tutorial/object/thiskeyword
Ответить с цитированием
  #3 (permalink)  
Старый 31.03.2010, 12:44
Новичок на форуме
Отправить личное сообщение для Cisco Посмотреть профиль Найти все сообщения от Cisco
 
Регистрация: 31.03.2010
Сообщений: 2

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

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");
Ответить с цитированием
  #4 (permalink)  
Старый 31.03.2010, 12:55
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск