Простые объекты Javascript могут иметь события?

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

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

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

16
задан NilColor 20 January 2010 в 11:50
поделиться

8 ответов

Нет, доступ к управляемым объектам в деструкторе невозможен: сюда входят COM RCW.

Вместо этого реализуйте стандартный образец IDisposable и освобождайте COM-объекты методом Dispose (bool), как одноразовый управляемый объект.

-121--3595031-

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

Да.

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

На примере:

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

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

-121--2347112-

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

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');
    }
};
10
ответ дан 30 November 2019 в 22:17
поделиться

Нет. addeventListener - это особенность DOM, а не JS.

1
ответ дан 30 November 2019 в 22:17
поделиться

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

2
ответ дан 30 November 2019 в 22:17
поделиться

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

1
ответ дан 30 November 2019 в 22:17
поделиться

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

  • Примитивное значение
  • Объект (включая объект функции)
1
ответ дан 30 November 2019 в 22:17
поделиться

Нет.

Тем не менее, вы можете внести собственную реализацию путем написания 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;
5
ответ дан 30 November 2019 в 22:17
поделиться

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

0
ответ дан 30 November 2019 в 22:17
поделиться

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

Да.

Но помните, что мероприятия пользовательского интерфейса определяются HTML / JavaScript, поэтому вы будете программировать, будет только для вашего объекта «OBJ», чтобы предупредить о ваших событиях.

На примере:

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

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

0
ответ дан 30 November 2019 в 22:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: