2015-05-28 22 views
1

我已經編寫了一些強調(通過增加筆畫寬度/筆觸顏色變化)節點可視化(某些圓圈,某些rects)和相關鏈接/當用戶在節點上「停下來」的節點。當用戶將鼠標懸起時,高光消失。這一切都工作正常,除非當點擊狀態的節點被拖離svg空間(技術上我已經將可視化約束到svg空間,但顯然鼠標點不受約束)並被釋放。當鼠標按鈕被釋放時,突出顯示然後不會消失。d3突出顯示mouseover上的節點會導致鼠標脫離svg空間時的意外行爲

jsfiddle here - http://jsfiddle.net/hiwilson1/bga0wcLL/

我選擇以實現突出顯示的方法,是操縱與所點擊的可視化節點相關聯的基礎對象,然後更新可視化,這是所有照顧在以下onmousedown事件/ onmouseup事件功能:

function highlight(d) { 

    if (event.type == "mousedown") { 
     d.highlight = 1; 
     d.associatedLinks.forEach(function(link, i) { 
      link.highlight = 1; 
      link.source.highlight = 1; 
      link.target.highlight = 1; 
     }) 
    } 
    else { 
     d.highlight = 0; 
     d.associatedLinks.forEach(function(link, i) { 
      link.highlight = 0; 
      link.source.highlight = 0; 
      link.target.highlight = 0; 
     }) 
    } 

    svg.selectAll(".node .shape") 
     .attr("stroke", function(d) { if (d.highlight == 1) { return "Black"}}) 
     .attr("stroke-width", function(d) { return (d.highlight == 1) ? 3 : 1 });   

    svg.selectAll(".link") 
     .attr("stroke", function(d) { return (d.highlight == 1) ? "Black" : "Grey" }) 
     .attr("stroke-width", function(d) { return (d.highlight == 1) ? 3 : 1 }); 
} 
+0

我是對的假設要停止當你的邊界區域以外的所有拖動功能?只是不確定你想看到什麼。 – Pogrindis

+0

對不起,我可能沒有解釋清楚。目前,如果用戶在svg空間外釋放鼠標按鈕,則節點/鏈接保持其突出顯示的狀態(粗黑邊)。我想要的行爲是,mouseup會將節點/鏈接恢復爲未加亮的狀態,而不管用戶釋放鼠標按鈕的位置。 – hwilson1

回答

1

您可以收聽mousemove事件並在此後進行假設。在highlight函數中,您將設置值爲lastHighlightedNode

例如,

lastHighlightedNode = null; 
var svg = d3.select("body").append("svg") 
    .attr("width", w) 
    .attr("height", h); 

d3.select("body").on('mousemove', function() { 
    if ((d3.mouse(document.getElementsByTagName('svg')[0])[0] == 0 || d3.mouse(document.getElementsByTagName('svg')[0])[1] == 0) && lastHighlightedNode != null) { 
     highlight(lastHighlightedNode); 
    }; 
}); 


..... 



    function highlight(d) { 
     lastHighlightedNode = d; 

.... 

演示:http://jsfiddle.net/bga0wcLL/1/

+0

那個小提琴沒有做我想找的東西。本質上,我希望mousedown事件觸發屏幕上的任何地方。就像這裏的例子一樣(儘管我看不到作者在代碼中的位置) - http://bl.ocks.org/eyaler/10586116。在這裏,如果您在節點上拖動光標,請將光標從svg空間拖出,然後釋放,高亮效果將根據需要取消。但在我的例子中,它仍然存在。 – hwilson1

+0

其實我不知道作者做了什麼。 mouseup事件在窗口上,並且一個變量用於控制是否在前一個mousedown上按下了一個節點。謝謝。 – hwilson1

+0

是的,同樣的原則。 –

相關問題