правильная передача ссылки на объект в классе
Я понимаю что this зависит от контекста
В функкции- классе есть несколько методов, некоторые используют дом-события, как правильно передавать ссылку на объект класса в котором эти методы реализованы, все путается this от событий, сами события, неужели везде замыкания делать, как-то неаккуратненько поллучается. Скажите, где почитать. Спасибо. |
Цитата:
И куда передавать? В обработчик события? И пример кода если можно. |
вот весь код
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); } |
Как-нибудь так:
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); } } Напишите кроссбраузерную обертку для навешивания хэндлеров, которая будет принимать ноду, ссылку на метод и ссылку на контекст исполнения метода. Такая обертка здорово облегчит жизнь в вашем стиле проектирования. |
А откуда в Tree.prototype.clickHandler
obj взялся? |
Цитата:
|
Вам наверно нужно чтобы в Tree.prototype.processXML на this была ссылка на var xhr = new XMLHttpRequest(); ?
upd: а не она там и так есть Так куда, что не передается то? |
сорри obj там случайно затесался
Т.е. вопрос, в общем как получить ссылку на Tree(желательно однократно), и где разместить код получения этой ссылки?
|
Цитата:
|
да, совершенно верно
абсолютно точно
|
Часовой пояс GMT +3, время: 14:22. |