Код D3.js в слайде Reveal.js

Я пытаюсь заставить D3.js работать с слайдами Reveal.js, но я не могу заставить его запускать даже самый базовый фрагмент:

<section>
    <h2>Title</h2>
    <div id="placeholder"></div>
    <script type="text/javascript">
        d3.select("#placeholder").append("p").text("TEST");
    </script>
</section>

Не отображает слово "ТЕСТ". Что я делаю не так?

Ответ 1

Ладно, пойдем.

Я сделал базовый пример с Reveal.js & D3.js, и он работает хорошо.

  • Есть два слайда
  • Первый слайд содержит гистограмму
  • Второй слайд отображает диаграмму Bubble, беря данные из входного файла json

Ваш код работает нормально, если он размещен вне секции внизу. Я поместил весь код D3.js в конце html-страницы перед телом ближе.

Структура папок показана ниже (в снимке)

enter image description here

Я разместил JS внутри HTML (чтобы было легче читать/понимать)

<!doctype html>
<html lang="en">
<head>
        <meta charset="utf-8">
        <title>Reveal.js with D3 JS</title>
        <link rel="stylesheet" href="css/reveal.min.css">
        <link rel="stylesheet" href="css/theme/default.css" id="theme">
        <style>
            .chart rect {
              fill: #63b6db;
            }

            .chart text {
              fill: white;
              font: 10px sans-serif;
              text-anchor: end;
            }

            text {
              font: 10px sans-serif;
            }
        </style>
</head>
<body>
        <div class="reveal">
            <div class="slides">
                <section>
                    <h2>Barebones Presentation</h2>
                    <p>This example contains the bare minimum includes and markup required to run a reveal.js presentation.</p>
                    <svg class="chart"></svg>
                </section>

                <section id="sect2">
                    <h2>No Theme</h2>
                    <p>There no theme included, so it will fall back on browser defaults.</p>
                    <svg class="bubleCharts"></svg>
                </section>
            </div>
        </div>

        <script src="js/reveal.min.js"></script>
        <script>
            Reveal.initialize();
        </script>

        <script src="js/d3.min.js"></script>
        <script type="text/javascript">
            //------ code to show D3 Bar Chart on First Slide-------
            var data = [44, 28, 15, 16, 23, 5];
            var width = 420,
                barHeight = 20;

            var x = d3.scale.linear()
                .domain([0, d3.max(data)])
                .range([0, width]);

            var chart = d3.select(".chart")
                .attr("width", width)
                .attr("height", barHeight * data.length);

            var bar = chart.selectAll("g")
                .data(data)
              .enter().append("g")
                .attr("transform", function(d, i) { return "translate(0," + i * barHeight + ")"; });

            bar.append("rect")
                .attr("width", x)
                .attr("height", barHeight - 1);

            bar.append("text")
                .attr("x", function(d) { return x(d) - 3; })
                .attr("y", barHeight / 2)
                .attr("dy", ".35em")
                .text(function(d) { return d; });


            //---Code below will show Bubble Charts on the secon Slide -------
            var diameter = 560,
                format = d3.format(",d"),
                color = d3.scale.category20c();

            var bubble = d3.layout.pack()
                .sort(null)
                .size([diameter, diameter])
                .padding(1.5);

            var svg = d3.select(".bubleCharts")
                .attr("width", diameter)
                .attr("height", diameter)
                .attr("class", "bubble");

            d3.json("flare.json", function(error, root) {
              var node = svg.selectAll(".node")
                  .data(bubble.nodes(classes(root))
                  .filter(function(d) { return !d.children; }))
                .enter().append("g")
                  .attr("class", "node")
                  .attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; });

              node.append("title")
                  .text(function(d) { return d.className + ": " + format(d.value); });

              node.append("circle")
                  .attr("r", function(d) { return d.r; })
                  .style("fill", function(d) { return color(d.packageName); });

              node.append("text")
                  .attr("dy", ".3em")
                  .style("text-anchor", "middle")
                  .text(function(d) { return d.className.substring(0, d.r / 3); });
            });

            // Returns a flattened hierarchy containing all leaf nodes under the root.
            function classes(root) {
              var classes = [];
              function recurse(name, node) {
                if (node.children) node.children.forEach(function(child) { recurse(node.name, child); });
                else classes.push({packageName: name, className: node.name, value: node.size});
              }
              recurse(null, root);
              return {children: classes};
            }

            d3.select(self.frameElement).style("height", diameter + "px");
        </script>
</body>
</html>

Выходные/Результаты

Слайд 1 enter image description here

Слайд 2 enter image description here

Загрузить полный код https://github.com/aahad/D3.js/tree/master/Reveal JS с D3 JS

Чтобы узнать больше о том, как работает диаграмма Bar Chart или Bubble Chart, выполните следующие действия:

Ответ 2

Оба существующих ответа хороши, но я хотел бы указать на третий подход, который работал для меня и имел некоторые преимущества.

В Reveal.js есть система событий, и она также работает с состояниями данных для каждого слайда.

Это означает, что вы можете иметь отдельный блок javascript для каждого слайда и выполнять его только при загрузке этого слайда. Это позволяет выполнять анимацию на основе D3 при загрузке слайда и имеет дополнительное преимущество в том, чтобы поместить код слайда ближе к тексту/разметке.

Например, вы можете установить слайд следующим образом. Обратите внимание на атрибут data-state:

<section data-state="myslide1">
    <h2>Blah Blah</h2>
    <div id="slide1d3container"></div>
</section>

И затем у вас есть связанный блок сценария:

<script type="text/javascript">
Reveal.addEventListener( 'myslide1', function() {

    var svg = d3.select("#slide1d3container").append("svg")
    // do more d3 stuff

} );
</script>

Вот пример презентации, которая использует этот метод: http://explunit.github.io/d3_cposc_2014.html

Ответ 3

Я узнал сам. Конечно, я не могу сопоставлять с идентификаторами, которые еще не загружены: он работает, если я положил код javascript d3 после блока сценария Reveal.initialize в конце файла index.html.