我正在编写一个将运行许多小型动画的应用程序。某些属性可能具有动画效果,而其他属性则可能没有动画,这取决于它们的可用性。但是,d3动画需要排在队列中才能工作,我看到的除了使用eval()之外没有其他方法。
我的代码如下所示:
var func = "thisClass.tagHandle.transition() \
.duration(len).ease('linear')";
if( typeof somevar.x !== 'undefined' ) {
func += ".attr('cx', somevar.x)";
}
if( typeof somevar.y !== 'undefined' ) {
func += ".attr('cy', somevar.y)";
}
if( typeof somevar.r !== 'undefined' ) {
func += ".attr('r', somevar.r)";
}
if( typeof somevar.c !== 'undefined' ) {
func += ".attr('stroke', somevar.c)";
}
func += ";";
eval(func);
在队列外部分别执行每个动画,会使动画无法正常工作。该功能可能很快就会执行-当我考虑将虚拟值放入动画队列中时,我担心效率和功能问题,从而占用了不必要的处理时间(Firefox上的应用程序已经有些繁重了)。然而,许多人说,评估是邪恶的等等。除了这个问题,还有其他好的选择吗?
这是我第一次使用eval()。我不知道这是否像iframe(一种经常被滥用的工具,导致不必要的不良声誉),还是像瘟疫那样真正应避免的东西。
谢谢。
在同一个对象上创建多个过渡会取消其他过渡,但是向同一个过渡添加新的属性或样式语句不是问题。您只需要将转换保存在变量中即可。
var activeTransition = thisClass.tagHandle.transition()
.duration(len).ease('linear');
if( typeof somevar.x !== 'undefined' ) {
activeTransition.attr('cx', somevar.x);
}
if( typeof somevar.y !== 'undefined' ) {
activeTransition.attr('cy', somevar.y);
}
if( typeof somevar.r !== 'undefined' ) {
activeTransition.attr('r', somevar.r);
}
if( typeof somevar.c !== 'undefined' ) {
activeTransition.attr('stroke', somevar.c);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句