Могут ли простые объекты Javascript иметь события? - PullRequest
16 голосов
/ 18 января 2010

Могут ли простые объекты Javascript иметь прикрепленное к ним событие? Скажите что-то вроде этого:

obj = new Object();
obj.addEventListener('doSomething', foo, true);

Я знаю, что могу сделать это с помощью jQuery, но возможно ли это без какой-либо библиотеки?

Ответы [ 8 ]

10 голосов
/ 18 января 2010

Для этого вам придется реализовать свои собственные функции, но это не очень сложно.

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');
    }
};
5 голосов
/ 18 января 2010

номер

Однако вы можете создать собственную реализацию, написав addEventListener и другие функции и сохранив список обработчиков для каждого события.

Например: (не проверено)

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;
2 голосов
/ 18 января 2010

Не напрямую, но вы добавляете необходимую инфраструктуру publish/subscribe к любому из них.

1 голос
/ 18 января 2010

Нет, единственное, что имеют объекты JavaScript - это свойства.Значения этих свойств могут быть:

  • Примитивное значение
  • Объект (включая объект функции)
1 голос
/ 18 января 2010

Я думаю, вы обнаружите, что в простом JavaScript только объекты DOM могут иметь события.

1 голос
/ 18 января 2010

Нет. addEventListener является функцией DOM, а не JS.

0 голосов
/ 18 января 2010

Вы можете определить метод addEventListener для сбора всех объектов слушателя, и ваш код может вызывать их в любое время. Это просто ОО программирование. Определите addXListener, добавьте объект, переданный в качестве параметра, и когда что-то случится, вы вызываете его методы.

Да.

Но помните, что события пользовательского интерфейса - это события, определенные в HTML / Javascript, так что вы будете программировать только для того, чтобы ваш объект "obj" предупреждал о ваших событиях.

К примеру:

FunnyProcessor
+ addStartListener(...)
+ addProcessingListener(...)
+ addEndListener(...)
+ doStuff()

и doSuff будет сначала вызывать слушателей начала, затем делать некоторый цикл и для слушателей обработки вызовов каждой итерации, а также в конце слушателей конца вызова.

0 голосов
/ 18 января 2010

Нет, не в той степени, в которой вы можете добавить обработчик событий для любого объекта. Вы можете написать свою собственную систему событий для объектов, если вы пишете какой-то API или библиотеку для взаимодействия с другими сценариями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...