Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.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:几乎相同的代码,不同的结果_Javascript_D3.js_Transition_Jsfiddle - Fatal编程技术网

Javascript D3:几乎相同的代码,不同的结果

Javascript D3:几乎相同的代码,不同的结果,javascript,d3.js,transition,jsfiddle,Javascript,D3.js,Transition,Jsfiddle,我试图运用建议来抓住几个过渡的结尾。 但是在我的本地文件中,我得到了一个未捕获的TypeError:t.call不是一个函数错误。代码如下: var svg = d3.select('svg'); function endall(transition, callback) { if (typeof callback !== "function") throw new Error("Wrong callback in endall"); if (transition

我试图运用建议来抓住几个过渡的结尾。 但是在我的本地文件中,我得到了一个
未捕获的TypeError:t.call不是一个函数
错误。代码如下:

    var svg = d3.select('svg');

  function endall(transition, callback) { 
    if (typeof callback !== "function") throw new Error("Wrong callback in endall");
    if (transition.size() === 0) { callback() }
    var n = 0; 
    transition 
        .each(function() { ++n; }) 
        .each("end", function() { if (!--n) callback.apply(this, arguments); }); 
  } 


for (var i=0;i<5;i++) {

    svg.append('rect')
            .attr("x",i*60)
      .attr("y",50)
      .attr("height",50)
      .attr("width",50)
      .style("fill","#ff0000");
}

    svg.selectAll("rect:not(.active)")
      .transition()
      .duration(1000)
      .style("fill","#00ff00")
      .call(endall, function() { alert("all done") });
var svg=d3.select('svg');
函数endall(转换,回调){
if(typeof callback!=“function”)抛出新错误(“endall中的回调错误”);
如果(transition.size()==0){callback()}
var n=0;
过渡
.each(函数(){++n;})
.each(“end”,function(){if(!--n)callback.apply(this,arguments);});
} 

对于(var i=0;i而言,不产生错误的fiddle在v3上运行,而产生错误的fiddle在v5上运行

在d3v3中,您可以使用
transition.each(“end”,…)
来表示事件:

转换。每个([type,]listener) 如果指定了类型,则为转换事件添加侦听器, 支持“开始”、“结束”和“中断”事件。侦听器将 为转换中的每个单独元素调用。()

在d3v4和v5中,此方法被替换为
转换。对于事件:

selection.on(typenames[,listener[,options]]) 将侦听器添加或删除到指定对象的每个选定元素 事件类型名称。()

转换。每个(函数)
仍然可以用于对正在转换的每个项目执行操作,但不能用于事件侦听。由于版本之间的这种更改,您会得到一个错误,即t.call不是函数(它是一个字符串:
“end”
),警报永远不会触发

对于d3v4或d3v5,请改用:

transition 
    .each(function() { ++n; }) 
    .on("end", function() { if (!--n) callback.apply(this, arguments); }); 

.

对于javascript库来说,主要版本非常重要,而且显然JSFIDLE并没有对它们进行大量更新(我将发布一个与您类似的不太深入的答案,bravo在至少3分钟内击败了我:)