Javascript.RU

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

правильная передача ссылки на объект в классе
Я понимаю что this зависит от контекста
В функкции- классе есть несколько методов, некоторые используют дом-события, как правильно передавать ссылку на объект класса в котором эти методы реализованы, все путается this от событий, сами события, неужели везде замыкания делать, как-то неаккуратненько поллучается. Скажите, где почитать. Спасибо.
Ответить с цитированием
  #2 (permalink)  
Старый 18.04.2009, 17:27
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от belbek
передавать ссылку на объект класса
На экземпляр или на конструктор? Кто из них называется объектом класса?

И куда передавать? В обработчик события?

И пример кода если можно.
Ответить с цитированием
  #3 (permalink)  
Старый 18.04.2009, 17:34
Интересующийся
Отправить личное сообщение для belbek Посмотреть профиль Найти все сообщения от belbek
 
Регистрация: 18.04.2009
Сообщений: 29

вот весь код
function Tree(id)
{
	this.prepare(id);
	
}
Tree.prototype.prepare = function(id)
{
	var container = document.getElementById(id);
	var initLength = container.getElementsByTagName("li").length;
	for (var i = 0; i < initLength; i++) 
     document.getElementById(id).getElementsByTagName("li")[i].addEventListener("click", this.clickHandler, false);
	
}

Tree.prototype.clickHandler = function()
{
	
		if (this.getElementsByTagName("ul").length) 
		{
			this.removeChild(this.getElementsByTagName("ul")[0]);
		}
		else 
		{
			var clickedId = this.getAttribute("id");
			var xhr = new XMLHttpRequest();
			var url = "/base/loadTree?id="+clickedId;
			xhr.onreadystatechange = obj.processXML;
			xhr.open("get", url, true);
			xhr.send(null);
		}	
}
		
		
Tree.prototype.processXML = function()
{
				
				if (this.readyState != 4 || this.status != 200) return;
				var xml = this.responseXML;
				var length = xml.getElementsByTagName("item").length;
				var ul = document.createElement("ul");
				for (var i = 0; i < length; i++) 
				{
					var li = document.createElement("li");
					li.setAttribute("id", xml.getElementsByTagName("id")[i].firstChild.nodeValue);
					li.innerHTML = xml.getElementsByTagName('name')[i].firstChild.data;
					ul.appendChild(li);
					
				}
				document.getElementById(clickedId).appendChild(ul);
			
			
}

Последний раз редактировалось Андрей Параничев, 18.04.2009 в 17:40. Причина: Пользуйтесь bb-тегами [js] и [html] для оформления листингов кода в теле сообщения
Ответить с цитированием
  #4 (permalink)  
Старый 18.04.2009, 17:44
Профессор
Отправить личное сообщение для hogart Посмотреть профиль Найти все сообщения от hogart
 
Регистрация: 18.04.2008
Сообщений: 152

Как-нибудь так:
Tree.prototype.prepare = function(id) {
	var t = this;
	var container = document.getElementById(id);
	var initLength = container.getElementsByTagName("li").length;
	for (var i = 0; i < initLength; i++) {
		document.getElementById(id).getElementsByTagName(" li")[i].addEventListener("click", function (evt) { t.clickHandler.apply(t, [t]), false);
	}
}


Напишите кроссбраузерную обертку для навешивания хэндлеров, которая будет принимать ноду, ссылку на метод и ссылку на контекст исполнения метода. Такая обертка здорово облегчит жизнь в вашем стиле проектирования.
Ответить с цитированием
  #5 (permalink)  
Старый 18.04.2009, 17:45
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

А откуда в Tree.prototype.clickHandler
obj взялся?
Ответить с цитированием
  #6 (permalink)  
Старый 18.04.2009, 17:47
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от hogart
Как-нибудь так:
Да не там норм все. В Tree.prototype.clickHandler идет работа с LI который там и есть.
Ответить с цитированием
  #7 (permalink)  
Старый 18.04.2009, 17:48
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Вам наверно нужно чтобы в Tree.prototype.processXML на this была ссылка на var xhr = new XMLHttpRequest(); ?
upd: а не она там и так есть
Так куда, что не передается то?

Последний раз редактировалось Riim, 18.04.2009 в 17:52.
Ответить с цитированием
  #8 (permalink)  
Старый 18.04.2009, 17:51
Интересующийся
Отправить личное сообщение для belbek Посмотреть профиль Найти все сообщения от belbek
 
Регистрация: 18.04.2009
Сообщений: 29

сорри obj там случайно затесался
Т.е. вопрос, в общем как получить ссылку на Tree(желательно однократно), и где разместить код получения этой ссылки?
Ответить с цитированием
  #9 (permalink)  
Старый 18.04.2009, 18:01
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от belbek
Т.е. вопрос, в общем как получить ссылку на Tree(желательно однократно), и где разместить код получения этой ссылки?
Т. е. в любом методе нужно получать ссылку на текущий экземпляр? Обычно эта ссылка висит на this. А у вас случилось так, что в Tree.prototype.clickHandler на this висит LI, а в Tree.prototype.processXML на this ссылка на XMLHttpRequest. И в обоих методах нет доступа к текущему экземпляру. Правильно я понял проблему? Если нет, то объясните подробней, а то гадать приходится.
Ответить с цитированием
  #10 (permalink)  
Старый 18.04.2009, 18:05
Интересующийся
Отправить личное сообщение для belbek Посмотреть профиль Найти все сообщения от belbek
 
Регистрация: 18.04.2009
Сообщений: 29

да, совершенно верно
абсолютно точно
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получение ссылки на объект из метода Octane Общие вопросы Javascript 7 21.08.2008 15:09