Веб-страница, которая позволяет вам выбрать и запустить JS-скрипт через выпадающий список - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть рабочая веб-страница, на которой отображается график, операторы определения которого хранятся в отдельном сценарии JS.График отображается с использованием D3 и Graphviz, хотя я думаю, что моя проблема заключается только в JavaScript (в котором я новичок).

Это источник веб-страницы:

<!DOCTYPE html>
<meta charset="utf-8">

<body>

<script src="https://d3js.org/d3.v4.min.js"></script>
<script src="https://unpkg.com/viz.js@1.8.0/viz.js" type="javascript/worker"></script>
<script src="https://unpkg.com/d3-graphviz@1.3.1/build/d3-graphviz.min.js"></script>

<script type="text/javascript" src="Graph_Test1.js"></script>

<div id="graph" style="text-align: center;">
</div>
</body>
<script>

var dotIndex = 0;
var graphviz = d3.select("#graph").graphviz()
    .transition(function () {
        return d3.transition("main")
            .ease(d3.easeLinear)
            .delay(500)
            .duration(1500);
    })
    .logEvents(true)
    .on("initEnd", render);

function render() {
    var dotLines = dots[dotIndex];
    var dot = dotLines.join('');
    graphviz
        .renderDot(dot)
        .tweenShapes(false)
        .tweenPaths(false)
        .on("end", function () {
            dotIndex = (dotIndex + 1) % dots.length;
            render();
        });
}

var dots = [ gvFile ];

</script>

Этоисточник для Graph_test1.js:

gvFile = [
'digraph Test1 {',

' graph [bgcolor="dimgrey",',
'                    fontcolor="black",',
'                    color="white"];',

'"Test 1 Node 1" -> "Test 1 Node 2"',
'"Test 1 Node 2" -> "Test 1 Node 3"',
'}'
];

И это источник для другого тестового графика Graph_test2.js:

gvFile = [
'digraph Test2 {',

' graph [bgcolor="lightblue",',
'                    fontcolor="white",',
'                    color="white"];',

'"Test 2 Node 1" -> "Test 2 Node 2"',
'"Test 2 Node 2" -> "Test 2 Node 3"',
'"Test 2 Node 2" -> "Test 2 Node 4"',
'}'
];

Вопрос: Я могу выбратькакой график визуализировать, изменив тег, который задает Graph_Test1.js, или создайте отдельную страницу для каждого графика, но это неуклюже.Я хотел бы иметь раскрывающийся список, в котором перечислены все возможные графики, а затем отображается выбранный мной график.

Я попытался ответить на этот вопрос сам, и вот моя (очень неуклюжая) попытка:

<!DOCTYPE html>
<meta charset="utf-8">

<body>

        <select id="graph-select">
            <option selected value="base">Please Select</option>
            <option value="Graph_Test1.js">Test1</option>
            <option value="Graph_Test2.js">Test2</option>
            <option value="Render">Render</option>
        </select>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script src="https://d3js.org/d3.v4.min.js"></script>
<script src="https://unpkg.com/viz.js@1.8.0/viz.js" type="javascript/worker"></script>
<script src="https://unpkg.com/d3-graphviz@1.3.1/build/d3-graphviz.min.js"></script>
<!--script type="text/javascript" src="Falcon_Graph.js"></script-->

<div id="graph" style="text-align: center;">
</div>
</body>
<script>

var dots;
var dotIndex = 0;
var gvFile;
var graphviz = d3.select("#graph").graphviz();
$(function() {
    $("#graph-select").change(function() {
                                            var selection = $(this).val();
                                            console.log(selection);
                                            $.getScript(selection);
                                            if (selection == 'Render') {
                                                render
                                            } else {
                                                console.log(gvFile);
                                                dots = [ gvFile ];      
                                                graphviz = d3.select("#graph").graphviz()
                                                    .transition(function() {
                                                                            return d3.transition("main")
                                                                            .ease(d3.easeLinear)
                                                                            .delay(500)
                                                                            .duration(1500);
                                                                            }
                                                                )
                                                    .logEvents(true)
                                                    .on("initEnd", render);
                                            }
                                        }
                                )
            }
);

function render() {
    var dotLines = dots[dotIndex];
    var dot = dotLines.join('');
    graphviz
        .renderDot(dot)
        .tweenShapes(false)
        .tweenPaths(false)
        .on("end", function () {
            dotIndex = (dotIndex + 1) % dots.length;
            render();
        });
};

</script>

так что мой код кажется очень удачным или пропущенным - его можно сделать для рендеринга обоих графиков, но не согласованно - иногда я выбираю один график из раскрывающегося списка, и он отображает другой.Я думаю, проблема в том, что я не знаю, как заставить страницу ждать от функции getScript для запуска и заполнения переменной gvFile, прежде чем пытаться отобразить график, поэтому я попытался добавить дискретный 'рендер'вариант раскрывающегося списка, чтобы заиметь то, что было в данный момент в gvFile.

В идеале я бы также хотел, чтобы в раскрывающемся списке отображался список файлов на сервере (например, в "Графиках /"), но я не мог найти простых примеров этого).

Примечание. Определения графиков хранятся в виде js-файлов, которые заполняют переменную, поскольку это казалось намного проще, чем «идеальное» решение, которое заключалось бы в сохранении графиков в их собственном формате:

 digraph Test1 { 

  graph [bgcolor="dimgrey", 
                     fontcolor="black", 
                     color="white"]; 

 "Test 1 Node 1" -> "Test 1 Node 2" 
 "Test 1 Node 2" -> "Test 1 Node 3" 
 }

, а затем используйте JavaScript для чтения этих определений и заполнения массива dots.

Я не добавил 'D3' или 'GraphViz' к тегам, так как не думаю, что они действительно актуальнык моей проблеме.

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