您可以使用d3.dispatch
來設置一些自定義事件處理。有時將不同的行爲與其他佈局代碼分離開來有助於保持組織結構的有序性。
您可能需要一個函數來忽略所有可點擊的圓圈,而另一個函數可以使單個圓圈變換。然後當單擊svg時,可以根據是否單擊圓圈來決定是否取消全部亮點。
換句話說...
當圈被點擊,撥動它。
當svg文件被點擊,並且點擊不在一個圓圈上時,忽略所有圓圈。
然後,您可以爲這兩個過程設置單獨的調度事件。這很好,因爲這些都成爲可重複使用的行爲。例如,如果您稍後想要添加一個按鈕來忽略所有圓圈,或者想要在被遮蓋時突出顯示一個圓圈,則可以調用相同的調度函數。
var dispatch = d3.dispatch('unhighlightAll','toggleSingle')
// remove the `highlighted` class on all circles
.on('unhighlightAll', function() {
d3.selectAll('.clickable-circle').classed('highlighted', false);
})
// toggle the `highlighted` class on element `el`
.on('toggleSingle', function(el) {
d3.select(el).classed('highlighted', function() {
return !d3.select(el).classed('highlighted');
});
});
最後,你從你的點擊處理器調用調度功能:
svg.on('click', function() {
// do nothing if a clickable circle is clicked
if (d3.select(d3.event.target).classed('clickable-circle')) {
return;
} else {
// otherwise unhighlight all circles
dispatch.unhighlightAll();
}
});
circles.on('click', function() {
dispatch.toggleSingle(this);
});
然後,所有剩下的就是決定如何顯示highlighted
類,並處理在你的CSS。
這裏有一個演示JSBin
- 編輯 -
我才意識到,既然你想模仿鼠標移開,你可能不希望多選。你只需要改變toggleSingle
功能位:
dispatch.on('toggleSingle', function(el) {
// store state of current element
var highlighted = d3.select(el).classed('highlighted');
// unhighlight all
dispatch.unhighlightAll();
// set opposite of stored state
d3.select(el).classed('highlighted', !highlighted);
});
而這裏的更新JSBin。
您可以爲突出顯示的元素指定一個特殊的類,並在點擊時先選擇該類的所有元素並刪除突出顯示。 –