Могут ли обычные объекты Javascript привязываться к событиям? Скажите примерно так:
obj = new Object();
obj.addEventListener('doSomething', foo, true);
Я знаю, что могу сделать это с помощью jQuery, но возможно ли это без какой-либо библиотеки?
Могут ли обычные объекты Javascript привязываться к событиям? Скажите примерно так:
obj = new Object();
obj.addEventListener('doSomething', foo, true);
Я знаю, что могу сделать это с помощью jQuery, но возможно ли это без какой-либо библиотеки?
Вам нужно будет реализовать свою собственную функциональность для этого, но это не очень сложно.
var obj = {
events: {},
addEventListener: function(eventName, handler) {
if(!(eventName in this.events))
this.events[eventName] = [];
this.events[eventName].push(handler);
},
raiseEvent: function(eventName, args) {
var currentEvents = this.events[eventName];
if(!currentEvents) return;
for(var i = 0; i < currentEvents.length; i++) {
if(typeof currentEvents[i] == 'function') {
currentEvents[i](args);
}
}
},
click: function() {
// custom 'click' function. when this is called, you do whatever you
// want 'click' to do. and then raise the event:
this.raiseEvent('onClick');
}
};
Нет.
Однако вы можете сделать свою собственную реализацию, написав addEventListener
и другие функции и сохранив список обработчиков для каждого события.
Например: (Untested)
function addEventListener(name, handler) {
if (!this.events) this.events = {};
if (!this.events[name]) this.events[name] = [];
this.events[name].push(handler);
}
function removeEventListener(name, handler) {
if (!this.events) return;
if (!this.events[name]) return;
for (var i = this.events[name].length - 1; i >= 0; i--)
if (this.events[name][i] == handler)
this.events[name].splice(i, 1);
}
function raiseEvent(name, args) {
if (!this.events) return;
if (!this.events[name]) return;
for (var i = 0; i < this.events[name].length; i++)
this.events[name][i].apply(this, args);
}
var obj = ...;
obj.addEventListener = addEventListener;
obj.removeEventListener = removeEventListener;
obj.raiseEvent = raiseEvent;
Не напрямую, но вы добавляете требуемую инфраструктуру publish/subscribe
к любому из них.
Нет. addEventListener
является признаком DOM, а не JS.
Я думаю, вы обнаружите, что в простом JavaScript это только объекты DOM, которые могут иметь события.
Нет, единственное, что есть у объектов JavaScript - это свойства. Значения этих свойств могут быть:
Нет, если вы не можете добавить обработчик события к любому объекту. Вы можете написать свою собственную систему событий для объектов, хотя, если вы пишете какой-то API или библиотеку для других скриптов, с которыми можно взаимодействовать.
Вы можете определить метод addEventListener для сбора всех объектов-слушателей, и ваш код может вызвать их в любое время. Это просто программирование OO. Определите addXListener, добавьте объект, переданный как параметр где-нибудь, и когда что-то произойдет, вы вызываете его методами.
Да.
Но помните, что событиями пользовательского интерфейса являются те, которые определены HTML/Javascript, поэтому то, что вы будете программировать, будет только для объекта "obj", чтобы предупреждать о ваших событиях.
Пример:
FunnyProcessor
+ addStartListener(...)
+ addProcessingListener(...)
+ addEndListener(...)
+ doStuff()
и doSuff сначала вызовут начальные слушатели, затем сделают некоторый цикл и для каждого обработчика обработки итерационного вызова, а также для конечных слушателей конца вызова.