2016-12-27 8 views
1

Ich möchte eine Funktion erstellen, die dynamisch alle sichtbaren Seriennamen in einer Highchart-Instanz an eine PHP-Funktion sendet. Zum Beispiel, in diesem Diagramm möchte ich dieses Array erhalten: [Salle, PR]. Wenn ich auf Internet klicke, wird die Serie sichtbar und ich möchte [Salle, Internet, PR] bekommen.Highcharts - Name der sichtbaren Serie dynamisch abrufen

Um dies zu tun, habe ich versucht, LegendItemClick-Ereignis zu verwenden und eine Funktion, die überprüfen, ob jede Serie sichtbar ist, um es zu einem Array hinzuzufügen, aber ich kann nicht herausfinden, wie die sichtbare Option zu verwenden.

Haben Sie eine Idee?

Ab jetzt habe ich nicht viel Code zu teilen:

plotOptions: { 
     series: { 
      events: { 
       legendItemClick: function(){ 

       } 
      } 
     } 
    } 

enter image description here

Antwort

3

Wenn Sie den Mauszeiger auf das Diagramm wie folgt beibehalten:

var ch = Highcharts.chart(_chart_data_); 

dann später Sie können auf die gesamte Diagrammstruktur zugreifen. Was Sie interessieren wird, ist das Reihen-Array.

ch.series[] 

Es enthält Array aller Ihrer Serie. Serien mit sichtbarem Attribut, das auf "true" gesetzt ist, werden derzeit angezeigt. So könnte es so etwas wie diese:

var ch = Highcharts.chart(... 

plotOptions: { 
     series: { 
      events: { 
       legendItemClick: function(){ 
        ch.series.forEach(function(sr){ 
         if(sr.visible){ 
          console.log(sr.name, "visible!"); 
         } 
        }); 
       } 
      } 
     } 
    } 

...); 

Allerdings gibt es einen Haken mit Ihrem Ansatz, dass auf tatsächliche Legende klicken, um Ihre aktuelle Aktion für die Legende ist noch nicht processed.so die Ausgabe sehen Sie das ist Ausgabe für den vorherigen Zustand, vor dem aktuellen Klick.

Also aus diesem Grund können Sie versuchen setTimeout zu verwenden Ihren Eintrag zu erhalten, nachdem das Ereignis angewendet wird:

  events: { 
      legendItemClick: function(){ 
       setTimeout(
        function(){ 
         ch.series.forEach(
          function(sr){ 
           if(sr.visible){ 
           console.log(sr.name, "visible!"); 
           } 
          } 
         ) 
        },20); 
       } 
      } 

die Sie interessieren und überprüfen Sie die Konsolenprotokoll: http://jsfiddle.net/op8142z0/

+0

Dank für Ihre Antwort danken. Ich habe das versucht, aber wenn ich zum ersten Mal auf einen Legendeneintrag klicke, werden keine Namen an die Konsole gesendet. Zum Beispiel, wenn ich nach der Initialisierung zum ersten Mal auf "Salle" klicke, sendet es nicht "Internet" und "PR", ich habe nichts in der Konsole. Wenn ich dann auf "Salle" klicke, um es sichtbar zu machen, habe ich nur "Salle" in der Konsole, wenn ich "Salle", "Internet", "PR" haben soll. Wenn ich zum ersten Mal auf "Internet" klicke, wird nur "Salle" gesendet. Und wenn ich ein zweites Mal klicke, sendet es nur "Salle" und "Internet", wo es mir "Salle", "Internet" und "PR" zeigen soll. –

+0

Kannst du einen Code für deinen Code machen? Es wäre einfacher, ein Problem zu erkennen. In meinem Beispiel (http://jsfiddle.net/op8142z0/) können Sie sehen, dass es funktioniert. –

+0

Ich habe es behoben. Es war weil ich Serien mit options.series.push gesetzt habe. Ich lege mich direkt in Optionen und es funktioniert jetzt. Vielen Dank für Ihre Hilfe! –

Verwandte Themen