2013-07-11 4 views
17

ich nvd3.js bin mit und versuchen, ein Click-EreignisWie ein Click-Ereignis auf nvd3.js Graph hinzuzufügen

d3.selectAll(".nv-bar").on('click', function() {console.log("test");}); 

JSFiddle

hinzufügen Wie kann ich das tun?

+0

meine Antwort hat einen Fehler, so hatte es zu löschen, hätte nicht bemerkt, dass, sobald ich kann eine Antwort bekommen, oder jemand anderes wird vorher eine Antwort posten, tut mir leid. – shabeer90

Antwort

26

Ich stieß auf das gleiche Problem und war dabei, NVD3 wegen des Mangels an Dokumentation alle zusammen zu dumpen ... Was Sie tun müssen, ist eine Callback-Funktion addGraph() hinzufügen. Beachten Sie auch d3.selectAll() anstelle von d3.select().

Viel Glück.

nv.addGraph(function() { 
    var chart = nv.models.multiBarHorizontalChart() 
     .x(function(d) { return d.label }) 
     .y(function(d) { return d.value }) 
     .margin({top: 5, right: 5, bottom: 5, left: 5}) 
     .showValues(false) 
     .tooltips(true) 
     .showControls(false); 

    chart.yAxis 
     .tickFormat(d3.format('d')); 

    d3.select('#social-graph svg') 
     .datum([data]) 
     .transition().duration(500) 
     .call(chart); 

     nv.utils.windowResize(chart.update); 

     return chart; 
    },function(){ 
      d3.selectAll(".nv-bar").on('click', 
       function(){ 
        console.log("test"); 
      }); 
     }); 
+0

Danke Alex, es hat funktioniert! – Petran

+3

Leider hatte ich kein Glück, diesen Ansatz auf ein nv3d Liniendiagramm anzuwenden. Mein Ziel war es, die Daten des angeklickten Linienpunkts (x, y) zu erhalten, aber d3.selectAll ("nv-point-paths") auf ('click') gab mir die Daten des gesamten Diagramms statt des einzelnen Punktes . Ich hoffte, dies mit d3.selectAll ("nv-point-paths path") zu beheben ("click"), aber dieser Handler wurde nie ausgelöst. Irgendeine Idee? – fbuchinger

+0

Eigentlich, wenn Sie sich die Beispiele ansehen, werden Sie sehen, dass der beste Weg, um mit Ereignissen umzugehen, ist, was Wexman vorgeschlagen hat. –

2

Diese für mich gearbeitet: (. E.target Daten gibt die Datenattribute auf dieses Element befestigt ist, wie x, y)

$(document).on("click", "#chart svg", function(e) { 
    console.log (e); 
    console.log (e.target.__data__); 
    }); 
38

gerade herausgefunden, dass dies auch funktioniert (zumindest für Multibar Grafik):

chart.multibar.dispatch.on("elementClick", function(e) { 
    console.log(e); 
}); 

hatte ich an der Quelle in src/multibar.js suchen, um herauszufinden; da es da ist, denke ich, dass es so ist, wie es beabsichtigt war. Ich wiederhole jedoch, was Alex in seiner Antwort gesagt hat: Der Mangel an Dokumentation für NVD3 ist ein wirklich großer Nachteil. Welches ist traurig, weil die allgemeine Idee des Projekts ist groß: uns die Kraft von D3 geben, ohne alle gehen in die Details ...

+3

Das funktioniert gut. Sie müssen das Objekt nur an Ihren Diagrammtyp anpassen: 'chart.pie',' chart.bars', 'chart.lines'. – iamsar

+0

Dies ist sehr nützlich. Vielen Dank! – Nikhil

+3

Sehr frustrierend, dass die neueste Version (1.8.1) nicht mehr das Ereignis oder die Datenreihe zurückgibt, sondern nur den Balken (oder den Kreis), was ein großer Schwachpunkt ist, wenn Sie das 'd3.event' verwenden das Element und style es, zB die Farbe des Balkens ändern. Siehe https://github.com/novus/nvd3/blob/v1.8.1/build/nv.d3.js#L4946 vs. https://github.com/novus/nvd3/blob/v1.7.1/build/ nv.d3.js # L3745 –

0
$('.nv-pie .nv-pie .nv-slice').click(function(){ 
    temp = $(this).text(); 
    alert(temp); 
}) 

Dies würde für das Kreisdiagramm gut funktionieren, geht u kann in ähnlicher Weise vor für zu anderen Charts ....

1

AngularJS Wenn verwenden, verwenden Sie diesen Code in Ihrem app.js.

$scope.$on('elementClick.directive', function(angularEvent, event){ 
    console.log(event); 
}); 
0

Für gestapelte Flächendiagramm, sollten Sie interactiveGuideline deaktivieren und elementClick.area verwenden:

chart.useInteractiveGuideline(false); 

chart.stacked.scatter.dispatch.on("elementClick.area", function(e) { 
    console.log(e); 
}); 
1

This coderwall blog Köpfe uns die richtige Richtung.

chr.scatter.dispatch.on('elementClick', function(event) { console.log(event); });

4

Hier gibt es drei wichtige Punkte.

1) Keine Dokumentation bedeutet, dass Sie durch den Quellcode gehen müssen.

2) Alle Graphen haben einen Tooltip, was bedeutet, dass Ereignisse bereits im Quellcode ablaufen.

3) Verwenden Sie das Konfigurationsobjekt (in der Dokumentation) als Straßenkarte des Quellcodes.

dh.

var config = {chart: {type: 'multiChart',xAxis:{},yAxis{}} 

öffnen nvd3/nv.d3.js Datei

STRG + F + der Diagrammtyp. In diesem Fall ist es "MultiChart".

Sie werden nv.models.multiChart sehen.

Scrollen Sie nach unten, um die Tooltip-Ereignisse zu finden, und Sie finden die benötigte Dokumentation.

lines1.dispatch.on('elementMouseout.tooltip', function(evt) {tooltip.hidden(true) }); 
stack1.dispatch.on('elementMouseout.tooltip', function(evt) {tooltip.hidden(true) }); 
bars1.dispatch.on('elementMouseout.tooltip', function(evt) {tooltip.hidden(true) }); 

daher Ihre eigene Veranstaltung zu schreiben ...

var config = {chart: {type: 'multiChart', 
       bars1: { 
       dispatch:{ 
        elementClick:function(e){//do Stuff} 
       }, 
       xAxis:{},yAxis{} 
       } 
Verwandte Themen