Когда mouseup
происходит, синяя линия, которую вы рисуете, находится прямо под мышью, и это предотвращает захват события прямоугольником.
Решение довольно простое, просто установите pointer-events: none
на этострока:
line.attr("pointer-events", "none");
Вот ваш код только с этим изменением:
var line;
var vis = d3.select("#chart").append("svg")
.attr('id', 'xabcd')
.attr('width', 1000)
.attr('height', 1000)
d3.select("#xabcd")
.append('rect')
.attr('width', 1000)
.attr('height', 1000)
.on("mousedown", mousedown)
.on("mouseup", mouseup);
d3.select('#xabcd')
.style('fill', 'none')
.style('pointer-events', 'all');
var what = d3.select("#xabcd");
function mousedown() {
console.log("down");
var m = d3.mouse(this);
line = vis.append("line")
.attr("x1", m[0])
.attr("y1", m[1])
.attr("x2", m[0])
.attr("y2", m[1])
.attr("pointer-events", "none");
what.on("mousemove", mousemove);
}
function mousemove() {
console.log("moving");
var m = d3.mouse(this);
line.attr("x2", m[0])
.attr("y2", m[1]);
}
function mouseup() {
console.log("up");
what.on("mousemove", null);
}
.as-console-wrapper {
height: 20%;
}
svg {
border: 1px solid grey;
}
line {
stroke: steelblue;
stroke-width: 2px;
stroke-linecap: round;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.17/d3.min.js"></script>
<div id="chart"></div>