2009-11-05 6 views
0

Я хочу, чтобы закрыть свое окно (только DIV с позицией абсолютной, который перетаскиваемый), когда я нажимаю на тесной связиООП в JavaScript с обратными вызовами

Это мой код

function ApplicationWindow() { 
    this.window = $('<div class="window"></div>'); 

    this.create = function create() { 
     //..... 
     var closeButton = this.window.find('.close'); 
     closeButton.live('click', this.close); 
    } 

    this.close = function close() { 
     this.window.fadeOut(200); 
    }; 
} 

Когда я нажимаю на кнопке закрытия функция закрытия выполняется, но проблема в том, что я получаю сообщение об ошибке «this.window undefined». Это потому, что функция close передается как обратный вызов, я думаю, но мой вопрос заключается в том, как я могу решить это с хорошим способом?

ответ

0

как это;

function ApplicationWindow() { 
    this.window = $('<div class="window"></div>'); 

    this.create = function create() { 
     //..... 
     var closeButton = this.window.find('.close'); 
     var self = this; 
     closeButton.live('click', function() { 
      self.window.fadeOut(200); 
     }); 
    } 
} 
1

Не использовать this. В JS зарезервированное слово this изменяется в зависимости от контекста, поэтому вы хотите избежать его в этом случае.

Используя простую переменную в рамки должны решить эту проблему:

function ApplicationWindow() { 
    var theWindow = $('<div class="window"></div>'); 

    this.create = function create() { 
     //..... 
     var closeButton = theWindow.find('.close'); 
     closeButton.live('click', this.close); 
    } 

    this.close = function close() { 
     theWindow.fadeOut(200); 
    }; 
} 
+0

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

+0

@Yuval: это не глобально, это только в рамках функции ApplicationWindow ... – Seb

+0

@Yuval: если вы объявляете переменные с помощью 'var', вы устанавливаете область действия только на текущую функцию. Если вы этого не сделаете, тогда да, вместо этого используется глобальная область. – Seb

0

Что библиотеки вы используете? Вы должны быть в состоянии связать функцию к объекту:

this.close = function close() { 
    this.window.fadeOut(200); 
}.bind(this); 
+0

Библиотека, которую я использую, - jQuery – Derk

0

См this answer для объяснения любопытных this -связывающей функции в JavaScript и как работать вокруг него с помощью явного закрытия или function.bind.