2017-07-22 5 views
1

Ich habe Bootstrap3-Registerkarten RES und BUS erstellt. In jeder dieser beiden Registerkarten möchte ich zwei Google-Karten platzieren (Flächen- und Kreiswagen). Also innerhalb Bootstrab tab-pane Ich Bootstrap Zeile setzen und es in Spalten col-sm-9 (für größere AreaChart) und col-sm-3 (für kleinere PieChart).Positionieren von Google Charts innerhalb der Bootstrap-Registerkarten

Identischer Inhalt befindet sich sowohl in BUS- als auch RES-Tabs! Die Position auf der zweiten Registerkarte (RES) ist jedoch ruiniert. WARUM? Und wie man es repariert?

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> 
 
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> 
 
<script type="text/javascript" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> 
 
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script> 
 

 
    <div class="container"> 
 

 
     <div class="row text-center"> 
 

 
     <div class="col-sm-12"> 
 
      <div class="thumbnail"> 
 
      
 
      <h3>Title</h3> 
 

 
<hr> 
 

 
      <ul class="nav nav-tabs"> 
 
       <li class="active"><a data-toggle="tab" href="#BUS">Bus</a></li> 
 
       <li><a data-toggle="tab" href="#RES">Res</a></li> 
 
      </ul> 
 

 
      <div class="tab-content"> 
 
       <div id="BUS" class="tab-pane active"> 
 
       
 
       <div class="row"> 
 
        <h3>BUS title</h3> 
 
        <div class="col-sm-9"> 
 
        <div id="AreaB1"></div> 
 
        </div> 
 
        <div class="col-sm-3"> 
 
        <div id="PieB1"></div> 
 
        </div> 
 
       </div><!-- .row --> 
 

 
     <script type="text/javascript"> 
 

 
     function drawChartsB() 
 
     { 
 
      var view; 
 

 
      var AreaOpt = { 
 
      height: 200, 
 
      legend: { position: 'bottom', maxLines: 1 }, 
 
      }; 
 

 
      var PieOpt = { 
 
      height: 200, 
 
      legend: { position: 'bottom', maxLines: 1 } 
 
      }; 
 

 
      view = new google.visualization.DataView(google.visualization.arrayToDataTable([['X','A','B'],['2017M02',95,0],['2017M03',129,0],['2017M04',42,33]])); 
 
      view.setColumns([0,1,{sourceColumn:1,role:"annotation"},2,{sourceColumn:2,role:"annotation"}]); 
 
      (new google.visualization.AreaChart(document.getElementById('AreaB1'))).draw(view,AreaOpt); 
 

 
      view = new google.visualization.DataView(google.visualization.arrayToDataTable([['X','AB'],['A',42],['B',33]])); 
 
      (new google.visualization.PieChart(document.getElementById('PieB1'))).draw(view,PieOpt); 
 
     } 
 

 
     </script> 
 
    
 
       </div> 
 
       <div id="RES" class="tab-pane"> 
 

 
       <div class="row"> 
 
        <h3>RES title</h3> 
 
        <div class="col-sm-9"> 
 
        <div id="AreaR1"></div> 
 
        </div> 
 
        <div class="col-sm-3"> 
 
        <div id="PieR1"></div> 
 
        </div> 
 
       </div><!-- .row --> 
 
       
 
     <script type="text/javascript"> 
 

 
     function drawChartsR() 
 
     { 
 
      var view; 
 

 
      var AreaOpt = { 
 
      height: 200, 
 
      legend: { position: 'bottom', maxLines: 1 }, 
 
      }; 
 

 
      var PieOpt = { 
 
      height: 200, 
 
      legend: { position: 'bottom', maxLines: 1 } 
 
      }; 
 

 
      view = new google.visualization.DataView(google.visualization.arrayToDataTable([['X','A','B'],['2017M02',95,0],['2017M03',129,0],['2017M04',42,33]])); 
 
      view.setColumns([0,1,{sourceColumn:1,role:"annotation"},2,{sourceColumn:2,role:"annotation"}]); 
 
      (new google.visualization.AreaChart(document.getElementById('AreaR1'))).draw(view,AreaOpt); 
 

 
      view = new google.visualization.DataView(google.visualization.arrayToDataTable([['X','AB'],['A',42],['B',33]])); 
 
      (new google.visualization.PieChart(document.getElementById('PieR1'))).draw(view,PieOpt); 
 
     } 
 

 
     </script> 
 
     
 
       </div> 
 
      </div><!-- .tab-content --> 
 
    
 
      </div><!-- .thumbnail --> 
 
     </div><!-- .col --> 
 

 
     </div><!-- .row --> 
 
     
 
    </div><!-- .container --> 
 

 
    <script type="text/javascript"> 
 

 
     google.charts.load("current",{callback:drawChartsB,packages:["corechart"]}); 
 
     google.charts.load("current",{callback:drawChartsR,packages:["corechart"]}); 
 

 
    </script>

Externe JSFiddle: enter link description here

Antwort

0

Notwendigkeit zu warten, bis der Behälter vor dem Zeichnen Sie das Diagramm zu sehen ist,
oder müssen bestimmte Größeneinstellungen in den Diagrammoptionen festlegen ...

auch, empfehlen die load Anweisung nur einmal aufrufen ...

versuchen, das Setup ähnelt folgenden ...

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> 
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> 
<script type="text/javascript" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> 
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script> 

