2012-12-14 44 views
3

我的问题是,我需要处理矩形的多个事件。这听起来很简单, 例如这工作Raphael.js - 注册多个事件到元素

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) 
         */ 
    } 
} 

你有什么想法,为什么我应该如何解决呢?

回答

1

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

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

你的其他问题是你想从一个字符串调用你的函数“click/mouseout”,所以你必须得到一个函数的句柄,现在你的代码正试图呼叫"hello"()这是行不通的

你最后的问题(但不是一个错误)是你不应该使用数组构造函数,你不应该使用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])); 
} 

上面的例子更容易理解,但你可以使用自调用匿名函数做同样的事情

var events = ["click", "mouseout"]; 
for(var i=0; i < events.length; i++){ 
    node[events[i]]((function(eventName){ 
     return function(e) { 
      window[eventName](); 
     }; 
    })(events[i])); 
} 
+0

谢谢,现在我明白了..但我怎么能轻易解决这个问题,普莱舍? – Jadro007

+0

@ user1905088我正在处理它,只想获得解释 –

+0

尼斯,我更喜欢第二种解决方案..但是现在我有 节点[events [i]] = function(e){ alert( “好”); (e); }(events [i]); 当它被盯住时,它会点亮,点击,确定,鼠标移出,但当点击或移出矩形时,它不会触发。任何想法? – Jadro007