2013-07-24 5 views
0

Я несколько зелёный программист и совершенно новый для javascript/jquery, но я думал, что понял события javascript. Очевидно нет. Я не могу заставить слушателей событий работать так, как хотелось бы.Как подключить прослушиватель событий к javascript var

Учитывая JavaScript:

var Thing = { 
    //stuff 
    update: function() { 
     $.event.trigger({type:'stateUpdate', more:stuff}); 
    } 
}; 

var Room = { 
    //more stuff 
    updateHandler: function (e) { 
     //handle event here 
    } 
}; 

Если я JQuery:

$(document).on('stateUpdate', $Room.updateHandler); 

то он работает отлично, но я не могу сделать ни

$(Room).on('stateUpdate', $Room.updateHandler); 

или

Room.addEventListerner('stateUpdate', $Room.updateHandler); 

Первый ничего не делает, второй дает .addEventListerner - это не ошибка функции.

Я гугл в течение нескольких часов и не могу понять это. Я нашел что-то, что сказал .addEventListener работает только с объектами, которые реализуют EventListener, что-то о handleEvent, и что-то о функциях, автоматически реализующих EventListener. Ничто не может заставить объект реализовать его. Невозможно добавить слушателей к объектам javascript, которые не являются функциями? Должен ли я создать объект обработчика событий или использовать «документ» или «окно» и заставить его обработчики вызовов? Это кажется действительно уродливым.

Должны ли объекты быть функциями в первую очередь? Будет ли это работать? Похоже, нынешнее мнение состоит в том, что создание всех функций - это просто попытка превратить javascript во что-то, чего нет.

+1

Возможный дубликат [как добавить eventListener к объекту в javascript, который будет срабатывать при манипулировании объектом?] (Http://stackoverflow.com/questions/3903226/how-to-add-an-eventlistener-to -an-object-in-javascript-which-will-fire-when-obje) – Barmar

+1

Слушатели событий предназначены только для элементов DOM, а не для произвольных объектов Javascript. См. Связанный вопрос для получения более подробной информации. – Barmar

+0

Я предполагаю, что это не неслыханное поведение. Есть ли «правильный» способ сделать это рядом с слушателями? (предпочтительно, что способствует модульности, то есть больше «комнат», добавленных позже с минимальным или вообще не «редактированием» вещей). Невидимые посредники DOM - это все, что я могу себе представить помимо прямых вызовов в функции обновления «вещи», являются ли такие объекты DOM плохой практикой? – LucidCrux

ответ

0

AFAIK нет возможности добавить прослушиватель событий к простому объекту, так как он не находится внутри DOM. События запускаются внутри DOM и пузырятся, поэтому ваш прослушиватель событий для настраиваемого объекта не получит его.

Существует фреймворк http://www.bobjs.com/, который может помочь вам реализовать пользовательские события.

0

В ответ на @Barmar (вроде), я считаю, что я справился с этим. Подтверждение о том, является ли это хорошей альтернативой или нет, было бы неплохо. В принципе, я должен заниматься подписчиком, верно? Почти событие/слушатель, но не совсем.

var thing = { 
    callbacks: {}, 
    regCallback: function (key, which) { 
     callbacks[key] = which; 
    }, 
    remCallback: function (key) { 
     callbacks[key].delete; 
    } 
    update: function(e) { 
     for(var i = 0, len = callbacks.length; i < len;i++){ 
      callbacks[i](e); 
     }; 
    } 
}; 

var Room = { 
    updateHandler: function() { 
     //handle stuff 
    }, 
    subscribe: function (which, callback) { 
     which.regCallback('room', callback); 
    } 
    unsub: function (which) { 
     which.remCallback('room'); 
    } 
}; 

//wherever/whenever I need to get updates something like 
Room.subscribe(thing, Room.updateHandler); 
//unsub 
Room.unsub(thing); 
0

Вторая ошибка вызвана опечатка: addEventListerner имеет в нем дополнительную r.