1

我是一个有点绿色的程序员,对 javascript/jquery 很陌生,但我认为我理解 javascript 事件。显然不是。我无法让事件侦听器按我的意愿工作。

给定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 is not a function 错误。

我已经用谷歌搜索了几个小时,无法弄清楚。我发现 .addEventListener 仅适用于实现 EventListener 的对象、有关 handleEvent 的内容以及有关自动实现 EventListener 的函数的内容。没有关于如何使对象实现它的信息。有没有办法将侦听器添加到不是函数的 javascript 对象?我是否必须创建一个事件处理程序对象,或者使用“文档”或“窗口”并让它调用处理程序?这看起来真的很丑。

对象首先应该是函数吗?那行得通吗?似乎目前的观点是,让一切功能化只是试图让 javascript 变成它不是的东西。

4

3 回答 3

0

第二个错误是由拼写错误引起的:addEventListerner有额外r的。

于 2014-02-24T17:55:02.913 回答
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);
于 2013-07-24T17:52:18.853 回答
0

AFAIK 无法将事件侦听器添加到普通对象,因为它没有放置在 DOM 中。事件在 DOM 内部触发,并且冒泡,因此您的自定义对象的事件侦听器不会接收到它。

有一个http://www.bobjs.com/框架可以帮助您实现自定义事件。

于 2013-07-24T09:18:36.723 回答