Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Событие внутри функции или объекта (https://javascript.ru/forum/misc/39383-sobytie-vnutri-funkcii-ili-obekta.html)

shaltay 27.06.2013 17:35

Событие внутри функции или объекта
 
Доброго времени.
Не могу найти пример, как вызвать метод функции (объекта) из события внутри него. Если я неправильно делаю, поправьте меня плиз!

function obj(el) {

		this.block = el
		this.test = 'lalala'
		
		this.block.on('click',function(e){
			alert(this.test); // Проблемы вот тут!
		})
}
var el1 = new obj($('#el1'));
var el2 = new obj($('#el2'));

melky 27.06.2013 17:41

Цитата:

Сообщение от shaltay (Сообщение 258827)
Доброго времени.
Не могу найти пример, как вызвать метод функции (объекта) из события внутри него. Если я неправильно делаю, поправьте меня плиз!

function obj(el) {

		this.block = el
		this.test = 'lalala'
		
		this.block.on('click',function(e){
			alert(this.test); // Проблемы вот тут!
		})
}
var el1 = new obj($('#el1'));
var el2 = new obj($('#el2'));


не "объекта", а "в jQuery"

метод называется trigger



извиняюсь, мимо кассы.

решений несколько:
  1. запомнить контекст в замыкании. Запускаемый пример тут : http://jsbin.com/iyaqup/1
    function obj(el) {
    
    		this.block = el
    		this.test = 'lalala'
    
    		var self = this; // MAGIC!!!
    
    		this.block.on('click',function(e){
    			// alert(this.test); // Проблемы вот тут!
    			// Проблема решена. вместо this используем self.
    			alert(self.test);
    		})
    }
    var el1 = new obj($('#el1'));
    var el2 = new obj($('#el2'));
    

  2. запомнить контекст без создания замыкания (это лучше, чем с созданием замыкания). для этого передаём параметр data. Для переваривания обратитесь к документации метода on

    Запускаемый пример здесь : http://jsbin.com/abepop/1

    function obj(el) {
    
    		this.block = el
    		this.test = 'lalala'
    
    		this.block.on('click', this  /* <--- параметр data */, function(e){
    			// alert(this.test); // Проблемы вот тут!
    			// Проблема решена. вместо this используем Event.data
    			alert(e.data.test);
    		})
    }
    var el1 = new obj($('#el1'));
    var el2 = new obj($('#el2'));
    



shaltay 27.06.2013 18:05

О первом варианте я думал, но кажется как-то костыльно. Второй вариант понравился, работает, оставлю его.
Спасибо!


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