23.05.2014, 18:06
|
Аспирант
|
|
Регистрация: 12.07.2012
Сообщений: 81
|
|
ООП javascript
Здравствуйте.
var Modal = function(){};
Modal.prototype.block = function(obj, content, time){
var obj = $(obj);
obj.after(content);
var s = obj.next('div');
time = (time == undefined) ? 4000 : time;
for(var i = 0; i < s.length; i++){
$(s[i]).delay(time).fadeOut(500);
setTimeout(function(){
$(s).remove();
},time + 500);
}
};
var Events = function(){
this.modal = new Modal();
};
Events.prototype.addBasket = function(){
$('.basket_bottom').on('click', function(){
this.modal.block(this, '<div class="modal add_basket border_f99100 borderRadius_5">Товар добавлен <a href="/Basket">в корзину</a></div>');
});
};
$(document).ready(function(){
var e = new Events();
e.addBasket();
});
Ошибка: Uncaught TypeError: Cannot read property 'block' of undefined
Направьте, пожалуйста, на путь истинный.
Последний раз редактировалось niko42, 23.05.2014 в 18:13.
|
|
23.05.2014, 18:16
|
|
Профессор
|
|
Регистрация: 11.12.2013
Сообщений: 313
|
|
this у тебя указывает на $('.basket_bottom')
http://jsfiddle.net/hML4P/
Последний раз редактировалось nice_try, 23.05.2014 в 18:19.
|
|
23.05.2014, 18:17
|
Аспирант
|
|
Регистрация: 12.07.2012
Сообщений: 81
|
|
Сообщение от nice_try
|
this у тебя указывает на $('.basket_bottom')
|
Ясно, спасибо. А как обойти без создание var tmp ?
ТОбишь не писать такое:
Events.prototype.addBasket = function(){
var tmp = this.modal;
$('.basket_bottom').on('click', function(){
tmp.block(this, '<div class="modal add_basket border_f99100 borderRadius_5">Товар добавлен <a href="/Basket">в корзину</a></div>');
});
};
|
|
23.05.2014, 18:22
|
|
Быдлокодер;)
|
|
Регистрация: 19.11.2010
Сообщений: 4,338
|
|
Events.prototype.addBasket = function(){
$('.basket_bottom').on('click', function () {
this.modal.block(this, '<div class="modal add_basket border_f99100 borderRadius_5">Товар добавлен <a href="/Basket">в корзину</a></div>');
}.bind(this)); // тут вся соль
};
В ECMAScript6 можно сделать так:
Events.prototype.addBasket = function(){
$('.basket_bottom').on('click', () => {
this.modal.block(this, '<div class="modal add_basket border_f99100 borderRadius_5">Товар добавлен <a href="/Basket">в корзину</a></div>');
});
};
Последний раз редактировалось kobezzza, 23.05.2014 в 18:25.
|
|
23.05.2014, 18:32
|
Аспирант
|
|
Регистрация: 12.07.2012
Сообщений: 81
|
|
Сообщение от kobezzza
|
Events.prototype.addBasket = function(){
$('.basket_bottom').on('click', function () {
this.modal.block(this, '<div class="modal add_basket border_f99100 borderRadius_5">Товар добавлен <a href="/Basket">в корзину</a></div>');
}.bind(this)); // тут вся соль
};
|
Uncaught TypeError: Cannot read property 'createDocumentFragment' of undefined
Сообщение от kobezzza
|
Events.prototype.addBasket = function(){
$('.basket_bottom').on('click', () => {
this.modal.block(this, '<div class="modal add_basket border_f99100 borderRadius_5">Товар добавлен <a href="/Basket">в корзину</a></div>');
});
};
|
Uncaught SyntaxError: Unexpected token )
|
|
23.05.2014, 18:41
|
Аспирант
|
|
Регистрация: 12.07.2012
Сообщений: 81
|
|
kobezzza,
Честно говоря -
bind(this)); // тут вся соль
не понял.
Можете пояснить почему ?
|
|
23.05.2014, 18:46
|
|
Быдлокодер;)
|
|
Регистрация: 19.11.2010
Сообщений: 4,338
|
|
niko42,
Не заметил, что тебе нужен родной this от узла
block(this
тогда только через переменную замыкания
var tmp = this.modal;
.
***
Второй пример я привёл из будущего стандарта JS, он пока плохо поддерживается браузерами.
***
Что такое функция bind и как устроен this в JS в интернете over9000 статей.
|
|
23.05.2014, 19:00
|
|
|
Регистрация: 10.07.2008
Сообщений: 3,873
|
|
Сообщение от kobezzza
|
bind
|
Кстати, почему jQuery не поддерживает handleEvent…
Мне больше нравится вариант:
var obj = {
method: {
element.addEventListener('click', {
boundObj: this,
handleEvent: function () {
this.boundObj //→ obj
}
});
}
};
чем через bind. Во первых не создается лишняя функция, во вторых свойства объекта никак не влияют на аргументы функции.
|
|
23.05.2014, 19:19
|
|
Быдлокодер;)
|
|
Регистрация: 19.11.2010
Сообщений: 4,338
|
|
тьфу ты, забыл, что handleEvent принимает объект события, походу переработал сёня
Events.prototype.addBasket = function(){
$('.basket_bottom').on('click', function (e) {
this.modal.block(e.target, '<div class="modal add_basket border_f99100 borderRadius_5">Товар добавлен <a href="/Basket">в корзину</a></div>');
}.bind(this));
};
Последний раз редактировалось kobezzza, 23.05.2014 в 19:33.
|
|
|
|