Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 04.03.2018, 15:34
Новичок на форуме
Отправить личное сообщение для gevaraweb Посмотреть профиль Найти все сообщения от gevaraweb
 
Регистрация: 04.03.2018
Сообщений: 1

Грамотное добавление событий
Добрый день! Хочу написать свою библиотечку. Главный класс в ней - Event. В нем выполняется куча тяжелых действий. Хочу сделать так, что программист, пользуясь этой библиотекой, мог добавлять свои мелкие события userEventFirst, userEventTwo и пр., в специально отведенном месте. Чтобы он не искал это место, хочу предоставить ему "интерфейс".

Вот мой класс:

addEvent = function () {

	this.userEventFirst = function () {};
	this.userEventTwo = function () {};

	this.attachEvent = function (event, handler) {

		switch ( event ) {
			case 'eventFirst':  this.userEventFirst = handler;	break;
			case 'eventTwo': 	this.userEventTwo = handler;	break;		
			break;
		}

	};

	this.working = function () {
		
		this.userEventFirst();	
		
		//... hard work
		console.log('working');
		
		this.userEventTwo();
	}	
	
};


И вот программист берет мой класс, и дописывает действия:

addEvent1 = new addEvent();

addEvent1.attachEvent('eventFirst', function() {

    console.log('click eventFirst'); // что угодно еще

});

addEvent1.attachEvent('eventTwo', function() {

    console.log('click eventTwo'); // что угодно еще

});

addEvent1.working();


Все работает. Только насколько грамотно это сделано? может теряется производительность и т.п. Таких событий может быть десяток, они могут вызываться в цикле или в таймере. Причем программист может задавать не все события, а только то, что ему нужно. Смущает, что не заданные действия крутятся вхолостую:

this.userEventFirst = function () {};

Последний раз редактировалось gevaraweb, 04.03.2018 в 15:37.
Ответить с цитированием
  #2 (permalink)  
Старый 05.03.2018, 10:49
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,723

Если не хватает знаний, то стоит ли вообще писать такую "библиотеку"?
Почему не вешать кастомные события на document и на нем же их вызывать?
Зачем вообще реализовывать обработчики событий за программиста Васю?

Вам стоит посмотреть на EventEmitter.
Ответить с цитированием
  #3 (permalink)  
Старый 05.03.2018, 11:19
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

gevaraweb,
Похоже на Наблюдателя
// Observable
class Man {
    constructor(name) {
        this.name = name;
        this.observers = new Set();
    }
    attach(observer) {
        this.observers.add(observer);
    }
    detach(observer) {
        this.observers.delete(observer);
    }
    notify(message) {
        this.message = message;
        for (let observer of this.observers)
            observer.update(this);
    }
}
// Observer1
class Dog {
    constructor(name) {
        this.name = name;
    }
    update(observable) {
        console.log(`> ${observable.name}: ${observable.message}`);
        console.log(`< ${this.name}: Гав-гав!`);
    }
}
// Observer2
class Cat {
    constructor(name) {
        this.name = name;
    }
    update(observable) {
        console.log(`> ${observable.name}: ${observable.message}`);
        console.log(`< ${this.name}: Мяв-мяв!`);
    }
}

let vasya = new Man('Вася');
let tuzik = new Dog('Тузик');
let murka = new Cat('Мурка');

vasya.attach(tuzik);
vasya.attach(murka);
vasya.notify('Ням-ням!');
vasya.detach(murka);
vasya.notify('Ням-ням-ням!');
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Блокирование интерфейса. Добавление нового элемента vychmat Элементы интерфейса 5 20.03.2014 15:04
Ползунок JQuery: несколько событий? Veterinar jQuery 9 10.01.2014 20:57
Добавление обработчика событий при добавлении элементов vladimircape Events/DOM/Window 3 13.09.2012 09:57
Скопировать обработчики событий с одного элемента на другой. Jurasmi Events/DOM/Window 3 10.11.2010 19:03
кроссбраузерное добавление обработчика событий элементу krinart Events/DOM/Window 5 30.09.2008 04:38