[jQuery] [Обработка клика] Как не потерять текущий контекст внутри обработчика?

xintrea

Новичок
Здравствуйте!


Есть у меня объект, называемый "Панель управления". На нем, для упрощения, одна кнопка. Нужно при клике на эту кнопку, выполнять некие действия и вызывать функции в контексте объекта "Панель управления".

Проблема в том, что обработчик клика, являясь встроенной функцией, имеет собственный контекст исполнения. И я не могу понять, как из обработчика достучаться до функций объекта "Панель управления".

Пример кода (в комментариях слово "класс" используется только для удобства понимания):

PHP:
// Панель управления
function ControlPanel() 
{
 // jQuery - элемент, к которому привязывается данный класс
 var control_panel_div;

 this.init = function(ipanel_div) 
 {
  // Запоминается элемент, к которому прикреплен экземляр класса
  control_panel_div=ipanel_div;

  // Создание области с кнопкой PLAY
  var key_play_tag='<div id="lb_key_play"><img src="pic/key_play.png"/></div>';
  
  // Кнопка добавляется
  control_panel_div.append(key_play_tag);


  // Обработчик кнопки PLAY
  $("#lb_key_play").click( 
   function() 
    {
     $("#lb_key_play").fadeOut(20);
     $("#lb_key_play").fadeIn(20);

     // Тут какие-то действия
     // Проблема в том, что контекст текущего класса теряется
     // И невозможно вызвать методы текущего класса, например, this.update()
    } 
  );
 } 

 this.update = function() 
 {
  ...
 } 
}

Вопрос по приведенному коду: как из обработчика кнопки PLAY вызвать this.update() ?
 

Adelf

Administrator
Команда форума
Методов полно(что для js - нормально).

Вариант 1(простой)
PHP:
function ControlPanel() 
{
 // jQuery - элемент, к которому привязывается данный класс
 var _this = this;

и использовать _this.
Вариант 2(типа более правильный):
PHP:
$("#lb_key_play").bind('click',{obj: this}, function(event){ event.data.obj.update()})
есть еще вариант 3.. но лень писать
 

Adelf

Administrator
Команда форума
Не так выразился. "Лень искать" :)
На DevConf::RichClient Иехуда Кац показывал магию с биндингом eventHandler. Мне показалось, что там можно заставить jQuery выполнять обработчик в контексте указанного объекта(в ExtJS - очень часто используется). Но чего-то в мануале jQuery я этого не нашел. Кац - шаман :)
 

craz

Нестандартное звание
Не так выразился. "Лень искать" :)
На DevConf::RichClient Иехуда Кац показывал магию с биндингом eventHandler. Мне показалось, что там можно заставить jQuery выполнять обработчик в контексте указанного объекта(в ExtJS - очень часто используется). Но чего-то в мануале jQuery я этого не нашел. Кац - шаман :)
вот первый раз ты мягче выразился) а теперь мне очень стало интересно что там за шаманство такое)
 

Adelf

Administrator
Команда форума
Вот я а...
Вчера смотрел сорцы. облазил bind и то что он там дальше вызывает. Встречал там proxy и не догадался глянуть его :)
 
Сверху