Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Доступ к объекту из callback-метода 
V
    Опции темы
Burrr
Дата 12.4.2007, 12:00 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 4.9.2005

Репутация: 10
Всего: 20



Чтобы понять суть задачи сразу покажу код:
Код
<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"?


--------------------
PM MAIL ICQ   Вверх
vasac
Дата 12.4.2007, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1060
Регистрация: 4.5.2006

Репутация: 13
Всего: 36



Код

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

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

Это сообщение отредактировал(а) vasac - 12.4.2007, 12:12
PM WWW   Вверх
butionok
Дата 12.4.2007, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 19.1.2005

Репутация: 1
Всего: 3



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);
}



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

Это сообщение отредактировал(а) butionok - 12.4.2007, 13:22
--------------------
Ненавижу убогую Оперу.
PM MAIL ICQ   Вверх
Burrr
Дата 12.4.2007, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 4.9.2005

Репутация: 10
Всего: 20



vasac, твой пример не работает и не совсем ясно что имеется в виду...

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


--------------------
PM MAIL ICQ   Вверх
vasac
Дата 12.4.2007, 13:53 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1060
Регистрация: 4.5.2006

Репутация: 13
Всего: 36



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

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

PM WWW   Вверх
Burrr
Дата 12.4.2007, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 4.9.2005

Репутация: 10
Всего: 20



vasac, спасибо! Заодно освежил свой знания по замыканиям. +1.

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


--------------------
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0414 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.