Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 10.10.2014, 23:03
Аспирант
Отправить личное сообщение для 2chan Посмотреть профиль Найти все сообщения от 2chan
 
Регистрация: 11.07.2014
Сообщений: 69

Добавление в прототип или валидность функции..?
Хочу добавить функцию .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, 10.10.2014 в 23:08.
Ответить с цитированием
  #2 (permalink)  
Старый 11.10.2014, 00:10
Аспирант
Отправить личное сообщение для 2chan Посмотреть профиль Найти все сообщения от 2chan
 
Регистрация: 11.07.2014
Сообщений: 69

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

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);
};

Последний раз редактировалось 2chan, 11.10.2014 в 01:34.
Ответить с цитированием
  #3 (permalink)  
Старый 11.10.2014, 04:50
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от 2chan
this.removeEventListener(event, func, bool);
Ты и правда думаешь что это будет работать?
Сообщение от 2chan
func = new Function(func[0], func[1]);
Слышал что eval is evil? А Function - разновидность eval.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #4 (permalink)  
Старый 11.10.2014, 04:52
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от 2chan
bool
А слабо посмотреть в документации к addEventListener что этот "bool" значит?
Ну или пиши object вместо event
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #5 (permalink)  
Старый 11.10.2014, 11:39
Аспирант
Отправить личное сообщение для 2chan Посмотреть профиль Найти все сообщения от 2chan
 
Регистрация: 11.07.2014
Сообщений: 69

Сообщение от danik.js Посмотреть сообщение
Ты и правда думаешь что это будет работать?
Но работает же, лол Проверил как на элементах, так и на document.

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

Последний раз редактировалось 2chan, 11.10.2014 в 11:48.
Ответить с цитированием
  #6 (permalink)  
Старый 11.10.2014, 12:04
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от 2chan
Но работает же, лол
Ок, тест:
<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>
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #7 (permalink)  
Старый 11.10.2014, 12:04
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Кстати, почему HTMLElement, а не Element?
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #8 (permalink)  
Старый 11.10.2014, 12:34
Аспирант
Отправить личное сообщение для 2chan Посмотреть профиль Найти все сообщения от 2chan
 
Регистрация: 11.07.2014
Сообщений: 69

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

Сообщение от danik.js
HTMLElement, а не Element
Не вижу особой разницы - поставил на HTMLElement.
Ответить с цитированием
  #9 (permalink)  
Старый 11.10.2014, 12:47
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от 2chan
Не вижу особой разницы - поставил на HTMLElement.
А разницу между HTMLDocument и Document, стало быть, видишь?
Твои on/off - это всего лишь врапперы для add/removeEventListener. А они определены в прототипе Element. Так причем тут HTMLElement?
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #10 (permalink)  
Старый 11.10.2014, 19:33
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Вроде на обычную кложу похоже.

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Добавление функции внутрь другой функции Lion_astana jQuery 9 28.12.2013 14:33
Добавление индивидуальных свойств к функции ExeiL Общие вопросы Javascript 14 23.08.2013 13:33
Добавление класса или id к ссылке. Простой вопрос: Как? Mrjoey Элементы интерфейса 1 18.05.2011 16:42
Динамический Select или Input (автозаполнение, добавление данных, обновление) kudinov Элементы интерфейса 0 21.09.2010 14:12
Добавление метода к функции YISHIMITSY Общие вопросы Javascript 2 17.02.2010 12:49