2015-08-25 5 views
1

Мне действительно нужна помощь для этой вещи, над которой я работаю. В основном у меня есть 4 диаграммы, создаваемые chartjs. Я сделал 4 кнопки, которые просто показывают или скрывают желаемый DIV. Я почти уверен, что это работает на стороне jQuery, но я не настолько разбираюсь в том, что происходит здесь на стороне Chart.js.Chart.js - Переключить видимость диаграмм

Это демонстрационный https://jsfiddle.net/ttum6ppu/

<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/1.0.2/Chart.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<body> 
 

 
\t \t \t <p> 
 
\t \t \t \t <button type="button" class="btn btn-default btn-xs stanza_button" id="stanza" style="display:none;">Per stanza</button> 
 
\t \t \t \t <button type="button" class="btn btn-primary btn-xs stanza_selected" id="stanza"><i class="fa fa-eye"></i> Per stanza</button> 
 
\t \t \t \t <button type="button" class="btn btn-default btn-xs settimanale_button" id="settimanale">Andamento settimanale</button> 
 
\t \t \t \t <button type="button" class="btn btn-primary btn-xs settimanale_selected" id="settimanale" style="display:none;"><i class="fa fa-eye"></i> Andamento settimanale</button> 
 
\t \t \t \t <button type="button" class="btn btn-default btn-xs mensile_button" id="mensile">Andamento mensile</button> 
 
\t \t \t \t <button type="button" class="btn btn-primary btn-xs mensile_selected" id="mensile" style="display:none;"><i class="fa fa-eye"></i> Andamento mensile</button> 
 
\t \t \t \t <button type="button" class="btn btn-default btn-xs annuo_button" id="annuo">Andamento annuo</button> 
 
\t \t \t \t <button type="button" class="btn btn-primary btn-xs annuo_selected" id="annuo" style="display:none;"><i class="fa fa-eye"></i> Andamento annuo</button> 
 
\t \t \t </p> \t 
 

 
<script> 
 
$(document).ready(function(){ 
 
    $("#stanza").click(function(){ 
 
     $(".stanza, .stanza_selected, .settimanale_button, .mensile_button, .annuo_button").show(); 
 
\t \t \t \t $(".settimanale, .mensile, .annuo, .stanza_button, .settimanale_selected, .mensile_selected, .annuo_selected").hide(); 
 
    }); 
 

 
    \t \t $("#settimanale").click(function(){ 
 
     $(".settimanale, .settimanale_selected, .stanza_button, .mensile_button, .annuo_button").show(); 
 
\t \t \t \t $(".stanza, .mensile, .annuo, .stanza_selected, .settimanale_button, .mensile_selected, .annuo_selected").hide(); 
 
    }); 
 

 
    \t \t $("#mensile").click(function(){ 
 
     $(".mensile, .mensile_selected, .stanza_button, .settimanale_button, .annuo_button").show(); 
 
\t \t \t \t $(".stanza, .settimanale, .annuo, .stanza_selected, .settimanale_selected, .mensile_button, .annuo_selected").hide(); 
 
    }); 
 

 
    \t \t $("#annuo").click(function(){ 
 
     $(".annuo, .annuo_selected, .stanza_button, .settimanale_button, .mensile_button").show(); 
 
\t \t \t \t $(".stanza, .settimanale, .mensile, .stanza_selected, .settimanale_selected, .mensile_selected, .annuo_button").hide(); 
 
    }); 
 
}); 
 
</script> 
 
\t \t <div style="width: 50%"> 
 
\t \t \t \t \t <div style="height:70%;" class="stanza"> 
 
\t \t \t \t <canvas id="canvas" height="100px;"></canvas> 
 
\t \t \t </div> 
 
\t \t \t <div style="height:70%; display: none;" class="settimanale"> 
 
\t \t \t \t <canvas id="canvas2" height="100px;"></canvas> 
 
\t \t \t </div> 
 
\t \t \t <div style="height:70%; display: none;" class="mensile"> 
 
\t \t \t \t <canvas id="canvas3" height="100px;"></canvas> 
 
\t \t \t </div> 
 
\t \t \t <div style="height:70%; display: none;" class="annuo"> 
 
\t \t \t \t <canvas id="canvas4" height="100px;"></canvas> 
 
\t \t \t </div> 
 
\t \t </div> 
 

 

 
\t <script> 
 
