Вход

Просмотр полной версии : Добавление в прототип или валидность функции..?


2chan
10.10.2014, 23:03
Хочу добавить функцию .on(), как в jQuery, но без подключения самой библиотеки.
Попытался, ничего не получилось. Помогите, пожалуйста, найти ошибку:


HTMLElement.prototype.on = function (event, func, bool) {
if(func.length) { // *
func = new Function(func[0], func[1]);
}
this.addEventListener(event, func, bool);
};

* - появилась идея добавить интересную возможность: создавать функцию из массива, где 0 - аргументы, а 1 - тело. Т.е. будет не


..., function(a, x) {alert(a+x);}, ...

, а

..., ["a, x", "alert(a+x)"], ...

. Работает только с обычной функцией, с массивом - нет. В чём ошибка?
Кстати, с

if(func instanceof Array)

- тоже не работает. Простите за возможное ламерство :з

2chan
11.10.2014, 00:10
Всё, разобрался. Если кому интересно:


HTMLElement.prototype.on = Document.prototype.on = function (event, func, bool) { // добавить событие
if(func instanceof Array) {
func = new Function(func[0], func[1]);
}
this.addEventListener(event, func, bool);
};

HTMLElement.prototype.off = Document.prototype.off = function (event, func, bool) { // удалить событие
if(func instanceof Array) {
func = new Function(func[0], func[1]);
}
this.removeEventListener(event, func, bool);
};

danik.js
11.10.2014, 04:50
this.removeEventListener(event, func, bool);

Ты и правда думаешь что это будет работать? :D
func = new Function(func[0], func[1]);

Слышал что eval is evil (https://www.google.ru/search?q=eval+is+evil&oq=eval+is+evil&aqs=chrome..69i57.419j0j7&sourceid=chrome&es_sm=93&ie=UTF-8)? А Function - разновидность eval.

danik.js
11.10.2014, 04:52
bool
А слабо посмотреть в документации к addEventListener что этот "bool" значит?
Ну или пиши object вместо event :p

2chan
11.10.2014, 11:39
Ты и правда думаешь что это будет работать? :D

Но работает же, лол :D Проверил как на элементах, так и на document.

eval is evil

Громко сказано. Нужно думать как скрипт будет работать перед тем, как запускать. Если тупо запускать что-либо - не будет работать как с eval, так и без него.
Алсо, я же не говорю, что всегда буду юзать именно массив.

danik.js
11.10.2014, 12:04
Но работает же, лол
Ок, тест:
<script>
HTMLElement.prototype.on = Document.prototype.on = function (event, func, bool) { // добавить событие
if(func instanceof Array) {
func = new Function(func[0], func[1]);
}
this.addEventListener(event, func, bool);
};

HTMLElement.prototype.off = Document.prototype.off = function (event, func, bool) { // удалить событие
if(func instanceof Array) {
func = new Function(func[0], func[1]);
}
this.removeEventListener(event, func, bool);
};

var fn = ['e', 'alert("А обработчик-то не удалился!!!")'];
document.on('click', fn);
document.off('click', fn);
</script>
<button>Кликни для теста</button>

danik.js
11.10.2014, 12:04
Кстати, почему HTMLElement, а не Element?

2chan
11.10.2014, 12:34
Ок, тест:

Хммм... Интересно. Спасибо,няш, подумаю над этим :з

HTMLElement, а не Element
Не вижу особой разницы - поставил на HTMLElement.

danik.js
11.10.2014, 12:47
Не вижу особой разницы - поставил на HTMLElement.
А разницу между HTMLDocument и Document, стало быть, видишь?
Твои on/off - это всего лишь врапперы для add/removeEventListener. А они определены в прототипе Element. Так причем тут HTMLElement?

kostyanet
11.10.2014, 19:33
Вроде на обычную кложу похоже.

ТС, в этом нет практического смысла. В JQ в точности наоборот как я понимаю устроено - там объект наследуется от элемента, в этом есть смысл, это упгрейд, а у вас даунгрейд.

danik.js
11.10.2014, 19:41
Да херня вобще. Зачем так извращаться ради сокращения имени метода.
С автокомплитом все равно две-три буквы пишешь, не более.

Safort
11.10.2014, 19:57
danik.js,
неужели ты не понимаешь?) Он же совсем зелёный, вот и экспериментирует как может, потом со временем сам поймёт, что подобные штуки очень часто ненужны или вообще вредны.

kostyanet
11.10.2014, 20:00
А можно сделать алиас на elem.addEventListener()? Типа Element.on = Element.addEventListener. И пользуйся, типа.