你的想法很好,但正如Robert Longson指出的,你不能用id
來鏈接兩個相關的對象, id
必須是唯一的整個網頁。
你可以,但是,添加任何你想你的數據元素(除了id
等),最好用啓動"data-"
屬性名稱屬性,然後用CSS attribute selector找到具有相同屬性的其他元素。就像這樣:
//when you create the rectangles:
rect.attr("data-id", function(d) {
return d.id;/* or however you figure out this id */
});
//Your event handler
svg.selectAll("rect")
.on("mouseover", function(d) {
var thisid = d3.select(this).attr("data-id")
svg.selectAll("svg rect[data-id='" + thisid + "']")
//note the single quotes inside double quotes
//the final selector should look like "svg rect[data-id='23']"
.attr("fill", "red");
});
唯一的缺點是,像他們與類名和IDS做的瀏覽器不索引以便快速訪問所有屬性,所以它可能是緩慢的,如果你有大量的矩形和鼠標懸停的他們迅速。使用課程可以使選擇更快,但如果您有多個課程,則會增加複雜性 - 您無法通過致電.attr("class")
訪問您感興趣的一個課程價值。但是,您可以重新訪問您正在使用的數據變量來首先定義data-id
。像這樣:
//when you create the rectangles:
rect.attr("data-id", function(d) {
return "data-rectangle " + /* any other classes you are adding, + */
"data-id-" + d.id;/* or however you figure out this id */
});
//Your event handler
svg.selectAll("rect")
.on("mouseover", function(d) {
var thisid = d.id; /* or however you figure out this id */
//d3 automatically passed the element's data object to your event handler
svg.selectAll("svg rect.data-id-" + thisid)
//the final selector should look like "svg rect.data-id-23"
.attr("fill", "red");
});
爲什麼不使用選擇器類而不是選擇器ID? – FernOfTheAndes
如果你有多個元素具有相同的ID,那麼是的,你犯了一個根本性的錯誤,因爲你的文件是無效的。 –
也許我應該使用選擇器類。我會離開去了解他們。雖然我不確定你的意思是無效的嗎?它的工作原理,只是有點冗長。 –