Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   [jQuery] [Обработка клика] Как не потерять текущий контекст внутри обработчика? (https://javascript.ru/forum/events/15035-%5Bjquery%5D-%5Bobrabotka-klika%5D-kak-ne-poteryat-tekushhijj-kontekst-vnutri-obrabotchika.html)

xintrea 10.02.2011 15:08

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


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

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

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

Код:

// Панель управления
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() ?

xintrea 10.02.2011 16:34

Все, решение найдено.

В вышеприведенном примере можно отказаться от встраиваемой функции, а сделать функцию-обработчик, например this.on_click_play().

Привязать ее можно так:

Код:

$("#lb_key_play").bind('click', {obj: this}, function(event){ event.data.obj.on_click_play()});
Из нее обычным образом вызываются и другие функции класса, например this.udate();.


Часовой пояс GMT +3, время: 10:12.