如何正确地删除在动画集合中引用的 Raphael SVG 元素?

4
我有一组动态的 Raphael SVG 元素。我通过用户发起的 ajax 调用添加新元素并删除旧元素。我使用 set.push() 添加新元素,但由于需要删除的元素通常不是集合中的最后一个元素,所以我使用 element.remove() 而不是 set.pop()。这会在集合中留下一个已删除的元素,当我调用 set.animate() 时,会导致动画回调方法不被调用。也许这是 Raphael 1.5.2 中的一个 bug。
jsFiddle 示例:http://jsfiddle.net/G7fAQ/ 有没有更好的方法来删除与动画集合中引用的元素?或者我只能在调用 element.remove() 时手动管理 set.items 数组、set.length 变量和集合元素?
即:http://jsfiddle.net/G7fAQ/1/ 谢谢。
2个回答

5

要从数组中删除一个元素(这正是 Raphael set 的本质),您可以使用 splice 函数。

如果您知道该元素在数组中的索引,那么操作非常简单:

set.items.splice(index);

这将从数组中删除第index个元素。`splice`返回被删除的元素,所以如果您需要将其`remove()`或从屏幕上动画移除,可以这样做。
编辑:`splice`需要两个参数,要删除的数组中的索引和要删除的元素数量(加上任意数量的要添加到数组中的成员,这里不需要)。
代码应该这样写:
set.items.splice(index, 1);

一个 Raphael 的 set 似乎不响应 splice 函数。请参见 http://jsfiddle.net/G7fAQ/2/ - Justin
1
setitems 属性是一个数组,并且可以响应 splice。请查看 http://jsfiddle.net/chris5marsh/G7fAQ/22/ - 我认为它的响应方式符合您的要求。 - chris5marsh
太好了!它确实有效,谢谢!我以为我已经尝试过了,但我想没有。 - Justin

1
这可能是对给出答案的补充,但现在set.exclude(elem)有效。例如:
var set = paper.set(),
    elem = paper.circle(50, 50, 25);
set.push(elem) // elem now in set
set.exclude(elem) // what once was, forever may not be.

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