Google диаграммы - данные из локального файла JSON - пользовательские подсказки - PullRequest
0 голосов
/ 25 января 2019

Я использую диаграммы Google для создания диаграмм доступности каналов dvb-c.Данные для диаграмм красные из локального файла JSON.Графики работают очень хорошо, но я хотел бы добавить одну функцию, но мне нужно помочь с этим.

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

Вот мой HTML-код:

   <!DOCTYPE html>
   <html>
   <head>
       <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
       <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
   </head>

    <body>
        <div id="chart" style="width:3000px; height:600px;"></div> 
    </body>

    <script>
        // Visualization API with the 'corechart' package.
        google.charts.load('visualization', { packages: ['corechart'] });
        google.charts.setOnLoadCallback(drawLineChart);

        function drawLineChart() {
            $.ajax({
                url: "./avail.json",
                dataType: "json",
                type: "GET",
                contentType: "application/json; charset=utf-8",
                success: function (data) {
                var channels = [['Channel', 'HKI (%)', 'LTI (%)']];    // Define an array and assign columns for the chart.

                // Loop through each data and populate the array.
                $.each(data, function (index, value) {
                    channels.push([value.Channel, value.HKI, value.LTI]);
                });

                // Set chart Options.
                var options = {
                    title: 'DVB-C Availability (HKI & LTI)',
                series: {
                    0: { color: '#ff3385', lineWidth: 5, pointSize: 5 },
                        1: { color: '#000000', lineWidth: 1, pointSize: 3},
                },
                vAxis: { "title": "Availability (%)", maxValue: 100 },
                hAxis : { "title": "Channels", showTextEvery:1, textStyle : {fontSize: 8, bold:'true' }, slantedText:true, slantedTextAngle:45 },
                chartArea:{left:70,top:50,right:40,width:"90%",height:"70%"},
                tooltip: {isHtml: true, trigger: 'both'},
                    legend: { position: 'top', textStyle: { color: '#555', fontSize: 14} } 
                };




                // Create DataTable and add the array to it.
                var figures = google.visualization.arrayToDataTable(channels)

                // Define the chart type (LineChart) and the container (a DIV in our case).
                var chart = new google.visualization.LineChart(document.getElementById('chart'));
                chart.draw(figures, options);      // Draw the chart with Options.
                },
                error: function (XMLHttpRequest, textStatus, errorThrown) {
                     alert('Got an Error');
                }
            });
    }
</script>
</html>

Вот небольшой фрагмент моего текущего файла JSON:

[
 { "Channel": "MTV Rocks", "HKI": 99.104700, "LTI": 98.760400 },
 { "Channel": "MTV3 HD", "HKI": 99.724600, "LTI": 99.724600 },
 { "Channel": "MTV3", "HKI": 100.000000, "LTI": 100.000000 },
]

Должен ли я добавить что-то подобное в json?

[
{ "Channel": "MTV Rocks", "HKI": 99.104700, <object data="./hki1.html"></object> "LTI": 98.760400, <object data="./lti1.html"></object> },
{ "Channel": "MTV3 HD", "HKI": 99.724600, <object data="./hki1.html"></object>"LTI": 99.724600, <object data="./lti1.html"></object> },
{ "Channel": "MTV3", "HKI": 100.000000, object data="./hki1.html"></object>"LTI": 100.000000, object data="./lti1.html"></object> },
]

Если это правильный способ изменить json, я понятия не имею, как изменить html-код, чтобы это работало.

Может быть, кто-то может помочь мне с этим?

1 Ответ

0 голосов
/ 25 января 2019

во-первых, 'visualization' не является допустимым номером версии для диаграмм Google.
похоже, это осталось от старого кода загрузчика библиотеки.
используйте 'current' вместо ...

google.charts.load('current', { packages: ['corechart'] });

затем вам нужно скопировать html из файла в json,
вместо того, чтобы пытаться ссылаться на внешний файл.

всплывающая подсказка ожидает только HTML-фрагмент, а не полноценный файл.

Чтобы добавить пользовательскую подсказку, сначала нужно добавить столбец для подсказки.
это должен быть объект, как показано ниже ...

{type: 'string', role: 'tooltip', p: {html: true}}

если вы хотите всплывающую подсказку для "HKI" & "LTI",
вам нужно добавить столбец всплывающей подсказки после заголовка каждого столбца ...

var channels = [['Channel', 'HKI (%)', {type: 'string', role: 'tooltip', p: {html: true}}, 'LTI (%)', {type: 'string', role: 'tooltip', p: {html: true}}]];

включить HTML при загрузке строк ...

  $.each(data, function (index, value) {
    channels.push([
      value.Channel,
      value.HKI,
      '<div>custom html goes here</div>',
      value.LTI,
      '<div>custom html goes here</div>'
    ]);
  });

см. Следующий рабочий фрагмент для примера ...

google.charts.load('current', { packages: ['corechart'] });
google.charts.setOnLoadCallback(drawLineChart);

