2010-01-18 3 views
16

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

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

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

+1

Ничего себе, много ответов! – Skilldrick

+0

Кто бы назвал такие мероприятия? – Gumbo

+1

Да ... Так много, так быстро! Спасибо людям! @Gumbo говорит, что у вас может быть что-то вроде библиотеки xmpp, и вы можете запускать события на этом lib/object (например, «подключен», «отключен» и т. Д.). И вы хотите, чтобы некоторые действия выполнялись при возникновении события ... Вот почему я спрашиваю о событиях. – NilColor

ответ

9

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

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'); 
    } 
}; 
+0

Да. Это не так сложно. Но я хотел бы быть уверен, что должен. Благодаря! – NilColor

+0

Этот код не работает. '' '! eventName в this.events''' должно быть' ''! (eventName в this.events) '' ' – 2015-05-06 20:45:44

+1

@LuisVasconcellos: Правильно. Ред. Благодарю. –

1

addEventListener - особенность DOM, а не JS.

+0

Я знаю. Вот почему я говорю «somethng like ...»;) – NilColor

1

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

+0

В частности, вы можете иметь события на объектах, которые реализуют интерфейс EventTarget из DOM Level 2 Events. Это включает «Элемент» и «Документ» из DOM, но также «окно», «XMLHttpRequest» и «WebSocket»; вероятно, больше я забыл. – bobince

0

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

2

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

5

No.

Однако, вы можете сделать свою собственную реализацию, написав 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; 
+1

это более солидное усилие, чем мое, поэтому +1 для этого. –

1

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

  • Примитивное значение
  • Объект (в том числе функционального объекта)
0

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

Да.

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

К примеру:

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

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

+0

Ваш FunnyProcessor напоминает мне о наблюдаемом ... и пост с 2010 года, это наблюдение, прежде чем это было круто. – SparK

Смежные вопросы