Диаграмма SVG D3 не может отображаться в IE - PullRequest
0 голосов
/ 08 мая 2020

Я создаю веб-сайт, содержащий d3 svg для отображения гистограммы. Он может отображаться в Chrome, Firefox, Edge, Safari, но не работает в IE. Я пробовал использовать метод холста, но он не работает. Затем я попытался установить окно просмотра для svg, но он тоже не работает. Может ли кто-нибудь помочь мне решить эту проблему? Вот мой код d3. js и html

function homeStats() {
    var jsonobj = document.getElementById('stats-data').value;
    var data = JSON.parse(jsonobj);
    var parentDiv = document.getElementById("home-stats");

    function drawbar() {
        var margin = { top: 40, right: 20, bottom: 100, left: 40 };
        var width = parentDiv.clientWidth - margin.left - margin.right;
        var height = parentDiv.clientHeight - margin.top - margin.bottom;
        var tip = d3.tip()
            .attr('class', 'd3-tip')
            .offset([-10, 0])
            .html(function (d) {
                return "<span style='color:white'>" + d.value + "</span>";
            })
        d3.selectAll('#home-stats-svg').remove()
        var svg = d3.select("#home-stats").append("svg").attr("id", "home-stats-svg")
            .attr("width", width + margin.left + margin.right)
            .attr("height", height + margin.top + margin.bottom)
            .append("g")
            .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

        svg.call(tip);

        var x0 = d3.scale.ordinal()
            .rangeRoundBands([0, width], .65);

        var x1 = d3.scale.ordinal();

        var y = d3.scale.linear()
            .range([height, 0]);

        var color = d3.scale.ordinal()
            .range(["#f79944", "#20b5e1"]);

        var xAxis = d3.svg.axis()
            .scale(x0)
            .orient("bottom");

        var yAxis = d3.svg.axis()
            .scale(y)
            .orient("left")


        var columnNames = d3.keys(data[0]).filter(function (key) { return key !== "Year"; });

        data.forEach(function (d) {
            d.subGroups = columnNames.map(function (name) { return { name: name, value: +d[name] }; });
        });

        x0.domain(data.map(function (d) { return d.Year; }));
        x1.domain(columnNames).rangeRoundBands([0, 30]);
        y.domain([0, d3.max(data, function (d) { return d3.max(d.subGroups, function (d) { return d.value; }); })]);

        svg.append("g")
            .attr("class", "x axis")
            .attr("transform", "translate(0," + height + ")")
            .call(xAxis);

        svg.append("g")
            .attr("class", "y axis")
            .call(yAxis)
            .append("text")
            .attr("transform", "rotate(-90)")
            .attr("y", 6)
            .attr("dy", ".71em")
            .style("text-anchor", "end");

        const rx = 5;
        const ry = 5;

        var Year = svg.selectAll(".Year")
            .data(data)
            .enter().append("g")
            .attr("class", "Year")
            .attr("transform", function (d) { return "translate(" + x0(d.Year) + ",0)"; });

        Year.selectAll("rect")
            .data(function (d) { return d.subGroups; })
            .enter().append("path")
            .style("fill", function (d) { return color(d.name); })
            .attr("d", item => `
                        M${x1(item.name)},${y(item.value) + ry}
                        a${rx},${ry} 0 0 1 ${rx},${-ry}
                        h${10 - 2 * rx}
                        a${rx},${ry} 0 0 1 ${rx},${ry}
                        v${height - y(item.value) - ry}
                        h${-(10)}Z
                      `)
            .on('mouseover', tip.show)
            .on('mouseout', tip.hide);

        var legend = svg.selectAll(".legend")
            .data(columnNames.slice().reverse())
            .enter().append("g")
            .attr("class", "legend")
            .attr("transform", function (d, i) { return "translate(0," + i * 20 + ")"; });

        legend.append("rect")
            .attr("x", width - 5)
            .attr("width", "1vw")
            .attr("height", "2vh")
            .style("fill", color);

        legend.append("text")
            .attr("x", width - 7)
            .attr("y", 9)
            .attr("dy", ".35em")
            .style("text-anchor", "end")
            .text(function (d) { return d; });

    }

    drawbar();

}

Html

<div id="home-stats" style="height:50vh; width:45vw">
        <input type="hidden" id="stats-data" value=@ViewBag.deaths_json />
        <svg id="home-stats-svg" viewBox="0 0 100 100"></svg>
</div>

1 Ответ

0 голосов
/ 11 мая 2020

Поскольку выражение стрелочной функции не поддерживает браузер IE, мы могли бы использовать babel js .io для преобразования этой функции в формат ES5.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...