Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/468.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 处理d3动画队列时eval()的替代方法_Javascript_Animation_D3.js - Fatal编程技术网

Javascript 处理d3动画队列时eval()的替代方法

Javascript 处理d3动画队列时eval()的替代方法,javascript,animation,d3.js,Javascript,Animation,D3.js,我正在写一个应用程序,将运行大量的小动画。某些属性可能会设置动画,而其他属性可能不会,这取决于它们的可用性。然而,d3动画需要排队才能工作,我看到的唯一方法就是使用eval() 我的代码如下所示: var func = "thisClass.tagHandle.transition() \ .duration(len).ease('linear')"; if( typeof somevar.x !== 'undefi

我正在写一个应用程序,将运行大量的小动画。某些属性可能会设置动画,而其他属性可能不会,这取决于它们的可用性。然而,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是邪恶的等等。除了这个问题,还有什么好的选择吗

这是我第一次使用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);
}

如果它们一个接一个地执行,那么使用eval over
var trans=thisClass.tagHandle.transition()是否会提高性能;交易持续时间(len).ease(“线性”);if(somevar.x | | somevar.x==0)trans.attr('cx',somevar.x);if(somevar.y | | somevar.y==0)trans.attr('cy',somevar.y);如果(somevar.r | | somevar.r==0)trans.attr('r',somevar.r)…
是,则存在。当动画从队列顺序中取出时,它们就会停止工作,我已经尝试过了。然后eval似乎是一种解决方法。如果(!somevar.c)somevar.c=0,只要您知道自己在做什么,就可以在somevar.*中放入默认值(例如,没有伪值),如
中所示否,因为这些数据成员是坐标、颜色或类似的东西。因此,值为0将使动画混乱,而值为null将使d3爆炸。除非我错过了一些明显的事情。。。编辑:我考虑的一件事是回忆这些数据成员的最后值。如果此迭代中没有新的数据成员,那么上一次迭代中的数据成员一定没有更改。然而,再一次,我觉得运行空白d3动画是浪费资源。