Необходимо реализовать объект с методами событий
Всем доброго времени суток.
Хотел узнать мнение со стороны светлых умов 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 пихать, ума не приложу. Буду рад любой инфе, всем хорошего дня! |
yeltsin,
.trigger( event [, extraParameters ] ) event Тип: Событие Объект jQuery.Event. extraParameters Тип: Массив или Объект Дополнительный параметр, передаваемый в обработчик. http://ruseller.com/jquery?id=130 |
<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> |
Если вам нужно совсем просто, то:
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 и на прототипе объекта появляются все нужные тебе методы, с нужным поведением. |
Часовой пояс GMT +3, время: 06:48. |