2016-07-15 2 views
1

Так что я пытаюсь отобразить 3 графика в одном и том же div, переключая кнопки, которые показывают/скрывают другие divs соответственно. Я установил 2 других графика наjquery show() не отображается правильно для диаграмм высоких диаграмм

style= "display: none" 

Для обеспечения отображения только одного графика при загрузке. Это, как вид по умолчанию выглядит следующим образом:

enter image description here

Вид по умолчанию день на кнопку день. Однако, когда я нажимаю на другие 2 кнопки, ширина графика увеличивается, и она отображается так.

enter image description here

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

Фрагмент кода для графа:

<button onclick="showDay('tasks')">Day on Day</button> 
<button onclick="showWeek('tasks')">Week on Week</button> 
<button onclick="showMonth('tasks')">Month on Month</button> 
<div class="portlet-body"> 
    <div id="tasks"></div> 
    <div id="tasksWeek" style="display: none"></div> 
    <div id="tasksMonth" style="display: none"></div> 
</div> 

<script> 
new Highcharts.StockChart({{masterDic['tasks']|safe}}); 
new Highcharts.StockChart({{masterDic['tasksWeek']|safe}}); 
new Highcharts.StockChart({{masterDic['tasksMonth']|safe}}); 
</script> 

фрагмент коды для вызова (хак сейчас)

<script> 
    function showDay(id) { 
     var idDay = "#"+id; 
     var idWeek = "#"+id+"Week"; 
     var idMonth = "#"+id + "Month"; 
     $(idWeek).hide(10); 
     $(idMonth).hide(10); 
     $(idDay).show(10); 
    } 
    function showWeek(id) { 
     var idDay = "#"+id; 
     var idWeek = "#"+id+"Week"; 
     var idMonth = "#"+id + "Month"; 
     $(idMonth).hide(10); 
     $(idDay).hide(10); 
     $(idWeek).show(10); 
    } 
    function showMonth(id) { 
     var idDay = "#"+id; 
     var idWeek = "#"+id+"Week"; 
     var idMonth = "#"+id + "Month"; 
     $(idDay).hide(10); 
     $(idWeek).hide(10); 
     $(idMonth).show(10); 
    } 
</script> 

Кто-нибудь есть какие-либо идеи о том, как это исправить? Большое спасибо! :)

EDIT:

CSS для портлета тела (весь след при использовании инспектировать элемента):

https://jsfiddle.net/ovnrpnb5/

+0

Пожалуйста, предоставьте CSS для 'портлета-body' и три диаграммы. – Eddi

+0

Эй, Эйдди, спасибо за ваш ответ! Я не могу показать вам css для трех диаграмм, потому что im генерирует их, используя библиотеку pandas-highcharts (так что нет css, кроме стандартного highcharts css с темой dark-unica), но я обновил css для тела портлета – Wboy

+0

О, я полностью пропустил эту часть, что вы используете холст для диаграмм, но это, конечно, имеет смысл. Я могу напомнить о ситуации, когда была аналогичная проблема с графиками (с использованием другой библиотеки). Проблема возникла, когда контейнер диаграммы был изначально скрыт (с помощью 'display: none'), затем была создана диаграмма, и через некоторое время контейнер был показан снова, но график был неуместен.Это было связано с первоначально скрытым контейнером диаграммы, который использовался для расчета высоты/ширины и положения диаграммы. Может быть, здесь что-то похожее. – Eddi

ответ

0

Фигурные его если кто-то заинтересован. Tldr: call reflow() на диаграмме после показа.

Я использовал hide() и show() вместо вкладок в соответствии с комментарием @Grzegorz Blachliński, поэтому данное решение не работало.

Я нашел эту ссылку, который показал вам, как получить доступ к элементу в пределах вашего HTML http://ahumbleopinion.com/highcharts-tips-accessing-chart-object-from-container-id/

Я использовал Highcharts CDN, который, по-видимому Isnt 3.0.1, поэтому метод не был JQuery работает. Таким образом, я сделал следующую функцию и назвал его после каждого шоу()

// HACK TO GET IT TO DISPLAY PROPERLY 
function callReflow(id){ 
    var index = $(id).data('highchartsChart'); 
    var chart = Highcharts.charts[index]; 
    chart.reflow(); 
} 

работал как шарм :)

0
setTimeout(function(){ 
    $(window).resize(); 
}) 

Зов это после того, как шоу()

+0

Эй, спасибо за ваш ответ! :) Я назвал $ (window) .resize(); в конце шоу(), но не было никакой разницы. Я поместил фрагмент кода в свой ответ для справки – Wboy

+0

попытался увеличить время setTimeout, он должен срабатывать после построения графика – Abcd

+0

Здравствуйте, еще раз, он все еще не работает. Я делаю это неправильно? Можете ли вы привести пример с моим фрагментом кода выше? :) – Wboy

Смежные вопросы