Javascript 断开Raphael元素事件的连接

Javascript 断开Raphael元素事件的连接,javascript,event-handling,vector-graphics,raphael,Javascript,Event Handling,Vector Graphics,Raphael,我将onmouseout事件附加到Raphael circle元素,如下所示: (function(el,iElPos,col){ el.mouseout(function elmouseout(){el.animate({"fill":col,"r":ELEMENT_RADIUS},150); alert("first"); fadeTag();

我将onmouseout事件附加到Raphael circle元素,如下所示:

    (function(el,iElPos,col){
        el.mouseout(function elmouseout(){el.animate({"fill":col,"r":ELEMENT_RADIUS},150);
                               alert("first");
                               fadeTag();
                               });              
    )(c,i,elementColour);
c是元素。随后,我希望断开该活动并附加另一个thuswise:

(function (el){
    el.attr("fill",EXCLUDED_COLOUR);
    el.unmouseout(elmouseout);
    el.mouseout(function elmouseout(){
                       alert("second");
                       el.animate({"fill":EXCLUDED_COLOUR,"r":ELEMENT_RADIUS},150);
                       fadeTag();
                       });
})(setMainSeries[iPos]);
但这两件事都有关联。两个警报都将触发,随后附加的事件将首先触发。我想完全断开第一个事件。我是否错误地使用了unmouseout()

更新

我尝试了echo flow和lincolnk的建议,但都不起作用。我认为回声流可能更有效。我像建议的那样打开了函数

function elmouseoutDefault(el){
    el.animate({"fill":ELEMENT_COLOUR,"r":ELEMENT_RADIUS},150);
    alert("first");
    fadeTag();
};
然后在我创建每个元素时,像这样附加事件

el.mouseout(elmouseoutDefault);
但是,这失败了,因为我没有通过
el
。所以我把它改成

el.mouseout(elmouseoutDefault(el));
这似乎在添加时调用了
elmouseoutDefault
。我只希望它在mouseout事件时触发。

这看起来像是一个在何处声明函数名的问题-我认为当您使用名称内联定义函数时,事情可能会变得棘手。这将使引用的函数更可靠


编辑:这是一个范围问题-您对
elmouseout
的定义只存在于自调用函数的范围内。我在考虑一个关于函数名的不同问题。但是代码应该仍然可以工作。

我想根据您的工作代码验证这一点,但是根据您发布的代码,我认为发生了以下情况:在这两个代码片段中,您都声明了一个函数“elmouseout”。您使用的函数声明语法在局部范围内声明函数(相当于编写“var elmouseout=function(){…}”),并且由于您在单独的函数闭包内声明每个函数,因此第二个代码块中的变量“elmouseout”引用第二个代码块中的函数“elmouseout”,与第一个代码块相反,第一个代码块将产生所需的行为。我建议将函数声明分解如下:

function elmouseout(e){e.target.animate({"fill":col,"r":ELEMENT_RADIUS},150);
                               alert("first");
                               fadeTag();
                               }

    (function(el,iElPos,col){
        el.mouseout(elmouseout);              
    )(c,i,elementColour);


function elmouseout2(e){
                       alert("second");
                       e.target.animate({"fill":EXCLUDED_COLOUR,"r":ELEMENT_RADIUS},150);
                       fadeTag();
                       }

(function (el){
    el.attr("fill",EXCLUDED_COLOUR);
    el.unmouseout(elmouseout);
    el.mouseout(elmouseout2);
})(setMainSeries[iPos]);

内联声明一个命名函数没有错。这只是一个内部函数声明,在js中是完全合法的,相当于创建一个匿名函数,并使用“var”将其分配给一个局部变量。问题是第二个作用域试图引用第一个作用域中定义的变量。我认为您在这里提供的代码可以正常工作。@echo flow谢谢,我在写这篇文章时就想到了这一点,但在阅读您的评论之前,它没有单击。您好,这似乎仍然没有断开事件的连接。与以前一样的行为:(…我认为问题的一部分是我将此行为应用于多个元素
c
,因此,如果我有一个全局变量
elmouseout
,每当新的
c
附加了它的事件时,这将被覆盖…我修改了事件处理程序以接受事件,并将元素目标从事件中移除。我k以上代码现在应该可以正常工作了。如果您愿意,请随时链接到一个实时示例,以便我可以验证它。感谢您的更新。我还没有能够尝试它,因为我已经找到了一个解决方法。我可能会在本周晚些时候回来,并在我的历史版本上试用您的代码。谢谢。发布一个完整的非实时版本怎么样-工作示例?如果你不告诉我们你所做的一切,那么很难确定你的问题。@lincolnk-是的,我知道这会让事情变得很尴尬。我可以发布所有的代码,但会是一页又一页。不过我现在已经找到了解决办法。谢谢你的帮助。
function elmouseout(e){e.target.animate({"fill":col,"r":ELEMENT_RADIUS},150);
                               alert("first");
                               fadeTag();
                               }

    (function(el,iElPos,col){
        el.mouseout(elmouseout);              
    )(c,i,elementColour);


function elmouseout2(e){
                       alert("second");
                       e.target.animate({"fill":EXCLUDED_COLOUR,"r":ELEMENT_RADIUS},150);
                       fadeTag();
                       }

(function (el){
    el.attr("fill",EXCLUDED_COLOUR);
    el.unmouseout(elmouseout);
    el.mouseout(elmouseout2);
})(setMainSeries[iPos]);