Hinzufügen des ‘onclick’-Ereignisses zum D3-Diagrammhintergrund

Lesezeit: 3 Minuten

Ich habe ein D3-Histogrammdiagramm, auf dem ich ein ‘onclick’-Ereignis an die Balken angehängt habe:

...
var bar = svg.selectAll(".bar")
        .data(data)
        .enter().append("g")
        .attr("class", "bar")
        .attr("transform", function(d) { return "translate(" + x(d.x) + "," + y(d.y) + ")"; })
        .on('mouseover', tip.show)
        .on('mouseout', tip.hide)
        .on('click', function(d,i){ //do stuff  });
...

Das funktioniert genau wie erwartet. Ich würde auch gerne ein ‘onclick’-Ereignis an den Hintergrund des Diagramms anhängen (dh überall im Diagramm, das kein Balken ist), aber ich habe Probleme damit. Ich habe versucht, das Ereignis auf verschiedene Arten anzuhängen, aber in jedem Fall scheint dieses neue Ereignis meinen Balkenklick zu überschreiben:

Einige Versuche:

$("svg:not('.bar')").on("click", function(){ //do stuff });

$("g:not('.bar')").on("click", function(){ //do stuff });

var svg = d3.select("#histogram_block").append("svg")
        .attr("width", width + margin.left + margin.right)
        .attr("height", height + margin.top + margin.bottom)
        .append("g")
        .attr("transform", "translate(" + margin.left + "," + margin.top + ")")
        .on("click", function(d,i){
            if (d) { //do stuff}
            else { //do stuff }
        };

Ich gehe davon aus, dass es eine Möglichkeit gibt, den Event-Handler dem SVG-Objekt hinzuzufügen, wenn es initialisiert wird, aber ich weiß nicht, wie ich das richtig machen soll.

  • Nur eine Erinnerung. $("svg:not('.bar')") bedeutet alles bekommen svgs, die nicht haben bar Klasse. Es bedeutet nicht, die zu bekommen svgs Abschnitt außerhalb der Elemente mit bar Klasse.

    – Batu. Khan

    8. April 2014 um 15:54 Uhr


Das Ereignis wird nicht wirklich überschrieben, aber beide werden ausgelöst – die onclick Handler für das SVG und für die Leiste. Um dies zu verhindern, verwenden Sie die .stopPropagation() Methode (vgl die Dokumentation). Der Code sieht so aus:

rect.on("click", function() {
  console.log("rect");
  d3.event.stopPropagation();
});

Vollständiges Beispiel hier. Vergleichen Sie mit dem Verhalten beim Stoppen der Ausbreitung des Ereignisses hier.

  • Tolles Beispiel, danke. Sie sollten es der Antwort hinzufügen, da es so kurz ist. Was bestimmt also die Reihenfolge der Ereignisse, wenn ich klicke? Die Annahme hier scheint zu sein, dass das Klickereignis des Rechtecks ​​zuerst ausgelöst wird, aber wird das immer der Fall sein?

    – Woemler

    8. April 2014 um 16:17 Uhr

  • Events “sprudeln” das DOM. Das rect ist ein Kind der svgsodass das Ereignis an die weitergegeben wird svg. Deshalb .stopPropagation() funktioniert. Also ja, die rects Click-Handler sollte immer zuerst ausgelöst werden.

    – Lars Kotthoff

    8. April 2014 um 17:02 Uhr

  • Danke, aber was würde passieren, wenn es überlappende Diagrammelemente gäbe, beides Kinder des SVG? Wer würde sein Click-Event zuerst auslösen?

    – Woemler

    8. April 2014 um 17:05 Uhr

  • Sie können nur auf ein Element klicken – dasjenige, das an der Mausposition vorne ist. Dieses Ereignis sprudelt bis zu den Eltern, Geschwister sind nicht betroffen.

    – Lars Kotthoff

    8. April 2014 um 17:06 Uhr

  • Ich habe diese Lösung auf mein ähnliches Problem angewendet. Aber das svg-Ereignis wird nur manchmal ausgelöst. Das Balken-Onclick-Ereignis funktioniert immer gut, aber das Hintergrund-On-Click-Ereignis wird nur einige Male mit zufälliger Häufigkeit ausgelöst. Irgendeine Idee, warum es sich so verhalten würde?

    – Benutzer2128

    18. Februar 2018 um 2:08 Uhr

Benutzer-Avatar
DeBraid

In diesem Beispiel (Zeile 246: http://tributary.io/inlet/8361294) Ich hänge ein neues Rect an, dessen Breite und Höhe dem gesamten Diagrammbereich entsprechen, und hänge dann meine Maus- (oder Klick-) Ereignisse an.

svg.append("rect")
        .attr({"class": "overlay" , "width": width , "height": height})
        .on({
          "mouseover": function() { /* do stuff */ },
          "mouseout":  function() { /* do stuff */ }, 
          "click":  function() { /* do stuff */ }, 
        });

  • Dies scheint die Frage nicht zu beantworten, da dies nicht auf das Hintergrund- vs. Vordergrundelement eines Diagramms klickt.

    – rjurney

    27. Januar 2016 um 2:57 Uhr

1282360cookie-checkHinzufügen des ‘onclick’-Ereignisses zum D3-Diagrammhintergrund

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy