2013-07-02 115 views
2

我具有類似於下面的SVG結構:d3js鼠標移動事件不冒泡

<svg> 
    <g id="main-group"> 
    ... 
     <rect id="event-rect"></rect> 
    </g> 
</svg> 

和我已附加相同的事件到#事件RECT和#主族

d3.select('#event-rect').on('mousemove', clb); 
d3.select('#main-group').on('mousemove', clb2); 

這裏的問題是第一個clb被觸發,而父節點(即#main-group)的事件偵聽器不是。

爲什麼事件冒泡階段不在這裏工作?

使用實際的代碼是:

d3.select('#event-rect').on('mousedown', mousedown); 
d3.select('#event-rect').on('mousemove', mousemove); 
d3.select('#event-rect').on('mouseup', mouseup); 

然後在另一個模塊附上同一組中的事件:

d3.select('#main-group').on('mousedown', dragStart); 
d3.select('#main-group').on('mousemove', mousemove); 
d3.select('#main-group').on('mouseup', dragEnd); 

所有的回調被調用,除了在dragstart。我對我沒有任何意義

回答

2

如果元素的尺寸相同,則g元素將被rect遮蔽。取決於你想要做什麼,有幾個選項。

  • 你可以增加,使得當鼠標剛剛離開rect該事件被觸發g元素的大小。
  • 您可以完全刪除g元素的偵聽器,並在rect的處理程序中執行其操作。
  • 同樣,您可以從rect元素中刪除偵聽器,並處理g元素的偵聽器中的所有內容。
+0

是的,但事件冒泡怎麼樣。不應該將mousemove事件提升到其父節點?我認爲這就是普通的dom元素如何行動 – ppoliani

+0

啊,是的,對不起,我誤解了你的問題。這對我來說工作正常 - 你可以發佈完整的代碼嗎? –

+0

對不起,我犯了一個錯誤。我對'mousedown'事件有問題。 mousemove事件也爲我冒泡。 – ppoliani