2014-02-05 30 views
0

道歉新手的問題,但我嘗試做以下使用D3:D3 - 返回一個錶行原來的bgcolor鼠標移開時

1)呈現交替行的灰色和白色(斑馬風格) 2 )突出顯示mouseover事件上的行 3)在鼠標移出時將行返回到其原始狀態

我已經通過以下代碼完成了該操作,該操作可以很好地工作,除了在mouseout上將行返回到原始顏色。相反,它只是使鼠標移開時每行作爲#c4c4c4

var rows = tbody.selectAll("tr") 
    data(states) 
    .enter() 
    .append("tr") 
    .style("background-color", function(d, i) { 
     if (i%2===0){return "#fff";}else{return "#c4c4c4";} 
     }); 


var rows = tbody.selectAll("tr") 
    .on("mouseover", function(){ 
     d3.select(this).style("background-color", "yellow");}) 
    .on("mouseout", function(){ 
     d3.select(this).style("background-color", function(d,i) { 
      if (i % 2 === 0){ 
       return "#fff"; 
      } 
      else { 
       return "#c4c4c4"; 
      } 
     } 
    )} 

回答

1

的問題是,當你重新選擇this元素,成爲從中i指數爲內(風格)回調確定的選擇功能。你想從mouseout事件處理函數的i指數:

.on("mouseout", function(d,i){ //correct index is passed here! 

    d3.select(this).style("background-color", function(d2,j) { 
          //d2 will be the same as d, but j will always be 0 
          //since d3.select(this) only has one element 
     if (i % 2 === 0){ 
      return "#fff"; 
     } 
     else { 
      return "#c4c4c4"; 
     } 
    }) 
}); 

你並不真的需要聲明的參數d2j,因爲他們從來沒有使用過 - 我只是包括他們清晰。

順便說一句,你可以做這兩種效應與CSS:

tr:nth-of-type(2n) { /* even rows */ 
    background-color: #c4c4c4; 
} 
tr:nth-of-type(2n+1) { /* odd rows */ 
    background-color: #fff; 
} 
tr:hover { /* mouseover */ 
    background-color: yellow; 
} 

注意,在CSS,元素從1開始編號,所以第一行被認爲是一個奇數行。

+0

這非常有幫助,謝謝。現在如何使鼠標懸停的表格突出顯示的相關ROW和COLUMN?如果可能的話,我的挑戰是使用d3.js完成它。回到繪圖板... – user3277435

+0

要找到列,你可以在表格頂部創建''元素,並設置它們的背景顏色,或者使用'td:nth-​​of-type()語法來選擇一行中給定索引處的所有表格單元格。不幸的是,它看起來不像你可以用CSS來做到這一點,因爲''羣組從不會觸發':hover'效果:http://fiddle.jshell.net/WV4wG/但是你可以在鼠標懸停功能,並使用d3選擇正確的單元格或列。請記住,您必須添加1才能從Javascript(基於0)的索引切換到CSS(基於1的)索引。 – AmeliaBR

+0

在事件處理函數中將CSS'n-type-type'選擇符與d3索引值組合使用的示例:http://stackoverflow.com/a/21470867/3128209 – AmeliaBR

相關問題