获取用于在JS中的处理程序内触发事件的名称

时间:2014-02-14 01:01:24

标签: javascript javascript-events

这是我的javascript代码。

//Events to watch
CanvasIO.events = [
    "object:added",
    "object:removed",
    "object:modified",
    "object:rotating",
    "object:scaling",
    "object:moving"
];

//Socket connection
CanvasIO.socket = io.connect('http://localhost:8080');

//Canvas events fired
for (e in CanvasIO.events) {
    CanvasManager.canvas.on(e, function(data){
        CanvasIO.socket.emit("canvas:event", {
            eventType: e,
            data: data
        });
    });
}

//Socket IO event received
CanvasIO.socket.on("canvas:event", function(data) {
    console.log("Received: " + data.eventType);
});

我的问题是,在Canvas Event Fired部分,我希望根据事件名称生成自动发送的消息。但是因为我使用eventType: e每封邮件都会获得e"object:moving"的最后状态。

所以,对于:

CanvasManager.canvas.on(key, handler)

是否可以访问key中的handler?如果没有,我该怎么办?

1 个答案:

答案 0 :(得分:0)

问题是,当你的for循环继续迭代时,你的处理程序中e的值也在更新。要绕过这个函数,你可以将处理程序包装在你传递给e的函数中(这称为'闭包')。它的工作原理是为您的事件变量创建一个新的范围,因此随着for循环的增量不变,或者您可以使用bind(我相信)

for (e in CanvasIO.events) {
    CanvasManager.canvas.on(e, function(event){
        return function(data){
            CanvasIO.socket.emit("canvas:event", {
                eventType: event,
                data: data
            });
        };
    }(e));
}

for (e in CanvasIO.events) {
    CanvasManager.canvas.on(e, function(event, data){
        CanvasIO.socket.emit("canvas:event", {
            eventType: event,
            data: data
        });
    }.bind(null, e));
}

这是一个非常烦人的问题,一直出现,这里有更多信息:Javascript infamous Loop issue?