触发 Raphael 事件的外部方法

5

我的应用程序使用Raphaël将一组对象放在页面上,每个对象都绑定了一个单击处理程序,该处理程序使用加载时通过JSON附加到对象的数据。这一切都很好地工作。

现在,我正在尝试使用Cucumber添加一些测试覆盖率(是的,我知道我应该首先构建测试,下次我会这样做)。我需要点击第一个对象以测试该对象关联的页面是否加载。我尝试找到该对象的适当SVG路径并触发其上的“click”事件,但那行不通。我还尝试将每个Raphaël集合放入全局可用的对象中,但无法弄清楚如何触发针对相应集合的Raphaël“click”事件。

具体来说:

1)如何手动触发Raphaël事件?

2)如果您有对Raphaël set拥有的SVG元素的引用,是否可能触发该事件?

3)如果不行,是否可以访问Raphaël当前持有的集合?

2个回答

8
您可以将此自定义方法添加到您的raphael元素中:
Raphael.el.trigger = function(eventName){
    for(var i = 0, len = this.events.length; i < len; i++) {
        if (this.events[i].name == eventName) {
            this.events[i].f.call(this);
        }
    }
}

您可以像这样使用:

var r = paper.rect(0,0,100,100).attr({"fill": "#f00"});

r.click(function(){
    this.attr("fill": "#0f0");
});

r.trigger("click");

2
这应该是 Raphael 的一部分。 - Scott Presnell

4
我发现先找到raphael对象,然后遍历DOM可以找到它们事件处理程序的函数。对于我的情况,单击事件是第0个事件。
因此,要触发它,我所做的只是:
```javascript // 找到raphael对象 var r = Raphael("canvas", 500, 500);
// 遍历DOM,找到单击事件处理程序的函数并触发它 r.forEach(function(el) { el[0].click(); }); ```
 raphobj.events[0].f();

但要小心,因为如果在点击事件中引用“this”,它将无法正常工作。


太好了,谢谢。这给了我获取数据所需的提示。 - Robin Whittleton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接