2013-07-05 8 views
8

Ho un insieme di elementi nidificati (SVG). L'elemento radice è il grafico e i bambini sono elementi nel grafico (linee, assi, ecc.). esempio semplificato:L'evento d3.on ("mouseover") non funziona con elementi SVG nidificati

<g transform="translate(80,10)" id="mainGraph"> 
    <g class="Line"> 
     <path d="....."></path> 
    </g> 
</g> 

Il mio problema è che se mi legano un passaggio del mouse/evento MouseMove (con D3.on ("passaggio del mouse") per esempio) per l'elemento mainGraph, si innesca solo se mi muovo il mouse su una degli elementi del bambino.

Una delle cose che ho letto è che c'è la priorità degli elementi successivi, quindi ho aggiunto .style ("pointer-events", "none") a tutti gli elementi figli, ma non ha funzionato.

risposta

8

Un approccio è quello di aggiungere un rettangolo riempire tutta la superficie come il primo elemento per la cattura di eventi del mouse che non rientrano nel campo di elementi aggiunti in seguito:

something.append('svg:rect') 
    .attr('width', width) // the whole width of g/svg 
    .attr('height', height) // the whole heigh of g/svg 
    .attr('fill', 'none') 
    .attr('pointer-events', 'all') 
    .on('mouseover', function() { 
     // do something 
    }  
    }); 

Credo che il <g> elemento (mainGraph nel tuo esempio) è solo un contenitore, non una forma reale che può ricevere eventi del mouse.

Potrebbe essere possibile aggiungere il listener di eventi del mouse sull'elemento svg stesso, ma non penso che il <g> funzionerà.

+0

uso di 'G' dovrebbe funzionare se si imposta le dimensioni in modo esplicito. –

+3

Un elemento 'g' (a differenza di' div') è solo un contenitore informe, e quindi non ha dimensioni. Quindi, se vuoi che il mouseover si applichi a un'area rettangolare, dovrai specificare un contenuto rettangolare come questo 'rect'. Tuttavia, un perfezionamento utile sta usando fill: none e pointer-events: tutti gli stili. – mbostock

+0

@mbostock fa alcuna differenza se si usano gli eventi puntatore direttamente sull'elemento e se lo si imposta nelle sue proprietà CSS? Un elemento '' 'percorso''' all'interno di' '' g''' si comporta allo stesso modo? – amenadiel

1

Oltre all'utilizzo di un elemento rect, è necessario impostare una proprietà CSS come questa pointer-events: all; per gli eventi da attivare.

+0

Sì, impostare 'pointer-events' è la chiave, non importa se è nidificata o meno. Il valore predefinito consentirà di accettare solo eventi quando 'visiblePainted', vedere https://developer.mozilla.org/en-US/docs/Web/CSS/pointer-events. – Felix

0

Ho anche gli stessi problemi.
La soluzione è quella di aggiungere la proprietà CSS per elemento padre

pointer-events: stroke; 

o

pointer-events: visibleStroke;