我正在构建自己的类(用于 SVG 对象)并且最近开始向它添加事件处理。遵循标准模型,我想要这种类型的交互
svgobj.bind('click', function(e){
// do stuff here on click with svgobj
});
即使我使用 jQuery 来附加事件,这个“绑定”不是 jQuerybind()
方法并且 svgobj 不是 jQuery 对象
我遇到的问题是,如果我创建多个对象,那么该svgobj
匿名函数内的引用是最后svgobj
创建的,而不是触发事件的那个。因此,例如,如果我的事件负责更改对象的状态,则无论我单击哪个对象,只有最后一个对象会更改状态。
我知道这是一个关闭问题,在一位同事的帮助下,我找到了解决方法,但这是一个非常难看的问题。它涉及将函数包装在一个自动执行的匿名函数中,我将正确传递给该svgobj
函数并返回原始函数,这是一个示例
svgobj.bind('click', (function(target){
return function(e){
// do stuff here on click with target, i.e. the correct svgobj
}
})(svgobj)
);
它有效,您可以在此处查看示例http://jsfiddle.net/2late2die/98te2/。您可以通过单击红色/绿色区域来测试拖动事件(通过圆圈部分)和更改状态事件。
有没有更好的方法来解决这个问题?我想避免每次我想对事件做某事时都必须使用两个匿名函数。也许有一种方法可以将自执行函数移动到首先调用事件的方法中,这样“在外部”它仍然看起来像只有一个常规函数作为参数传递?