There is an idiomatic way of doing this in D3: just use the less famous third argument:
selection.on("mouseenter", (d, i, nodes) => {
d3.select(nodes[i]);
});
And that's the same of:
selection.on("mouseenter", function() {
d3.select(this);
});
I wrote an example here: d3 v4 retrieve drag DOM target from drag callback when `this` is not available
Here is a demo:
d3.selectAll("circle").on("mouseover", (d, i, p) => {
d3.select(p[i]).attr("fill", "maroon")
})
.on("mouseout", (d, i, p) => {
d3.select(p[i]).attr("fill", "seagreen")
});
<script src="https://d3js.org/d3.v4.min.js"></script>
<svg>
<circle cx="50" cy="50" r="20" fill="seagreen"></circle>
<circle cx="125" cy="50" r="20" fill="seagreen"></circle>
<circle cx="200" cy="50" r="20" fill="seagreen"></circle>
</svg>
Actually, if you look at the end of the article you linked, he gives the same solution.
Your proposed solution, d3.event.target
, despite working for event listeners, does not work in several situations. For instance:
d3.selectAll("circle").each(()=>d3.select(d3.event.target).attr("fill", "red"))
<script src="https://d3js.org/d3.v4.min.js"></script>
<svg>
<circle cx="50" cy="50" r="20" fill="seagreen"></circle>
<circle cx="125" cy="50" r="20" fill="seagreen"></circle>
<circle cx="200" cy="50" r="20" fill="seagreen"></circle>
</svg>
But the same code works using the third argument:
d3.selectAll("circle").each((d,i,p)=>d3.select(p[i]).attr("fill", "red"))
<script src="https://d3js.org/d3.v4.min.js"></script>
<svg>
<circle cx="50" cy="50" r="20" fill="seagreen"></circle>
<circle cx="125" cy="50" r="20" fill="seagreen"></circle>
<circle cx="200" cy="50" r="20" fill="seagreen"></circle>
</svg>