我正在尝试重置或清除D3.js立体图,以使其重新开始。这是代码:

$(function(){

    // create new cubism.js context to render
    var graphContext = cubism.context()
        .serverDelay(1000) // allow 1second delay
        .step(1000) // 1 second steps
        .size(650); // 50px wide

    // create a new metric
    // this allows you to retrieve values from some source
    // this is data-source agnostic, so this does not matter.
    var graphMetric = graphContext.metric(function(start, stop, step, callback) {
        var values = [];
        start = +start;
        stop = +stop;
        while (start < stop) {
            start += step;
            values.push(Math.random());
        }
        callback(null, values);
    });


    // here we create a new element and then append it to our
    // parent container. Then we call d3 to select the newly created
    // div and then we can create a chart
    var graphElement = document.createElement("div");
    $("#insertElement").append(graphElement);
    d3.select(graphElement).call(function(div) {
        div.append("div")
            .attr("class", "axis top")
            .call(graphContext.axis().orient("top"));
        div.append("div")
            .attr("class", "rule")
            .call(graphContext.rule());
        div.selectAll(".horizon")
            .data([graphMetric])
            .enter().append("div")
            .attr("class", "horizon")
            .call(graphContext.horizon()
                  .height(150)
             );
    });

});


这是关于jsfiddle的演示

最佳答案

我只能建议自己清理画布。像这样

$(graphElement).find('canvas')[0].getContext('2d').clearRect(0, 0, canvasWidth, canvasHeight);


完整代码(jsfiddle

console.clear();

$(function(){

    var canvasWidth = 650, canvasHeight = 150;
    // create new cubism.js context to render
    var graphContext = cubism.context()
        .serverDelay(1000) // allow 1second delay
        .step(1000) // 1 second steps
        .size(canvasWidth); // 50px wide

    // create a new metric
    // this allows you to retrieve values from some source
    // this is data-source agnostic, so this does not matter.
    var graphMetric = graphContext.metric(function(start, stop, step, callback) {
        var values = [];
        start = +start;
        stop = +stop;
        while (start < stop) {
            start += step;
            values.push(Math.random());
        }
        callback(null, values);
    });


    // here we create a new element and then append it to our
    // parent container. Then we call d3 to select the newly created
    // div and then we can create a chart
    var graphElement = document.createElement("div");
    $("#insertElement").append(graphElement);
    d3.select(graphElement).call(function(div) {
        div.append("div")
            .attr("class", "axis top")
            .call(graphContext.axis().orient("top"));
        div.append("div")
            .attr("class", "rule")
            .call(graphContext.rule());
        div.selectAll(".horizon")
            .data([graphMetric])
            .enter().append("div")
            .attr("class", "horizon")
            .call(graphContext.horizon()
                  .height(canvasHeight)
             );
    });

  $('#reset').on('click', function () {
    $(graphElement).find('canvas')[0].getContext('2d').clearRect(0, 0, canvasWidth, canvasHeight);
    });
});

10-07 17:40