function drawLineChart() {
  var data = [
   { "Channel": "MTV Rocks", "HKI": 99.104700, "LTI": 98.760400 },
   { "Channel": "MTV3 HD", "HKI": 99.724600, "LTI": 99.724600 },
   { "Channel": "MTV3", "HKI": 100.000000, "LTI": 100.000000 },
  ];

  var channels = [['Channel', 'HKI (%)', {type: 'string', role: 'tooltip', p: {html: true}}, 'LTI (%)', {type: 'string', role: 'tooltip', p: {html: true}}]];

  // Loop through each data and populate the array.
  $.each(data, function (index, value) {
    channels.push([
      value.Channel,
      value.HKI,
      '<div class="ggl-tooltip"><div>' + value.Channel + '</div><div>' + value.HKI + '</div></div>',
      value.LTI,
      '<div class="ggl-tooltip"><div>' + value.Channel + '</div><div>' + value.LTI + '</div></div>'
    ]);
  });

  // Set chart Options.
  var options = {
    title: 'DVB-C Availability (HKI & LTI)',
    series: {
      0: {color: '#ff3385', lineWidth: 5, pointSize: 5},
      1: {color: '#000000', lineWidth: 1, pointSize: 3},
    },
    vAxis: {title: "Availability (%)", maxValue: 100},
    hAxis : {title: "Channels", showTextEvery:1, textStyle : {fontSize: 8, bold:'true'}, slantedText:true, slantedTextAngle:45},
    chartArea:{left: 70, top:50, right:40, width:"90%", height:"70%"},
    tooltip: {isHtml: true, trigger: 'both'},
    legend: {position: 'top', textStyle: { color: '#555', fontSize: 14}}
  };

  // Create DataTable and add the array to it.
  var figures = google.visualization.arrayToDataTable(channels)

  // Define the chart type (LineChart) and the container (a DIV in our case).
  var chart = new google.visualization.LineChart(document.getElementById('chart'));
  chart.draw(figures, options);      // Draw the chart with Options.
}
.ggl-tooltip {
  border: 1px solid #E0E0E0;
  font-family: Arial, Helvetica;
  font-size: 10pt;
  padding: 12px 12px 12px 12px;
}
.ggl-tooltip div {
  padding-top: 6px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://www.gstatic.com/charts/loader.js"></script>
<div id="chart"></div>

РЕДАКТИРОВАТЬ

, если вы хотите отобразить внешний html-файл в качестве всплывающей подсказки,
возможно, имеет смысл скрыть стандартную подсказку,
и отобразить внешний файл 'onmouseover'

см. Следующий рабочий фрагмент для примера ...

google.charts.load('current', { packages: ['corechart'] });
google.charts.setOnLoadCallback(drawLineChart);

function drawLineChart() {
  var data = [
   { "Channel": "MTV Rocks", "HKI": 99.104700, "LTI": 98.760400 },
   { "Channel": "MTV3 HD", "HKI": 99.724600, "LTI": 99.724600 },
   { "Channel": "MTV3", "HKI": 100.000000, "LTI": 100.000000 },
  ];

  var channels = [['Channel', 'HKI (%)', 'LTI (%)']];

  // Loop through each data and populate the array.
  $.each(data, function (index, value) {
    channels.push([
      value.Channel,
      value.HKI,
      value.LTI
    ]);
  });

  // Set chart Options.
  var options = {
    title: 'DVB-C Availability (HKI & LTI)',
    series: {
      0: {color: '#ff3385', lineWidth: 5, pointSize: 5},
      1: {color: '#000000', lineWidth: 1, pointSize: 3},
    },
    vAxis: {title: "Availability (%)", maxValue: 100},
    hAxis : {title: "Channels", showTextEvery:1, textStyle : {fontSize: 8, bold:'true'}, slantedText:true, slantedTextAngle:45},
    chartArea:{left: 70, top:50, right:40, width:"90%", height:"70%"},
    tooltip: {trigger: 'none'},
    legend: {position: 'top', textStyle: { color: '#555', fontSize: 14}}
  };

  // Create DataTable and add the array to it.
  var figures = google.visualization.arrayToDataTable(channels)

  // Define the chart type (LineChart) and the container (a DIV in our case).
  var chart = new google.visualization.LineChart(document.getElementById('chart'));

  var frame = document.getElementById('tooltip');

  // hide external html on mouse out
  google.visualization.events.addListener(chart, 'onmouseout', function () {
    frame.className = 'hidden';
  });

  // display external html on mouse over
  google.visualization.events.addListener(chart, 'onmouseover', function (props) {
    if (props.row === null) {
      return;
    }

    var chartLayout = chart.getChartLayoutInterface();
    var bounds = chartLayout.getBoundingBox('point#' + (props.column - 1) + '#' + props.row);
    frame.style.left = bounds.left + 'px';
    frame.style.top = bounds.top + 'px';

    // replace this
    frame.src = 'https://www.december.com/html/demo/hello.html';

    // with this
    //frame.src = '../' + figures.getColumnLabel(props.column) + (props.row + 1) + '.html';

    frame.className = 'tooltip';
  });

  chart.draw(figures, options);
}
.hidden {
  display: none;
  visibility: hidden;
}

.tooltip {
  background-color: #ffffff;
  position: absolute;
  height: 200px;
  width: 400px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://www.gstatic.com/charts/loader.js"></script>
<div id="chart"></div>
<iframe class="hidden" id="tooltip"></iframe>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...