Javascript.RU

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

Необходимо реализовать объект с методами событий
Всем доброго времени суток.
Хотел узнать мнение со стороны светлых умов JS разработчиков. Я проштудировал очень много ресурсов да бы решить мой вопрос но пока что все тщетно.
Есть такой код:
[ js ]object.on('event', function(){
var s = 0;
for(var i=0; i<arguments.length; i++) {
s += arguments[i];
}

console.log(s);
});

object.trigger('event', 1, 2, 3, 4);
// должно вывести в консоль значение переменной s т.е 10
object.off('event');
// удаление подписки на событие
object.trigger('event', 1, 2, 3, 4);
// ничего не происходит[ /js ]

Очевидно что необходимо реализовать методы событий у объекта on, off и trigger - on и off я сделал, а вот что в trigger пихать, ума не приложу. Буду рад любой инфе, всем хорошего дня!
Ответить с цитированием
  #2 (permalink)  
Старый 12.07.2017, 18:33
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

yeltsin,
.trigger( event [, extraParameters ] )

event

Тип: Событие

Объект jQuery.Event.


extraParameters

Тип: Массив или Объект

Дополнительный параметр, передаваемый в обработчик.
http://ruseller.com/jquery?id=130
Ответить с цитированием
  #3 (permalink)  
Старый 12.07.2017, 18:52
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

<div></div>
<script src='https://code.jquery.com/jquery-latest.js'></script>
<script>
var object = $('div');
object.on('event', function(){ 
var s = 0;
alert(JSON.stringify(arguments));
for(var i=1; i<arguments.length; i++) {
   s += arguments[i]; 
} 
alert(s); 
}); 

object.trigger('event',[1,2,3,4]); 
</script>
Ответить с цитированием
  #4 (permalink)  
Старый 12.07.2017, 19:53
Аватар для EmperioAf
Профессор
Отправить личное сообщение для EmperioAf Посмотреть профиль Найти все сообщения от EmperioAf
 
Регистрация: 15.01.2015
Сообщений: 622

Если вам нужно совсем просто, то:
var obj = {};
var ehs = Symbol('eventHandlersSymbol');
obj.on = function(eventName, handler) {
	this[ehs] = this[ehs] || {};
	var events = this[ehs];
	events[eventName] = events[eventName] || { handlers: [] };
	events[eventName].handlers.push(handler);
}
obj.off = function(eventName, handler) {
	this[ehs][eventName].handlers.splice(handlers.indexOf(handler), 1);
}
obj.trigger = function(eventName) {
	var args = Array.prototype.slice.call(arguments, 1);
	var handlers = this[ehs][eventName].handlers;
	for(var i = 0; i < handlers.length; i++) {
		var handler = handlers[i];
		handler.apply(this, args);
    }
}
obj.on('event', function(val1, val2, val3) {console.log(val1, val2, val3);})
obj.trigger('event', 1, 2, 3, 4, 5);
// 1 2 3

А вообще, конечно, для такого есть библиотеки, например EventEmitter (для браузера). И ты свой объект просто "наследуешь" от объекта EventEmitter и на прототипе объекта появляются все нужные тебе методы, с нужным поведением.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Необходимо реализовать браузерную игру. 2D+ Isometric. A-Team Общие вопросы Javascript 0 12.12.2016 20:26
Необходимо реализовать функцию jQuery на чистом JS Kliraks Общие вопросы Javascript 1 08.03.2016 08:45
Как правильно реализовать такой функционал? Julian Общие вопросы Javascript 3 16.01.2015 12:34
Создать объект в объекте Bryant-24 Общие вопросы Javascript 3 10.07.2013 16:06