Вход

Просмотр полной версии : Получить this


sash003
07.07.2015, 22:26
Привет, ребята, чтото долго меня не было :)
Пилю лайбрари (джейкверя отдыхает)
Как вычислить this, чтобы можно было применять к нему методы?
// установка обработчиков
_init_.prototype.on = function(event, func, param){
for(var i = 0; i < this.s.length; i++){
addEvent(this.s[i], event, func, param);
}
}


_A_('a').on('click', function(){
console.log(this);
_A_(this).html('111'); // чтобы так можно было делать
});


функцию AddEvent даже показывать не буду, всё работает :yes:

рони
07.07.2015, 22:57
sash003,
вы определитесь где будем менять в 4 строке или в AddEvent ?:)

sash003
07.07.2015, 23:15
Где скажешь :) Вот она, кроссбраузерная по результатам школьного опроса
function addEvent(elem, type, handler, param){
param = param || false;
if(elem.addEventListener){
elem.addEventListener(type, handler, param);
} else {
elem.attachEvent('on'+type, handler);
}
return false;
}
Нравится мне яваскрипт всё больше и больше :)

рони
07.07.2015, 23:27
sash003,
непонял и какой this ты потерял?

sash003
07.07.2015, 23:31
Как вычислить this, чтобы можно было применять к нему методы?
_A_(this).html('111'); // чтобы так можно было делать
Сейчас консоля пишет Uncaught SyntaxError: Failed to execute 'querySelectorAll' on 'Document': The provided selector is empty.

рони
07.07.2015, 23:39
sash003,
может у тебя только строка для инициализации а обьекта не предусмотрено?

Aetae
08.07.2015, 03:21
sash003, сейчас this и так должен работать, ошибка где-то в другом месте, вестимо там где у тебя используется querySelectorAll. Ставлю на то, что у тябя нет проверки на тип аргумента и this идёт напрямую в querySelectorAll.

KosBeg
08.07.2015, 11:54
в зависимости от того что находится в this,
месяц назад я тоже велосипедил, и переписал немного свой код(урывок) "под вас" :lol:
надеюсь вы розберетесь в моем говнокоде :yes:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>

<a href="http://vk.com">1</a>
<a href="http://vk.com">2</a>
<a href="http://vk.com">3</a>
<a href="http://vk.com">4</a>

<script type="text/javascript">
(function() {
var Helper = function(elem) {
return new Helper.fn.init(elem);
};

Helper.fn = {
init: function(elem) {
elem = document.querySelectorAll(elem);
this[0] = elem;
return this;
},

on: function(event, func, param) {
for(var i = 0; i < this[0].length; i++){
addEvent(this[0][i], event, func, param);
}
}
};

//addEvent минифицировал что бы не маячило перед глазамы
function addEvent(a,b,c,d){a.addEventListener?a.addEventLis tener(b,c,d||!1):a.attachEvent("on"+b,c);return!1};

Helper.fn.init.prototype = Helper.fn;
window.Helper = window.$$ = Helper;
})();

Helper('a').on('click', function(event){
console.log(this);
event.preventDefault();
});
</script>

</body>
</html>

UPD: все работает как ожидалось - переход на vk. com не происходит и в консоли логирует ссылку по которой кликнули http://i.imgur.com/MTOdp3p.png
Все же чувствую зря я тогда на github не выложил свой говнокод.... месяц коту под хвост...
Зато есть практика :D

рони
08.07.2015, 12:12
KosBeg,
не решает проблему, elem как и у sash003, только строка а инициализировать надо строку, елемент или nodeList

KosBeg
08.07.2015, 12:26
elem как и у sash003
тоесть вместо моего
elem = document.querySelectorAll(elem);
this[0] = elem;
return this;
у sash003?
elem = document.querySelectorAll(elem);
this.s = elem;
return this;
Ты/Вы уверен/ы?
Мне кажется проблема в том что "главный" метод - _init_ , возвращает "неправильный" this , а точнее "неправильный" this.s
Хотя, имхо конечно =)

рони
08.07.2015, 12:54
Ты/Вы уверен/ы?
да, смотреть вторая строка по ссылке ниже
http://javascript.ru/forum/events/56819-ne-srabatyvaet-event-returnvalue-2.html#post377936

KosBeg
08.07.2015, 13:05
да, смотреть вторая строка по ссылке ниже
понятно, сам код написал - поэтому и уверен =)
общем я пример написал - пост здан :yes:
а зачем функцию инициализации в прототип засунул
учился по jQuery =)
там так же через прототип :yes:
=======================================
я наверное тупой но в мозиле все работает...
<html><head><meta charset="UTF-8"><title>Document</title></head>
<body>
<a href="http://vk.com">1 ссылка</a><br>
<a href="http://vk.com">2 ссылка</a><br>
<a href="http://vk.com">3 ссылка</a><br>
<a href="http://vk.com">4 ссылка</a>

<script type="text/javascript">
function _init_(el){
this.s = document.querySelectorAll(el);
}

function _A_(el){
return new _init_(el)
}

// установка обработчиков
_init_.prototype.on = function(event, func, param){
for(var i = 0; i < this.s.length; i++){
addEvent(this.s[i], event, func, param);
}
};

//addEvent минифицировал что бы не маячило перед глазамы
function addEvent(a,b,c,d){a.addEventListener?a.addEventLis tener(b,c,d||!1):a.attachEvent("on"+b,c);return!1};

// а вот и наш метод
_A_('a').on('click', function(event){
console.log(this);
event.preventDefault();
});
</script></body></html>

рони
08.07.2015, 13:30
KosBeg,
проблема не в console.log(this);

а в console.log(Helper(this));

не решает проблему, elem как и у sash003, только строка а инициализировать надо строку, елемент или nodeList

название темы не отражает существа проблемы -- проблема не с this, а с инициализацией this

рони
08.07.2015, 13:31
this.s = document.querySelectorAll(el);
это надо переделать

KosBeg
08.07.2015, 13:37
теперь понял, если условно описать то что происходит - то получается так =)
param = document.querySelectorAll(document.querySelector(' a'));
console.log(param);
я правильно понял?

рони
08.07.2015, 13:45
KosBeg,
да

sash003
08.07.2015, 15:31
Да, у меня через queryselectorAll делается выборка
function _init_(el){
this.s = document.querySelectorAll(el);
}

// главная и самая сложная функшн
function _A_(el){
return new _init_(el)
}
_init_.prototype.on = function(event, func, param){
for(var i = 0; i < this.s.length; i++){
addEvent(this.s[i], event, func, param);
}
//return this;
}
Я не знаю как переделать, подскажите

рони
08.07.2015, 15:36
sash003,
без защиты от дурака
function _init_(el){

this.s = typeof el == "string" ? document.querySelectorAll(el) : el.length ? el : [el];

}

sash003
08.07.2015, 16:09
рони,
Благодарочка, теперь и parent - функция работает, и вобще всё круто!! :)
А насчёт защиты от дураков, их мильёны, от них не защитишься.. пусть себе, подумаешь, не буде работать просто

KosBeg
08.07.2015, 17:50
решили повторить путь товарища Резига? :D
я сейчас точно нет, хотя в прошлом(месяц назад) хотел, а вот по поводу sash003 незнаю :D

sash003
09.07.2015, 12:05
я сейчас точно нет, хотя в прошлом(месяц назад) хотел, а вот по поводу sash003 незнаю :D
Ага, наверно, ведь "Мы еб*м - и побеждаем!" :victory:

KosBeg
09.07.2015, 12:31
"Мы еб*м - и побеждаем!" :victory:
я думал на подпись никто внимания не обращает :D