|
18.04.2009, 17:16
|
Интересующийся
|
|
Регистрация: 18.04.2009
Сообщений: 29
|
|
правильная передача ссылки на объект в классе
Я понимаю что this зависит от контекста
В функкции- классе есть несколько методов, некоторые используют дом-события, как правильно передавать ссылку на объект класса в котором эти методы реализованы, все путается this от событий, сами события, неужели везде замыкания делать, как-то неаккуратненько поллучается. Скажите, где почитать. Спасибо.
|
|
18.04.2009, 17:27
|
|
Рассеянный профессор
|
|
Регистрация: 06.04.2009
Сообщений: 2,379
|
|
Сообщение от belbek
|
передавать ссылку на объект класса
|
На экземпляр или на конструктор? Кто из них называется объектом класса?
И куда передавать? В обработчик события?
И пример кода если можно.
|
|
18.04.2009, 17:34
|
Интересующийся
|
|
Регистрация: 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] для оформления листингов кода в теле сообщения
|
|
18.04.2009, 17:44
|
Профессор
|
|
Регистрация: 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);
}
}
Напишите кроссбраузерную обертку для навешивания хэндлеров, которая будет принимать ноду, ссылку на метод и ссылку на контекст исполнения метода. Такая обертка здорово облегчит жизнь в вашем стиле проектирования.
|
|
18.04.2009, 17:45
|
|
Рассеянный профессор
|
|
Регистрация: 06.04.2009
Сообщений: 2,379
|
|
А откуда в Tree.prototype.clickHandler
obj взялся?
|
|
18.04.2009, 17:47
|
|
Рассеянный профессор
|
|
Регистрация: 06.04.2009
Сообщений: 2,379
|
|
Сообщение от hogart
|
Как-нибудь так:
|
Да не там норм все. В Tree.prototype.clickHandler идет работа с LI который там и есть.
|
|
18.04.2009, 17:48
|
|
Рассеянный профессор
|
|
Регистрация: 06.04.2009
Сообщений: 2,379
|
|
Вам наверно нужно чтобы в Tree.prototype.processXML на this была ссылка на var xhr = new XMLHttpRequest(); ?
upd: а не она там и так есть
Так куда, что не передается то?
Последний раз редактировалось Riim, 18.04.2009 в 17:52.
|
|
18.04.2009, 17:51
|
Интересующийся
|
|
Регистрация: 18.04.2009
Сообщений: 29
|
|
сорри obj там случайно затесался
Т.е. вопрос, в общем как получить ссылку на Tree(желательно однократно), и где разместить код получения этой ссылки?
|
|
18.04.2009, 18:01
|
|
Рассеянный профессор
|
|
Регистрация: 06.04.2009
Сообщений: 2,379
|
|
Сообщение от belbek
|
Т.е. вопрос, в общем как получить ссылку на Tree(желательно однократно), и где разместить код получения этой ссылки?
|
Т. е. в любом методе нужно получать ссылку на текущий экземпляр? Обычно эта ссылка висит на this. А у вас случилось так, что в Tree.prototype.clickHandler на this висит LI, а в Tree.prototype.processXML на this ссылка на XMLHttpRequest. И в обоих методах нет доступа к текущему экземпляру. Правильно я понял проблему? Если нет, то объясните подробней, а то гадать приходится.
|
|
18.04.2009, 18:05
|
Интересующийся
|
|
Регистрация: 18.04.2009
Сообщений: 29
|
|
да, совершенно верно
абсолютно точно
|
|
|
|