Javascript Raphael.js-向元素注册多个事件

Javascript Raphael.js-向元素注册多个事件,javascript,events,raphael,Javascript,Events,Raphael,我的问题是我需要为矩形处理多个事件。听起来很简单, 例如,这是有效的 node.click(function(e){ click(); // this is function defined in same scope, it works ok }); node.mouseout(function(e){ mouseout(); }); 但是,我想将其自动化,因此它应该如下所示: var events = new Array("click", "mou

我的问题是我需要为矩形处理多个事件。听起来很简单, 例如,这是有效的

  node.click(function(e){
     click(); // this is function defined in same scope, it works ok
  });

  node.mouseout(function(e){
     mouseout();  
  });
但是,我想将其自动化,因此它应该如下所示:

var events = new Array("click", "mouseout");
for(var i in events){
     node[events[i]](function(e){
         events[i](); /*THIS is problem, no matter if it is click or mouseout
                        this always fires function with same name as last item
                        in events array (in this case mouseout) 
                      */
     }
}

你知道为什么我应该如何解决它吗?

在循环中创建的处理程序共享一个变量。在调用它们时,变量是循环中的最后一个值

您必须使用一种我称之为“冻结闭包”的技术,以便每个处理程序获得共享变量的单独副本。在您的情况下,更改的共享变量是
i

您的另一个问题是,您希望从字符串中调用函数“click/mouseout”,因此您必须获得该函数的句柄,此时您的代码正试图调用“hello”(),但这不起作用

最后的问题(但还不是bug)是不应该使用数组构造函数,也不应该使用
for in
循环来迭代数组

function createHandler(eventName) {
    return function(e) {
        window[eventName]();
    }
}

var events = ["click", "mouseout"];
for(var i=0; i < events.length; i++){
     node[events[i]](createHandler(events[i]));
}
函数createHandler(eventName){
返回函数(e){
窗口[eventName]();
}
}
var事件=[“点击”,“鼠标出”;
对于(var i=0;i
上面的例子更容易理解,但是您可以使用自调用匿名函数来完成同样的事情

var events = ["click", "mouseout"];
for(var i=0; i < events.length; i++){
     node[events[i]]((function(eventName){
         return function(e) {
             window[eventName]();
         };
     })(events[i]));
}
var事件=[“点击”,“鼠标出”;
对于(var i=0;i
@user1905088我正在研究它,只是想得到解释,我更喜欢第二种解决方案。。但是现在我有了node[events[I]=函数(e){alert(“ok”);alert(e);}(events[I]);当它被注视时,它会发出ok,click,ok,mouseout,但当我单击或mouseout矩形时,它不会发出。。有什么想法吗?@user1905088我不知道你的意思<代码>节点[events[i]]=函数(e){alert(“ok”);alert(e);}
不是我建议您使用的。创建一个来显示您的问题我错过了带有return的部分,但是它没有任何效果您必须将处理程序传递到click()和mouseout()函数中,但是仍然有些奇怪。。。