Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Доступ к объекту из callback-метода


Автор: Burrr 12.4.2007, 12:00
Чтобы понять суть задачи сразу покажу код:
Код
<div id="testId">Test</div>
<script type="text/javascript">
// ========== Constructor ============
function consObj(id) {
    this.id = id;
}
consObj.prototype.addHandlers = function() {
    var object = document.getElementById(this.id);
    if (object.addEventListener) object.addEventListener("click", this.saver, false);
    else if (object.attachEvent) object.attachEvent("onclick", this.saver);
}
consObj.prototype.saver = function() {
    alert("Working");
    alert(this.id);
}
// =========== New object ===========
var test = new consObj("testId");
test.addHandlers();
</script>

Всё работает правильно, и в результате клика на DIV последовательно появятся 2 alert-а:
"Working"
"undefined"
В callback-методе saver, как и ожидалось, this ведет на элемент, клик по которому обрабатывается. 
Внимание, вопрос!
Есть ли возможность получить выход из callback-метода к самому объекту и тем самым получить его id? Как нужно модернизировать этот код, чтобы вместо "undefined" выводилось "testId"?

Автор: vasac 12.4.2007, 12:12
Код

var _this = this;
object.addEventListener( "click", ( function(e) { return _this.saver; } ), false );

Вообще достаточно частый вопрос.

Автор: butionok 12.4.2007, 13:21
vasac, 

Я так понимаю это то, что называет "closures". Идея понятная, но в твоей реализации не работает. Проверил бы прежде чем постить.

Я не специалист по этим "кложурам" smile. Мне пришло в голову только разве что можно сформировать функцию обработчик с контекстом сразу в прицепщике событий:

Код

}
consObj.prototype.addHandlers = function() {
    var object = document.getElementById(this.id);
    var saver=new Function("alert('"+this.id+"')"); // вот тут мы сформировали тело функции
    if (object.addEventListener) object.addEventListener("click", saver, false);
    else if (object.attachEvent) object.attachEvent("onclick", saver);
}



И это работает. Думаю есть более элегантное решение. Обращайтесь к Сардару.

Автор: Burrr 12.4.2007, 13:41
vasac, твой пример не работает и не совсем ясно что имеется в виду...

butionok, метод saver должен быть именно в прототипе, так что твой пример - немного не то. Хотя интересный способ.
closure - это замыкания? Как то читал о них наблу Котерова, но уже не помню. В чем суть? По-моему как раз butionok и создает замыкание. Нет?

Автор: vasac 12.4.2007, 13:53
Ну, блин, скобки забыл, очевидно же. А вы уже - не работает.
Код

var _this = this;
object.addEventListener( "click", ( function(e) { return _this.saver(); } ), false );

Автор: Burrr 12.4.2007, 14:05
vasac, спасибо! Заодно освежил свой знания по замыканиям. +1.

butionok, также благодарю!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)