2016-03-31 4 views
6

Ich habe mehrere "Event" -Klassen, die einige meiner SVG-Elemente abdecken. Ich gebe jeder Klasse einen Ereignishandler für mouseover und mouseout, und wenn ein Element mehr als eine Klasse hat, möchte ich beide Handler auslösen. Wie mache ich das? Es scheint, dass, wenn ichEinem Element mehr als einen Event-Handler geben, indem man es mit verschiedenen Selektoren auswählt

d3.selectAll(".a-class") 
    .on("mouseover", function() { 
     // do A 
    }) 
    .etc(); 

d3.selectAll(".another-class") 
    .on("mouseover", function() { 
     // do B 
    }) 
    .etc(); 

dann, wenn ich über ein Element schweben, die beiden Klassen haben, nur B (den zweiten Handler) Feuer, offenbar, weil es die ersten außer Kraft setzt. Gibt es eine Methode, um einen Event-Handler "anzuhängen", anstatt ihn neu zu definieren?

Antwort

6

Gemäß den documentation ...

Wenn ein Ereignis-Listener bereits für die gleiche Art auf dem ausgewählte Elemente registriert wurde, werden die bestehenden Zuhörer, bevor der neue Hörer hinzugefügt wird entfernt. Um mehrere Listener für denselben Ereignistyp zu registrieren, kann auf den Typ ein optionaler Namespace folgen, z. B. "click.foo" und "click.bar".

Sie können also erreichen, was Sie wollen, indem Sie jedem Ihrer Handler einen beliebigen Namespace hinzufügen.

d3.selectAll(".a-class") 
    .on("mouseover.a", function() { 
     // do A 
    }) 
    .etc(); 

d3.selectAll(".another-class") 
    .on("mouseover.b", function() { 
     // do B 
    }) 
    .etc(); 

Dies hat den zusätzlichen Vorteil, dass man dann später explizit auf die Event-Handler hinzugefügt beziehen kann (entweder einzeln oder für einen gesamten Namensraum) zu ersetzen oder sie zu entfernen.

+0

Bin ich richtig in der Annahme, dass der Handler 'A' in Anbetracht Ihres Codes zuerst ausgelöst wird? – Bluefire

+0

Ich glaube schon, obwohl ich nicht sicher bin, dass es unbedingt garantiert ist –

Verwandte Themen