2015-01-13 3 views
2

Я пытаюсь создать объект и добавить соответствующий элемент DOM, к которому я хотел бы привязать событие, которое запускает функцию. Мой вопрос: возможно ли получить доступ к начальным значениям объекта внутри этой связанной функции?Доступ к объекту объекта в связанной функции

function Bloc() { 

    this.DOMel; 
    this.ID = Math.round(Math.random() * 1000); 
    this.startPosX; 


    this.init = function() { 
     $('#blocs-container').append('<div class="bloc" data-id="' + this.ID + '"></div>'); 

     this.DOMel = $('.bloc[data-id="' + this.ID + '"]'); 

     this.DOMel.bind('touchstart', function(e) { 
      this.startPosX = e.originalEvent.touches[0].pageX; 
     }); 
    } 

} 

Вот, например, я хотел бы получить доступ и изменить this.startPosX внутри функции, связанной с событием touchstart.

Возможно ли это? Если нет, как мне его обойти?

Спасибо!

+0

Возможный дубликат [Как работает \ 'this \' Keyword?] (Http://stackoverflow.com/questions/3127429/how-does-the-this-keyword-work) – Jamiec

+0

Я думаю, что вы лучше хранить координату 'x' как данные для элемента, а затем использовать элемент для его извлечения позже, вместо использования переменных в более высокой области. – adeneo

ответ

3

Вы могли бы использовать это:

function Bloc() { 
    var self = this; 

    self.startPosX; 

} 

, а затем внутри функции называют его self.startPosX.

Почему это работает?

В переменной self вы храните экземпляр функции Bloc. Когда вы получаете анонимную функцию, которую вы назначаете this.init, изменения контекста и this указывают на экземпляр этой функции. Следовательно, у вас нет доступа к переменным, сохраненным во внешнем контексте, с использованием этого. Однако, используя вышеупомянутый трюк, вы можете использовать self для доступа к контексту, в котором существует startPosX.

+0

Спасибо! И ваше решение, и работа Ракса, но ваше объяснение было приветствоваться! –

+0

@StephanieD. пожалуйста. Я рад, что помог. – Christos

1

Вы потеряли контекст. Попробуйте это:

this.DOMel.bind('touchstart', function(e) { 
    this.startPosX = e.originalEvent.touches[0].pageX; 
}.bind(this)); 
0

Я получил его также, работая, как только я изменил this.startPosX на var startPosX, и, я думаю, Христос объяснил, почему он работает. Кроме того, я был не в состоянии получить touchstart событие, чтобы работать, пока я не изменил строку ниже:

this.DOMel.bind('touchstart', function(e) { 

в

$('.block[data-id="blocks"]').bind('touchstart', function(e) { 

Обратите внимание, селектор немного другое, потому что я создал несколько дивы для в целях тестирования. Fiddle работает, когда мобильный эмулятор используется для события touchstart.

Смежные вопросы