\t var randomScalingFactor = function(){ return Math.round(Math.random()*100)}; 
 

 
\t var barChartData = { 
 
\t \t labels : ["January","February","March","April","May","June","July"], 
 
\t \t datasets : [ 
 
\t \t \t { 
 
\t \t \t \t fillColor : "rgba(220,220,220,0.5)", 
 
\t \t \t \t strokeColor : "rgba(220,220,220,0.8)", 
 
\t \t \t \t highlightFill: "rgba(220,220,220,0.75)", 
 
\t \t \t \t highlightStroke: "rgba(220,220,220,1)", 
 
\t \t \t \t data : [randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor()] 
 
\t \t \t }, 
 
\t \t \t { 
 
\t \t \t \t fillColor : "rgba(151,187,205,0.5)", 
 
\t \t \t \t strokeColor : "rgba(151,187,205,0.8)", 
 
\t \t \t \t highlightFill : "rgba(151,187,205,0.75)", 
 
\t \t \t \t highlightStroke : "rgba(151,187,205,1)", 
 
\t \t \t \t data : [randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor()] 
 
\t \t \t } 
 
\t \t ] 
 

 
\t } 
 
\t window.onload = function(){ 
 
\t \t var ctx = document.getElementById("canvas").getContext("2d"); 
 
\t \t window.myBar = new Chart(ctx).Bar(barChartData, { 
 
\t \t \t responsive : true 
 
\t \t }); 
 

 
var ctx = document.getElementById("canvas2").getContext("2d"); 
 
\t \t window.myBar = new Chart(ctx).Bar(barChartData, { 
 
\t \t \t responsive : true 
 
\t \t }); 
 
\t \t var ctx = document.getElementById("canvas3").getContext("2d"); 
 
\t \t window.myBar = new Chart(ctx).Bar(barChartData, { 
 
\t \t \t responsive : true 
 
\t \t }); 
 

 
var ctx = document.getElementById("canvas4").getContext("2d"); 
 
\t \t window.myBar = new Chart(ctx).Bar(barChartData, { 
 
\t \t \t responsive : true 
 
\t \t }); 
 
\t } 
 

 
\t </script> 
 
\t </body>

Первая диаграмма отображается правильно, но при нажатии на вторую кнопку она ничего не показывает. Заранее спасибо

ответ

2

На мой взгляд, лучшим решением является изменение DOM, чтобы заменить элемент холста, так что вы можете перерисовать его с новыми данными:

var canvas_html = '<canvas id="canvas" height="100px;"></canvas>'; 
var drawChart = function(data) { 
    // reinit canvas 
    $('#canvas_container').html(canvas_html); 

    // redraw chart 
    var ctx = document.getElementById("canvas").getContext("2d"); 
     window.myBar = new Chart(ctx).Bar(data, { 
      responsive : true 
    }); 
}; 

Я сделал update вашей скрипки, чтобы вы могли видеть результат.

1

Это неудобно, полагайте, что это связано с тем, что вы используете Chart.js, который создает диаграммы с использованием iframe, с которыми никогда не бывает весело работать. Не заставляя перезагружать страницу, я не думаю, что вы сможете это сделать. Холст рисуется на высоте и ширине 0px на скрытых диаграммах, поэтому просто изменение их divs-дисплеев родителей при использовании jQuery для блокировки не собирается сокращать горчицу.

I've updated your fiddle, так что нажатие каждой кнопки показывает каждый график отдельно, но единственное, что я не смог исправить, - это скрыть последние три диаграммы на загрузке страницы. Надеюсь, это то, с чем вы можете работать.

Я удалил display: none из чартов

+1

Уже пробовал ваше решение, но вы знаете .... это не хорошо ... Я собираюсь попросить на странице GitHub этого плагина. Спасибо –

+0

np, я пробовал делать что-то подобное с Highcharts и помню, что это очень сложно, возможно, вы могли бы просто скрыть другие диаграммы, используя абсолютное позиционирование, z-index и большой левый%, как и левый: 1000%. Просто создайте класс, который называется hidden, со всеми этими стилями и добавьте его в три диаграммы, которые вы хотите скрыть, удалите их из каждого, когда вы хотите показать их – Pixelomo

0

У меня была такая же проблема и она была решена, посмотрев на видимость контейнера div, если div - видимая диаграмма рендеринга, в противном случае ничего не делать. поэтому включить функцию вызова вкладки вкладки для рендеринга диаграммы, к тому времени div должен быть виден. здесь пример кода,

if ($(".canvas-holder2").is(":visible")) { 

    window['myDoughnut'] = new Chart($("#chart-area")[0] 
      .getContext("2d")) 
      .Doughnut(data, { 

       responsive: true, 
       animateScale: true 
      }); 

       window['myDoughnut'].update(); 
} 
Смежные вопросы