<div class="container"> 

    <div class="row text-center"> 

    <div class="col-sm-12"> 
     <div class="thumbnail"> 

     <h3>Title</h3> 

     <hr> 

     <ul class="nav nav-tabs"> 
      <li class="active"><a data-toggle="tab" href="#BUS">Bus</a></li> 
      <li><a data-toggle="tab" href="#RES">Res</a></li> 
     </ul> 

     <div class="tab-content"> 
      <div id="BUS" class="tab-pane active"> 

      <div class="row"> 
       <h3>BUS title</h3> 
       <div class="col-sm-9"> 
       <div id="AreaB1"></div> 
       </div> 
       <div class="col-sm-3"> 
       <div id="PieB1"></div> 
       </div> 
      </div><!-- .row --> 

    <script type="text/javascript"> 

    function drawChartsB() 
    { 
     var view; 

     var AreaOpt = { 
     height: 200, 
     legend: { position: 'bottom', maxLines: 1 }, 
     }; 

     var PieOpt = { 
     height: 200, 
     legend: { position: 'bottom', maxLines: 1 } 
     }; 

     view = new google.visualization.DataView(google.visualization.arrayToDataTable([['X','A','B'],['2017M02',95,0],['2017M03',129,0],['2017M04',42,33]])); 
     view.setColumns([0,1,{sourceColumn:1,role:"annotation"},2,{sourceColumn:2,role:"annotation"}]); 
     (new google.visualization.AreaChart(document.getElementById('AreaB1'))).draw(view,AreaOpt); 

     view = new google.visualization.DataView(google.visualization.arrayToDataTable([['X','AB'],['A',42],['B',33]])); 
     (new google.visualization.PieChart(document.getElementById('PieB1'))).draw(view,PieOpt); 
    } 

    </script> 

      </div> 
      <div id="RES" class="tab-pane"> 

      <div class="row"> 
       <h3>RES title</h3> 
       <div class="col-sm-9"> 
       <div id="AreaR1"></div> 
       </div> 
       <div class="col-sm-3"> 
       <div id="PieR1"></div> 
       </div> 
      </div><!-- .row --> 

    <script type="text/javascript"> 

    function drawChartsR() 
    { 
     var view; 

     var AreaOpt = { 
     height: 200, 
     legend: { position: 'bottom', maxLines: 1 }, 
     }; 

     var PieOpt = { 
     height: 200, 
     legend: { position: 'bottom', maxLines: 1 } 
     }; 

     view = new google.visualization.DataView(google.visualization.arrayToDataTable([['X','A','B'],['2017M02',95,0],['2017M03',129,0],['2017M04',42,33]])); 
     view.setColumns([0,1,{sourceColumn:1,role:"annotation"},2,{sourceColumn:2,role:"annotation"}]); 
     (new google.visualization.AreaChart(document.getElementById('AreaR1'))).draw(view,AreaOpt); 

     view = new google.visualization.DataView(google.visualization.arrayToDataTable([['X','AB'],['A',42],['B',33]])); 
     (new google.visualization.PieChart(document.getElementById('PieR1'))).draw(view,PieOpt); 
    } 

    </script> 

      </div> 
     </div><!-- .tab-content --> 

     </div><!-- .thumbnail --> 
    </div><!-- .col --> 

    </div><!-- .row --> 

</div><!-- .container --> 

<script type="text/javascript"> 

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

    $('a[data-toggle="tab"]').on('shown.bs.tab', function (e) { 
     switch ($(e.target).html()) { 
     case 'Bus': 
      drawChartsB(); 
      break; 

     case 'Res': 
      drawChartsR(); 
      break; 
     } 
    }); 

</script> 
+0

Thx für Mühe, aber nein, das nicht hilft. Meine reale Seite und Funktionalität ist komplexer als hier gezeigt. Ich verwende AJAX, um die Tab-Fenster asynchron mit mehr Graphen zu füllen (8 pro Tab). Hier ist nur Auszug und Ergebnis von AJAX zeigt die benötigten. AJAX funktioniert gut und es erfüllt die Fenster korrekt, Loader wird im Voraus geladen. Das ist alles in Ordnung. Der Punkt von meinem Q ist, dass der gleiche Inhalt auf einer Scheibe nicht die SAMO auf einer anderen Scheibe sieht !!! Bitte schauen Sie sich das Snippet oder den Code von JSFiddle an. – sbrbot

+0

Vielleicht verstehe ich dich nicht. Mein AJAX-Aufruf ruft die Daten aus der Datenbank ab, erstellt dynamisch ein Skript für Diagramme und sendet Inhalte mit gefüllten Skripten an meine Seite in Registerkarten. Nach erfolgreicher Antwort von AJAX startet Google Chart Loader mit Callback-Funktion, um meine Diagramme anzuzeigen. Nach dem Laden der Google-Komponente startet die Funktion zum Anzeigen des Diagramms. (Das ist die AJAX-Google-Chart-Verkettung). Von meinem Snippet kann man sehen, dass Charts gezeigt werden und Google API hat seinen eigenen Job gemacht. Das Problem liegt beim Layout dieser Diagramme in Registerkarten. – sbrbot

+0

Der Diagrammcontainer für Registerkarte _Res_ ist ausgeblendet, bis Sie darauf klicken. Wenn Sie ein Diagramm in einem ausgeblendeten Container zeichnen, wird das Layout durcheinander gebracht. Warten Sie, bis die Registerkarte angezeigt wird, bevor Sie das Diagramm zum ersten Mal zeichnen Größeneinstellungen zu verhindern - [hier ist ein anderes Beispiel] (https://stackoverflow.com/q/43401936/5090771) – WhiteHat